Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Linux/Unix ::  c++ Speicher nach einem Wert durchsuchen .     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Cho++
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 188
Beitrag Cho++ Mitglied 01:04:18 08.01.2012   Titel:   c++ Speicher nach einem Wert durchsuchen .            Zitieren

Hallo,
Ich habe heute mal versucht.
C/C++ Code:
int i=1;
int *p = &i;
while(true)
    p++;
cout<<*p<<endl;
C/C++ Code:
int i=1;
int *p = &i;
while(true)
p++;
cout<<*p<<endl;
C/C++ Code:
int i=1;
int *p = &i;
while(true)
    p++;
cout<<*p<<endl;

Da werden die Werte veraendert da kamm bei mir die Idee ob ich vill. so
nach Werten suchen kann .

PS: In diesem Code können tausende fehler sein war nur eine kurze endeckung.

_________________
no risk no fun!
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 4836
Beitrag cooky451 Mitglied 01:14:25 08.01.2012   Titel:              Zitieren

Du kommst zwar nie zu einer Ausgabe, weil du einfach p immer weiter erhöhst ohne etwas damit zu machen, aber theoretisch könnte man den Speicher so anzeigen lassen, ja:
C/C++ Code:
int main()
{
  for (int *p = 0; /* oO */; ++p)
  {
    std::cout << p << ": " << *p << '\n';
  }
}
C/C++ Code:
int main()
{
for (int *p = 0; /* oO */; ++p)
{
std::cout << p << ": " << *p << '\n';
}
}
C/C++ Code:
int main()
{
  for (int *p = 0; /* oO */; ++p)
  {
    std::cout << p << ": " << *p << '\n';
  }
}

Aber so wird das leider nicht funktionieren. Denn dein läuft Programm normalerweise in einem Betriebssystem, das nicht nur Speicherzugriffe kontrolliert, sondern deinem Programm auch noch virtuellen Speicher zuordnet. Nein, keine Chance. Wenn du Speicher von anderen Programmen auslesen möchtest, musst du Betriebssystemfunktionen nutzen. Unter Windows z.B. ReadProcessMemory.

[Auf reiner C++ Ebene ist das Verhalten beim Zugriff auf solche Adressen wohl einfach nicht definiert.]

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™


Zuletzt bearbeitet von cooky451 am 01:17:16 08.01.2012, insgesamt 3-mal bearbeitet
Michael E.
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.10.2003
Beiträge: 5323
Beitrag Michael E. Mitglied 01:14:51 08.01.2012   Titel:   Re: c++ Speicher nach einem Wert durchsuchen .            Zitieren

[quote="AirTrake"PS]: In diesem Code können tausende fehler sein war nur eine kurze endeckung.[/quote]
Der Code ist so falsch, dass ich nicht verstehe, was du mir sagen willst. Durch die Endlosschleife hat dein Programm undefiniertes Verhalten. Selbst wenn du nach x Iterationen stoppen würdest, könntest du einfach *(p + x) statt der Schleife schreiben und würdest damit nur ein paar Bytes vom Stack ausgeben.

