Pointer auf Speicherbereich außerhalb des Progs



  • Hallo allen,

    ich wollte nur wissen, ob man auch Pointer auf Systembereiche (Speicherzellen ab 0 bis ???) oder auf Speicherzellen außerhalb des eigendlichen Programmes zeigen können.

    Habe dazu folgendes Programm geschrieben:
    (Zeigt die ersten paar Bytes an)

    void pointer(int *addr)
    {
    	printf("%c", *addr);
    }
    
    void main()
    {
       int *a=1;
       do
       {
          pointer(a);
          a++;
          fflush(stdin);
          Sleep(1000);
       }while(!kbhit());
    
       getch();
    }
    

    Meine Probleme:

    int *a=1 geht nicht!
    a++ auch nicht

    Kann mir wer helfen???

    Vielen Dank im Voraus



  • Memorydumps werden auch anders gemacht. Hier mal was von mir was ich vor langer zeit geschrieben habe. Es zeigt dir den speicher an der übergebenenn Adresse an:

    void dump_memory(void* data, size_t len)
    {
        unsigned char *start_data = (unsigned char *)data;
        unsigned char *end_data = (unsigned char *)data + len - 1;
        int start_address = (int)start_data & (~0x0F);
        int end_address = (int)end_data | 0x0F;
        unsigned char *address = (unsigned char *)start_address;
        int i, j;
    
        for(i = 0; &address[i] <= (unsigned char*)end_address; i += 16) {
            printf("%08X:", &address[i]);
            for(j = 0; j < 16; j++) {
                printf("%s%s%02X%s", &address[i+j] == start_data ? "[" : " ",
                                     &address[i+j-1] == end_data ? "\b" : "",
                                     address[i+j],
                                     &address[i+j] == end_data ? "]" : "");
            }
            printf("   ");
            for(j = 0; j < 16; j++) {
                printf("%c", isprint(address[i+j]) ? address[i+j] : '.');
            }
            printf("\n");
        }
    }
    

    Es sind viele casts drin usw. aber es machte was es sollte, wenn ich mich recht erinnere.

    EDIT: villeicht sollte ich das noch erklären ....
    Parameter sind die Adresse (void *data) und die Länge in Bytes die gedumpt werden soll. Dann ist start_data der Pointer auf den Anfang des Dumpbereichs und end_data das Ende. Unsigned char da wir byteweise den Speicher anzeigen lassen wollen. start_adress und end_adress benutze ich um mir jeweils die adressen von 0xxxxx0000 - 0xyyyy000f anzeigen zu lassen. Also ganze blöcke. Dann erfolgt die Ausgabe. "[" "]" bezeichnen jeweils den Anfang von data und ende und dient nur der Info, da der Dump ja mehr anzeigt. Ansonsten zeigt er dir den Speicher an so wie "debug" es tun würde, links Adresse, in der Mitte Speicherinhalt und rechts die ASCII Darstellung.

    PS: ob das gut oder schlecht programmiert war/ist kann ich dir jetzt nicht sagen. Vielleicht gehts auch einfacher sowas zu machen.



  • Hmmm...

    Bin nicht gerade der beste in Programmieren, kannst mir ein Beispiel sagen wie ich 1 Byte in eine char-Variable speichern kann, sagen wir von der Speicherzelle 2?

    Vielen Dank schon mal im Voraus



  • ...



  • curry-king schrieb:

    ...

    Versteh ich nicht 😉



  • Teste das mal so: in deiner Main machste sowas hier

    char buffer[] = "Dies ist ein Test dies ist ein test dies ist ein test";
    

    und rufst dann den dumper mit

    dump_memory(buffer, strlen(buffer))
    

    auf. Und schau was passiert.



  • VirusMaker schrieb:

    Bin nicht gerade der beste in Programmieren, kannst mir ein Beispiel sagen wie ich 1 Byte in eine char-Variable speichern kann, sagen wir von der Speicherzelle 2?

    Nein nicht mit dem Benutzernamen ... 😉



  • NDEBUG schrieb:

    Teste das mal so: in deiner Main machste sowas hier

    char buffer[] = "Dies ist ein Test dies ist ein test dies ist ein test";
    

    und rufst dann den dumper mit

    dump_memory(buffer, strlen(buffer))
    

    auf. Und schau was passiert.

    OK, ich bi echt beeindruckt!!!

    Nur wie mach ich jetzt das, das er das Anzeigt was (keine Variable) in Speicherzelle 2 steht???

    Also außerhalb des Progs...

    Ich kenn mich ja nicht sonderlich mit Pointers aus, aber mit denen solte es doch gehen...

    Aber wie mache ich einen Pointer auf 2 ??? 😕

    mit "int *a=2" gehts nicht

    hmmm, aber danke schon mal 👍

    EDIT:
    ne, will damit in spielen cheaten, aber zuerst muss ich mal wissen was drin steht, ich weiß es geht anders, aber naja, bin halt sehr stur 😉



  • VirusMaker schrieb:

    curry-king schrieb:

    ...

    Versteh ich nicht 😉

    Ich wollte eigentlich schreiben, das du innerhalb deines Programms nur auf Resourcen zugreifen kannst, die dir das OS zur Verfügung stellt. Das OS überwacht, das du nicht aus diesem Bereich ausbrichst. Dein Versuch oben stellt vermutlich eine Speicherzugriffsverletzung dar und endet mit einem segmentation fault.



  • curry-king schrieb:

    VirusMaker schrieb:

    curry-king schrieb:

    ...

    Versteh ich nicht 😉

    Ich wollte eigentlich schreiben, das du innerhalb deines Programms nur auf Resourcen zugreifen kannst, die dir das OS zur Verfügung stellt. Das OS überwacht, das du nicht aus diesem Bereich ausbrichst. Dein Versuch oben stellt vermutlich eine Speicherzugriffsverletzung dar und endet mit einem segmentation fault.

    wird wohl so sein, aber die ganzen trainer für spiele können das ja auch...

    jetzt wollte ich das mal selbst probieren, aber schaut nicht so aus, als ginge es 😞



  • VirusMaker schrieb:

    wird wohl so sein, aber die ganzen trainer für spiele können das ja auch...
    jetzt wollte ich das mal selbst probieren, aber schaut nicht so aus, als ginge es

    falls du windoofs benutzt, dann geht's damit: http://msdn.microsoft.com/en-us/library/ms681674(VS.85).aspx
    🙂



  • +fricky schrieb:

    VirusMaker schrieb:

    wird wohl so sein, aber die ganzen trainer für spiele können das ja auch...
    jetzt wollte ich das mal selbst probieren, aber schaut nicht so aus, als ginge es

    falls du windoofs benutzt, dann geht's damit: http://msdn.microsoft.com/en-us/library/ms681674(VS.85).aspx
    🙂

    Vielen Dank, ReadProcessMemory und WriteProcessMemory sind genau das was ich gesucht habe. 👍

    DANKE, kann geclosed werden.


Anmelden zum Antworten