11 Stimmen

Wie man mit C eine bestimmte Speicheradresse erhält

Für meine Bachelorarbeit möchte ich die Datenremanenz des Speichers visualisieren und wie sie nach dem Neustart eines Systems bestehen bleibt.

Ich hatte die einfache Idee, ein Bild im Speicher abzulegen, meinen Computer herunterzufahren, x Sekunden zu warten, den Computer hochzufahren und zu sehen, ob das Bild noch da ist.

int mmap\_lena(void)
{
    FILE \*fd = NULL;
    size\_t lena\_size;
    void \*addr = NULL;

    fd = fopen("lena.png", "r");

    fseek(fd, 0, SEEK\_END);
    lena\_size = ftell(fd);

    addr = mmap((void \*) 0x12345678, (size\_t) lena\_size, (int) PROT\_READ, (int) MAP\_SHARED, (int) fileno(fd), (off\_t) 0);
    fprintf(stdout, "Addr = %p\\n", addr);
    munmap((void \*) addr, (size\_t) lena\_size);
    fclose(fd);
    fclose(fd\_log);
    return EXIT\_SUCCESS;
}

Die Überprüfung der Rückgabewerte habe ich der Klarheit halber weggelassen.

Also nach der mmap ich versucht, irgendwie die Adresse zu erhalten, aber ich in der Regel am Ende mit einem Segmentation Fault als zu meinem Verständnis der Speicher durch mein Betriebssystem geschützt ist.

int fetch\_lena(void)
{
    FILE \*fd = NULL;
    FILE \*fd\_out = NULL;
    size\_t lenna\_size;
    FILE \*addr = (FILE \*) 0x12346000;

    fd = fopen("lena.png", "r");
    fd\_out = fopen("lena\_out.png", "rw");

    fseek(fd, 0, SEEK\_END);
    lenna\_size = ftell(fd);

    // Segfault 
    fwrite((FILE \*) addr, (size\_t) 1, (size\_t) lenna\_size, (FILE \*) fd\_out);

    fclose(fd);
    fclose(fd\_out);

    return 0;

}

Bitte beachten Sie auch, dass ich die Adressen in diesem Beispiel hart kodiert habe. Wenn Sie also mmap_lena ausführen, könnte der Wert, den ich in fetch_lena verwende, falsch sein, da das Betriebssystem den ersten Parameter von mmap nur als Hinweis nimmt (auf meinem System ist er immer irgendwie auf 0x12346000 voreingestellt).

Wenn es irgendeinen trivialen Kodierungsfehler gibt, tut es mir leid, da meine C-Kenntnisse noch nicht voll entwickelt sind.

Ich möchte jetzt, wenn es irgendeine Möglichkeit gibt, um die Daten zu erhalten, die ich will, ohne Implementierung von malloc Haken oder Speicher-Allokator-Hacks.

Vielen Dank im Voraus, David

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X