_________________
Your password must be at least 18770 characters and cannot repeat any of your previous 30689 passwords. Please type a different password. Type a password that meets these requirements in both text boxes. (http://support.microsoft.com/kb/276304/en-us/)


Zuletzt bearbeitet von Michael E. am 01:15:56 08.01.2012, insgesamt 1-mal bearbeitet
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 13604
Beitrag SeppJ Moderator 01:15:45 08.01.2012   Titel:              Zitieren

Prinzipiell kannst du das machen. Was dann passiert ist streng genommen undefiniert. In der Praxis kannste so tatsächlich Werte such (aber wozu? Es ist dein Programm, du kennst die Werte), wirst aber sicherlich ziemlich bald auf ungemapte Speicherseiten deines Programms stoßen (was zum Absturz führt), wenn du nicht ohnehin schon weißt, wo du ungefähr suchen musst.
Cho++
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 188
Beitrag Cho++ Mitglied 01:25:16 08.01.2012   Titel:              Zitieren

Also ich arbeite an einem Linux Betriebssystem.
Also Lügen würd nichts bringen des wegen sag ichs mal so.
Ich bin 15 Jahre alt und möchte halt sagen können das ich das kann
z.B bei einem anderen Programm die Werte veraendern. Nicht weil mich
so was intressiert sondern weil meine Freunde au 15 sind und die können
unter programmieren nichts anderes verstehen und fragen mich dan immer
so was.Und ich möchte ja sagen können :D Gibts eine Funktion unter Linux.

_________________
no risk no fun!
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 4836
Beitrag cooky451 Mitglied 01:28:30 08.01.2012   Titel:              Zitieren

AirTrake schrieb:
das ich das
Ein Deutschkurs würde sie vielleicht viel mehr beeindrucken.
http://www.linuxmanpages.com/man2/ptrace.2.php

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
Cho++
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 188
Beitrag Cho++ Mitglied 01:46:16 08.01.2012   Titel:              Zitieren

Mein Deutsch ist echt nicht gut. Da werde ich dir nicht
wiedersprechen können ...
Danke für dein Link

_________________
no risk no fun!
Cho++
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 188
Beitrag Cho++ Mitglied 01:56:22 08.01.2012   Titel:              Zitieren

#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);


Hmm ...
Code:
        int i=1;
        int *p=&i;
        int ha;
        ha = ptrace(PTRACE_POKETEXT, 1000,p, NULL);
        printf("%d",ha);
Code:
int i=1;
int *p=&i;
int ha;
ha = ptrace(PTRACE_POKETEXT, 1000,p, NULL);
printf("%d",ha);
Code:
        int i=1;
        int *p=&i;
        int ha;
        ha = ptrace(PTRACE_POKETEXT, 1000,p, NULL);
        printf("%d",ha);


So giebt er -1 aus.

_________________
no risk no fun!
C++ Forumbot
Forumbot

Benutzerprofil
Anmeldungsdatum: 29.02.2004
Beiträge: 16160
Beitrag C++ Forumbot Forumbot 02:18:34 08.01.2012   Titel:              Zitieren

Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x, bzw. C++11) in das Forum Linux/Unix verschoben.

Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?


Dieses Posting wurde automatisch erzeugt.

_________________
Besuchen Sie unsere Bücherecke.
http://www.c-plusplus.de/bucher.php
Mit jeder Bestellung unterstützen Sie das Forum.
Der aus dem Westen ...
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.12.2010
Beiträge: 1277
Beitrag Der aus dem Westen ... Mitglied 03:44:07 08.01.2012   Titel:              Zitieren

Zumindest sind wir ehrlich ... na gut, dann sage ich mal mein Gedicht auf.

Direkten Speicherzugriff gibt es nur in der System- und Treiberprogrammierung. Früher, in den Tagen von DOS und UNIX (obwohl, bei UNIX bin ich mir nicht sicher, bin mit MS-DOS aufgewachsen), da konnte ein Programm noch direkt auf die Speicherzellen im RAM zugreifen. Ging deshalb, weil DOS ein Single-Process-OS ist, bei dem immer nur eine Anwendung gleichzeitig laufen konnte. Und wenn diese sich in eine Endlosschleife verhing, musste man den Rechner neustarten.

Zwischendurch gab es auch merkwürdige Konstrukte wie Segmente, die man beim Zugriff beachten musste. Die Prozessoren unterstützten damals 16 Bit, 2^16 Bytes <=> 65536 Bytes = 64 Kilobytes, die man adressieren konnte, und mit der 20-Bit Technologie kammen noch mal 4 Bit dazu (also 1 MB Speicher, aufgeteilt in 64-Kilobyte-Segemente. FAR-(Zugriff außerhalb des eigenen Segmentes, 20 Bit) und NEAR-Zeiger (Zugriff auf eigenes Segment, 16 Bit) haben einige Programmierer in den Wahnsinn getrieben. :D

Dann kam die 32-Bit-Technologie, und die Multi-Threading-Technologie kam auf. Nun ja, was man so nennen will - Windows nannte das ganze "kooperatives Mutli-Threading", soll heißen, die Anwendung bestimmt, wann Prozessorzeit freigegeben wird und wann nicht. Damit konnte man tatsächlich eine gleichzeitige Ausführung simulieren, aber gegen Abstütze gefeit war das Ganze immer noch nicht. Außerdem kam es gerne vor, dass sich Programme gegenseitig in den Speicher schrieben, weil jedes dachte, dass es alleine im Speicher war. :o)

