Speicherinhalte auslesen in C

martin

Well-Known Member
Hi

ich weiß nicht ob ich hier im richtigen Unterforum bin, aber ich möchte mein Wissen etwas auffrischen und das anhand eines C Programmes, also probiere ich es einfach mal hier.
Aber der Reihe nach...Ich möchte den Ganzen Speichervorgang von Dateien bzw. Variablen (in den RAM) etwas genauer verstehen. Mir ist nämlich diese Ganze Sache bzgl. Datenwiederherstellung sehr schleierhaft.
Egal... wie gesagt, um da den besseren Durchblick zu erhalten und gleichzeitig meine C-Kenntnisse etwas aufzufrischen, möchte ich gerne ein C-Programm schreiben. Beginnen möchte ich mit ganz was Einfachem, nämlich eine Variable zu deklarieren und anschließend herauszufinden, wo sich diese Variable im RAM befindet. Dies sollte eigentlich, soweit ich das halbwegs richtig verstanden habe, mit einem Pointer relativ einfach zu machen sein.

#include <stdio.h>
int main (void) {
int test = 2233;
printf("Zeiger:%p\n", &test);
return 0;
}

Allerdings bekomme ich damit natürlich "nur" die Startadresse raus, meine erste Frage ist deshalb, ob es eine Möglichkeit gibt, herauszufinden bis zu welcher Adresse die Variable den Speicher belegt?
Anschließend möchte ich versuchen einfache Daten aus dem Speicher rauszulesen. Ich hab mir das so vorgestellt, dass ich da evtl. Start und EndAdresse eingebe und mir dann alles dazwischen ausgeben lasse.
Ich habe das C-Programm zum "Auslesen" der StartAdresse mittels Pointer schon gemacht, beim Rest bin ich hoffnungslos überfordert.
Ich weiß, google ist mein Freund, aber habe das Ganze nicht aus Faulheit hier gepostet, sondern weil ich hoffe, dass mir jemand nicht einfach nur den Code herklatscht, sondern vielleicht auch eine kleine Erklärung geben kann.

Ist dieser erste Schritt mal geschafft, möchte ich das Ganze auf Dateninhalte auf der Festplatte ausweiten, aber dazu später.

ich bedanke mich schonmal im voraus...

Gruß
 
sizeof() aus der stdlib.h gibt Aufschluss darüber, wie viele Bytes ein bestimmter Typ belegt. Damit kannst Du den Offset selbst berechnen.
 
Hi Ogion

danke für die schnelle Antwort. Weißt du zufällig auch ne Funktion (falls es die gibt), die mir den Inhalt des Bytes an z.B. der Stelle 0xbffff8fc ausgibt?

thx
 
char *p = 0xbffff8fc;

Wenn dein Prozess die nötigen Rechte hat, kannst du das auslesen. Aber nicht einfach mit printf, du weißt ja nicht wann mal wieder eine 0 im Speicher auftaucht.
 
char *p = 0xbffff8fc;

Wenn dein Prozess die nötigen Rechte hat, kannst du das auslesen..

Nein, es ist ja nicht garantiert, dass diese Adresse ueberhaupt gemapped ist. Mal davon abgesehen kann man mit plain C nicht geziielt auf Adressen im physikalischen RAM (und das will der OP, wenn ich ihn richtig verstehe) zugreifen, solange man im Userspace rennt.
 
Auf einem Mikrokontroller, ohne Betriebssystem, würde so etwas zumindest funktionieren.
 
danke an alle. Ich glaube also herausgehört zu haben, dass das nicht so ohne weiteres möglich ist (wenn ich nicht auf einem Mikrokontroller arbeite). Soweit so gut, das Ganze war auch nur so am Rande ne Frage die mich lange schon interessiert.
Kommen wir zum interessanten Teil. Dem Schreiben von Dateien auf eine Festplatte oder eine Speicherkarte z.B.
Des öfteren habe ich schon gelesen, dass gelöschte Daten, auch nach einem einmaligen Überschreiben durch alles Nullen oder Einsen, irgendwie wiederhergestellt werden könnten. Jetzt frage ich mich wie das möglich ist? Ich meine, ok, bei Dateien die "normal" gelöscht werden und somit lediglich der Speicherplatz wieder freigegeben wird, da verstehe ich, dass man diese wieder zurückholen kann, aber wie bitte geht das wenn die bits mit Nullen überschrieben wurden? :confused:

