 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Tomtitom

Anmeldungsdatum: 20.09.2004 Beiträge: 308
|
Verfasst am: 07.03.2010, 14:43 Titel: ram auslesen und speichern |
|
|
Hi,
gibt es eine Möglichkeit einen Teil (etwa 2 MB) des Arbeitsspeichers auszulesen, es dann in eine Datei zu speichern, um später den Arbeitsspeicher wieder mit diesen gespeicherten Werten zu überschreiben?
Meine ersten Ideen waren es mit ReadProcessMemory() auszulesen, allerdings weiß ich nicht, wie ich wie ich mehr als ein Byte auslesen kann und wenn ich mehr als 100 KB auslesen will, hängt sich das Prog auf.
Dann hatte ich noch die Idee mit BSAVE, allerdings weiß ich nicht, welchen Pointer ich nehmen muss. In den Hilfen steht immer nur was zu Grafiken auslesen.
Kann mir da jemand weiter helfen?
MfG, Tomtitom |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 07.03.2010, 15:14 Titel: |
|
|
Ich glaube kaum das es ueberhaupt irgendeine moeglichkeit gibt alles so wie es gerade ist aus dem RAM zu lesen um es spaeter 1:1 wieder so hinein zu schreiben, wuesste auch nicht was fuer einen sinn ausser den totalabsturz das haben sollte...
Das einzige das vermutlich moeglich ist, einzelne Programm prozesse aus dem Ram lesen und dort wieder hinein zu schreiben, dazu ist allerdings wohl einiges an wissen ueber die API funktionen bzw Kernel32 notwendig...
Code: | extern "windows" lib "kernel32"
declare function ReadProcessMemory (byval as any ptr, byval as any ptr, byval as any ptr, byval as uinteger, byval as uinteger ptr) as integer
declare function WriteProcessMemory (byval as any ptr, byval as any ptr, byval as any ptr, byval as uinteger, byval as uinteger ptr) as integer
end extern
|
zu diesen beiden Funktionen brauchst glaube ich noch die anderen zum finden eines Prozesses und einiges mehr, bin da nicht wirklich hilfreich, waere allerdings mal ein versuch wert sowas wie ein GameHack Clon zu basteln  _________________
 |
|
Nach oben |
|
 |
Tomtitom

Anmeldungsdatum: 20.09.2004 Beiträge: 308
|
Verfasst am: 07.03.2010, 16:18 Titel: |
|
|
Danke für deine Antwort.
Natürlich meinte ich einen speziellen Prozess. Und ich habe ja schon mit der readprocessmemory und co einige Versuche gemacht, aber bis jetzt habe ich noch nix erfolgreiches zustande gebracht.
Vielleicht sollte ich eher im Library-Forum fragen, bzw verschieben? |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
|
Nach oben |
|
 |
Tomtitom

Anmeldungsdatum: 20.09.2004 Beiträge: 308
|
Verfasst am: 07.03.2010, 16:50 Titel: |
|
|
Also das Tut ist schon ziemlich interessant, leider habe ich bezüglich Memory auslesen nichts weiter lernen können.
Mit ReadProcessMemory habe ich mich wie gesagt schon beschäftigt. Auf http://msdn.microsoft.com/en-us/library/ms680553%28VS.85%29.aspx steht:
Code: | BOOL WINAPI ReadProcessMemory(
__in HANDLE hProcess,
__in LPCVOID lpBaseAddress,
__out LPVOID lpBuffer,
__in SIZE_T nSize,
__out SIZE_T *lpNumberOfBytesRead
);
|
also theoretisch dürfte das ganz einfach sein, den hProcess habe ich, ich weiß auch, welchen Adressbereich ich lesen will, nur kann ich offenbar nicht beliebig große nSize angeben und im lpBuffer steht dann nur ein Wert. Hat da noch jemand Tipps? |
|
Nach oben |
|
 |
Tomtitom

Anmeldungsdatum: 20.09.2004 Beiträge: 308
|
Verfasst am: 07.03.2010, 17:12 Titel: |
|
|
Ich glaube, ich habe es jetzt selbst lösen können. Ich habe doch noch herausgefunden, wie man mit ReadProcessMemory viele Daten auslesen kann.
Hier die gekürzte Version:
Code: |
#Include Once "windows.bi"
Dim hwnd As hwnd, ProcessID As Dword, ProcessHandle As Handle, PointData As Point, WrB As Integer
Dim wert(&H001E8FFF) As ubyte, f As Integer
hwnd = FindWindow(NULL, "ProgName")
'Get the window's process ID.
GetWindowThreadProcessId(hwnd, @ProcessID)
'Get a process handle.
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID)
ReadProcessMemory(ProcessHandle, &H00400000, @wert(0), &H001E8FFF, @WrB)
f = Freefile
Open "test.txt" For Binary As #f
Put #f, , wert()
Close #f
CloseHandle (ProcessHandle) |
|
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 07.03.2010, 17:58 Titel: |
|
|
uhhhhhh uhuh uhuhhhhh auaaa
DIM hwnd AS hwnd
bööööse ungesund! man benutzt symbole nicht doppelt ;P
aber so grundsätzlich müsstest du's richtig gemacht haben: Pointer übergeben und als zusatz wie viel speicher an dem pointer maximal verfügbar ist, und als rückgabe bekommst du wie viele davon vollgeschrieben wurden, der pointer bleibt natürlich der selbe. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|