Und schließlich wurde die Virtuelle Adressverwaltung und preemptives Multi-Threading in das System eingefügt. Nicht mehr die Anwendung bestimmt, wo es Speicher erhält, sondern das OS/der Kernel. Wenn Anwendung abstützt, läuft das OS weiter. Kernel verwaltet Speicherzugriffe, wenn für Prozess an Adresse X kein Speicher reserviert wurde, Access Violation. Um das zu realisieren, hat man dem Programm einfach vorgegaukelt, es sei immer noch die einzige Anwendung im Speicher. Und diese Anwendung bekam aufgrund von 32-Bit-Technologie 2^32 Bytes = 4 Gigabytes an virtuellen Speicher, verjubeln konnte es den, wie es lustig war. Wenn man auf eine virtuelle Speicheradresse zugriff, schaut der Kernel für einen nach, ob für den Prozess und für die Adresse physikalischer Speicher reserviert ist, und erlaubt/verbietet den Zugriff. Das Schöne ist, dass mehrere Programme an ein und die selbe Stelle geladen werden können, da jeder Prozess über den selben Scope verfügt und nur der Kernel die tatsächliche Speicheradresse kennt, können 10 Dienste auf Adresse 0x10A0 2BE2 zugreifen und schreiben, ohne sich in die Quere zu komme.

Dein Programm befindet sich also in einer Art "virtuellen Maschine". Zugriff auf andere Prozesse sind so nicht möglich - dazu musst du entsprechende Routinen des OS aufrufen, die dann für dich nachschauen, ob für Prozess XY physikalischer Speicher reserviert wurde. Wenn du also Beispielsweise folgendes machst:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