Auch dazu möchte ich testweise in meinem C-Programmchen einen kleinen Bereich meiner Speicherkarte bitweise auslesen. Das müsste im Gegensatz zu dem RAM Speicher relativ leicht zu schaffen sein, oder? Welche Funktion bietet sich dafür an?
 
Des öfteren habe ich schon gelesen, dass gelöschte Daten, auch nach einem einmaligen Überschreiben durch alles Nullen oder Einsen, irgendwie wiederhergestellt werden könnten. Jetzt frage ich mich wie das möglich ist? Ich meine, ok, bei Dateien die "normal" gelöscht werden und somit lediglich der Speicherplatz wieder freigegeben wird, da verstehe ich, dass man diese wieder zurückholen kann, aber wie bitte geht das wenn die bits mit Nullen überschrieben wurden?

Vor etlichen Jahren habe ich da mal was drueber gelesen, viel behalten habe ich nicht aber wenn ich mich richtig erinnere war das nicht so einfach moeglich.

[HALBWISSEN!!!]
Die Daten werden in einer "Linie" auf die Festplatte geschrieben. Das schreiben funktioniert grob indem das Metal der Festplatte fuer die werte 0 bzw 1 mit einem Magnet ausgerichtet wird.
Von Bandlaufwerken her kennt man es ja noch das man die Dinger alle paar Jahre umspulen soll, damit die "magnetisch gespeicherten" Daten sich nicht gegenseitig beeinflussen bzw aendern.
Sind die Daten jetzt also sozusagen in einer Linie gespeichert in Form einer magnetischen Ausrichtung, stellt jedes Bit einen kleinen magnetischen Nord-/Suedpol dar und uebt auch auf den Bereich oberhalb/unterhalb der Linie eine Kraft aus. Dadurch werden diese Raender mit der Zeit eben auch umgepolt.
Werden Jetzt die Daten wieder ueberschrieben loescht man halt nur die Linie, die raender behalten aber noch die Polung die sich langsam aufgebaut hat. Beim auslesen mehrfach ueberschriebener Daten werden also eigenltich nur die Raender um die Datenspur herrum betrachtet.
[\HALBWISSEN!!!]

Alle angaben ohne Gewaeher!
 
[HALBWISSEN!!!]
Die Daten werden in einer "Linie" auf die Festplatte geschrieben. Das schreiben funktioniert grob indem das Metal der Festplatte fuer die werte 0 bzw 1 mit einem Magnet ausgerichtet wird.

So würde es nicht funktionieren. Überleg mal... wie soll ein Festplattenkopf eine unmagnetisierte Platte lesen (also komplett mit 0llen gefüllt)? Der würde nichts lesen können.

Eigentlich sind 0 und 1 bestimmte Muster und hinzu kommt, dass die Ausrichtung der Magnete gemessen wird und in diesem Fall kann man nur die Änderung messen. Das Ergebnis wird statistisch bestimmt außerdem auch durch ECC ausgeglichen, wenn Fehler auftreten. Davon merkt man (fast) nichts im Betrieb. Außerdem gibt es in der Praxis keine scharfen Kanten also 0- und 1-Sprünge. Das führt zu unbrauchbaren Ergebnissen.

Für den Benutzer sieht die Platte (heute) wie ein linearer Speicher, der in 512-Byte-Sektoren unterteilt ist. Das ist die kleinste Einheit die man lesen kann. Was in der Praxis noch für Optimierungen geschehen (read-ahead etc) ist an dieser Stelle dann auch nicht mehr so wichtig.
 
Das ganze ist ein Märchen. Das war mit Disketten möglich, mit Festplatten ist das nicht so.
 
Zurück
Oben