int main()
{
    //Erste valide Stelle des Speichers.
    unsigned int*Pointer(1);

    //Speicher auslesen
    while(1!=0xFFFFFFFF)
    {
        std::cout<<"Speicheradresse "<<std::hex<<Pointer++<<" hat den Wert "<<std::dec<<*Pointer<<"\n";
    }
    std::cin.get();
    return 0;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

int main()
{
//Erste valide Stelle des Speichers.
unsigned int*Pointer(1);

//Speicher auslesen
while(1!=0xFFFFFFFF)
{
std::cout<<"Speicheradresse "<<std::hex<<Pointer++<<" hat den Wert "<<std::dec<<*Pointer<<"\n";
}
std::cin.get();
return 0;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

int main()
{
    //Erste valide Stelle des Speichers.
    unsigned int*Pointer(1);

    //Speicher auslesen
    while(1!=0xFFFFFFFF)
    {
        std::cout<<"Speicheradresse "<<std::hex<<Pointer++<<" hat den Wert "<<std::dec<<*Pointer<<"\n";
    }
    std::cin.get();
    return 0;
}


bekommst du unter Garantie einen Speicherzugriffsfehler. Denn nicht du bestimmst, ob die virtuelle Adresse 0x10A0 2BE2 mit physikalischem Speicher verknüpft wurde, sondern das OS.


Zuletzt bearbeitet von Der aus dem Westen ... am 05:49:11 08.01.2012, insgesamt 1-mal bearbeitet
seldon
Unregistrierter




Beitrag seldon Unregistrierter 05:16:48 08.01.2012   Titel:              Zitieren

AirTrake schrieb:

C/C++ Code:
        int i=1;
        int *p=&i;
        int ha;
        ha = ptrace(PTRACE_POKETEXT, 1000,p, NULL);
        printf("%d",ha);
C/C++ Code:
int i=1;
int *p=&i;
int ha;
ha = ptrace(PTRACE_POKETEXT, 1000,p, NULL);
printf("%d",ha);
C/C++ Code:
        int i=1;
        int *p=&i;
        int ha;
        ha = ptrace(PTRACE_POKETEXT, 1000,p, NULL);
        printf("%d",ha);


So giebt er -1 aus.

Das ist wenig verwunderlich.
C/C++ Code:
ha = ptrace(PTRACE_POKETEXT, 1000, p, NULL);
C/C++ Code:
ha = ptrace(PTRACE_POKETEXT, 1000, p, NULL);
C/C++ Code:
ha = ptrace(PTRACE_POKETEXT, 1000, p, NULL);

bedeutet: Schreibe NULL an Speicherstelle p im virtuellen Adressraum des Prozesses mit PID 1000. Ich weiß jetzt nicht, ob und ggf. welcher Prozess bei dir die PID 1000 hatte, als das Programm lief, und ich hege die Vermutung, dass du es versäumt hast, dich vorher an diesen anzuhängen. Was ich aber weiß, ist, dass p aus dem eigenen Adressraum genommen ist und mit ziemlicher Sicherheit keine Entsprechung in Prozess 1000 hat.

Anschauungsbeispiel mit eigens erzeugtem Kindprozess:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <sys/ptrace.h>
#include
<sys/types.h>
#include
<sys/wait.h>
#include
<unistd.h>

#include
<stdio.h>

int main(void) {
  int p_toparent[2];
  pid_t pid;

  pipe(p_toparent);

  pid = fork();

  if(pid == 0) {
    /* Kindprozess */
    long n = 1000;
    long *p = &n;

    close(p_toparent[0]);

    write(p_toparent[1], &p, sizeof(p));

    /* "Synchronisation" - der Vaterprozess sollte nicht länger als eine Sekunde brauchen,
     * sich die Adresse aus der Pipe zu holen. In ernsthaften Anwendungsfällen wäre dieses
     * Vorgehen natürlich haarsträubend, aber die Arbeit, das vernünftig aufzuziehen, mache
     * ich mir hierfür nicht.
     */

    sleep(1);

    printf("C: %lx\n", n);
  } else {
    /* Elternprozess */
    long data = 0xdeadbeef; /* Der rüberzuschreibende Wert */
    long *n_child;

    close(p_toparent[1]);

    printf("P: %lx\n", data);

    /* Hier wird der Wert, den der Kindprozess in die Pipe geschrieben hat, in n_child
     * gelesen.
     * n_child ist danach die Adresse von n im virtuellen Adressraum des Kindprozesses,
     * nicht im eigenen! Dementsprechend kann n_child nicht direkt verwendet werden, sondern
     * dient lediglich als Argument für ptrace.
     */

    read(p_toparent[0], &n_child, sizeof(n_child));

    /* Dann kann man sich anhängen, darauf warten, dass das SIGSTOP bearbeitet wurde,
     * danach im Adressraum des Kindprozesses rumfuhrwerken und sich wieder abhängen.
     */

    ptrace(PTRACE_ATTACH, pid, 0, 0);
    wait(NULL);
    ptrace(PTRACE_POKEDATA, pid, n_child, data);
    ptrace(PTRACE_DETACH, pid, 0, 0);

    sleep(2);
  }

  return 0;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <sys/ptrace.h>
#include
<sys/types.h>
#include
<sys/wait.h>
#include
<unistd.h>

#include
<stdio.h>

int main(void) {
int p_toparent[2];
pid_t pid;

pipe(p_toparent);

pid = fork();

if(pid == 0) {
/* Kindprozess */
long n = 1000;
long *p = &n;

close(p_toparent[0]);

write(p_toparent[1], &p, sizeof(p));

/* "Synchronisation" - der Vaterprozess sollte nicht länger als eine Sekunde brauchen,
* sich die Adresse aus der Pipe zu holen. In ernsthaften Anwendungsfällen wäre dieses
* Vorgehen natürlich haarsträubend, aber die Arbeit, das vernünftig aufzuziehen, mache
* ich mir hierfür nicht.
*/

sleep(1);

printf("C: %lx\n", n);
} else {
/* Elternprozess */
long data = 0xdeadbeef; /* Der rüberzuschreibende Wert */
long *n_child;

close(p_toparent[1]);

printf("P: %lx\n", data);

/* Hier wird der Wert, den der Kindprozess in die Pipe geschrieben hat, in n_child
* gelesen.
* n_child ist danach die Adresse von n im virtuellen Adressraum des Kindprozesses,
* nicht im eigenen! Dementsprechend kann n_child nicht direkt verwendet werden, sondern
* dient lediglich als Argument für ptrace.
*/

read(p_toparent[0], &n_child, sizeof(n_child));

/* Dann kann man sich anhängen, darauf warten, dass das SIGSTOP bearbeitet wurde,
* danach im Adressraum des Kindprozesses rumfuhrwerken und sich wieder abhängen.
*/

ptrace(PTRACE_ATTACH, pid, 0, 0);
wait(NULL);
ptrace(PTRACE_POKEDATA, pid, n_child, data);
ptrace(PTRACE_DETACH, pid, 0, 0);

sleep(2);
}

return 0;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <sys/ptrace.h>
#include
<sys/types.h>
#include
<sys/wait.h>
#include
<unistd.h>

#include
<stdio.h>

int main(void) {
  int p_toparent[2];
  pid_t pid;

  pipe(p_toparent);

  pid = fork();

  if(pid == 0) {
    /* Kindprozess */
    long n = 1000;
    long *p = &n;

    close(p_toparent[0]);

    write(p_toparent[1], &p, sizeof(p));

    /* "Synchronisation" - der Vaterprozess sollte nicht länger als eine Sekunde brauchen,
     * sich die Adresse aus der Pipe zu holen. In ernsthaften Anwendungsfällen wäre dieses
     * Vorgehen natürlich haarsträubend, aber die Arbeit, das vernünftig aufzuziehen, mache
     * ich mir hierfür nicht.
     */

    sleep(1);

    printf("C: %lx\n", n);
  } else {
    /* Elternprozess */
    long data = 0xdeadbeef; /* Der rüberzuschreibende Wert */
    long *n_child;

    close(p_toparent[1]);

    printf("P: %lx\n", data);

    /* Hier wird der Wert, den der Kindprozess in die Pipe geschrieben hat, in n_child
     * gelesen.
     * n_child ist danach die Adresse von n im virtuellen Adressraum des Kindprozesses,
     * nicht im eigenen! Dementsprechend kann n_child nicht direkt verwendet werden, sondern
     * dient lediglich als Argument für ptrace.
     */

    read(p_toparent[0], &n_child, sizeof(n_child));

    /* Dann kann man sich anhängen, darauf warten, dass das SIGSTOP bearbeitet wurde,
     * danach im Adressraum des Kindprozesses rumfuhrwerken und sich wieder abhängen.
     */

    ptrace(PTRACE_ATTACH, pid, 0, 0);
    wait(NULL);
    ptrace(PTRACE_POKEDATA, pid, n_child, data);
    ptrace(PTRACE_DETACH, pid, 0, 0);

    sleep(2);
  }

  return 0;
}

Prinzipiell kann man sich auf die gleiche Weise an alle Prozesse anhängen, bei denen man die entsprechenden Rechte hat (als normaler Benutzer sind das im Zweifel die von dir selbst gestarteten); wenn der andere Prozess nicht darauf vorbereitet ist, ist es aber natürlich sehr viel schwieriger, interessante Stellen in dessen Adressraum herauszufinden.
Cho++
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 188
Beitrag Cho++ Mitglied 13:30:14 08.01.2012   Titel:              Zitieren

Naja ich lass es dann mal mit dem Zeug. :)
Muss mir jetzt wieder eine andere Idee überlegen ..

Danke für die Antworten :live:

_________________
no risk no fun!
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 22820
Beitrag rüdiger Moderator 13:35:00 08.01.2012   Titel:              Zitieren

/dev/mem
Ethon
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.01.2011
Beiträge: 1114
Beitrag Ethon Mitglied 14:50:13 08.01.2012   Titel:              Zitieren

Häng dich mit ptrace an den Prozess, parse /proc/[PID]/maps um die Liste von allen Speicherbereichen zu bekommen, lies alle Bereiche aus /proc/[PID]/mem und suche darin nach deinem Wert.


Zuletzt bearbeitet von Ethon am 14:50:38 08.01.2012, insgesamt 1-mal bearbeitet
mfq
Unregistrierter




Beitrag mfq Unregistrierter 11:57:00 16.01.2012   Titel:              Zitieren

Der aus dem Westen ... schrieb:
Direkten Speicherzugriff gibt es nur in der System- und Treiberprogrammierung. Früher, in den Tagen von DOS und UNIX (obwohl, bei UNIX bin ich mir nicht sicher, bin mit MS-DOS aufgewachsen), da konnte ein Programm noch direkt auf die Speicherzellen im RAM zugreifen.
Virtual Memory kam in der Unix-Welt Ende der 70er Jahre unter Berkeley Unix (müsste 3BSD auf der VAX gewesen sein).

Der Rest deines (übrigens äußerst wertvollem) Beitrag trifft in der Form auch nur auf x86-Systeme richtig zu (auch wenn die beschriebenen Techniken natürlich auch anderswo Verwendung finden), das sollte man vielleicht dazu sagen.

Zur Frage des Threadstarters noch:
Unter vielen Unix-Implementierungen (unter anderem eben auch unter Linux) gibt es (wie rüdiger bereits angedeutet hat) unter /dev/mem (siehe mem(4)) eine Gerätedatei, über die man (entsprechende Rechte vorausgesetzt) die Inhalte des physikalischen Speichers auslesen und durchaus auch ändern kann, wobei letzteres natürlich recht heikel ist. Zum Rumspielen durchaus interessant, es gibt aber nur sehr wenige Klassen von Programmen, in denen diese Funktionalität tatsächlich sinnvoll verwendet werden kann.
C/C++ Forum :: Linux/Unix ::  c++ Speicher nach einem Wert durchsuchen .   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.