Re: Prozessabbild speichern und wiederherstellen
Verfasst: 28.08.2014 00:46
Dein Poke ersetzt den String ja nur im Buffer.
Du musst es dann noch im "echten" Speicher ersetzen mit: WriteProcessMemory_()
Allerdings gibts dann bei mir beim dritten schreiben ein Fehler, vermutlich weil ich durch das Schreiben, Laufvariablen verändere. (Ich triff mir sozusagen selbst auf die Füße)
Aber der Debugger zeuigt zumindest das er zwar "MeinTestTempText" gefunden hat, aber im Speicher aufeinmal schon "M31nT3stT3mpT3xt" steht.
Du musst es dann noch im "echten" Speicher ersetzen mit: WriteProcessMemory_()
Allerdings gibts dann bei mir beim dritten schreiben ein Fehler, vermutlich weil ich durch das Schreiben, Laufvariablen verändere. (Ich triff mir sozusagen selbst auf die Füße)
Aber der Debugger zeuigt zumindest das er zwar "MeinTestTempText" gefunden hat, aber im Speicher aufeinmal schon "M31nT3stT3mpT3xt" steht.
Code: Alles auswählen
EnableExplicit
Procedure ManiMem(StartMemAddr, EndMemAddr, StrToFind$, StrToReplace$)
Protected StrToFindLen = Len(StrToFind$)
Protected hProcess
Protected result
Protected mbi.MEMORY_BASIC_INFORMATION
Protected sBuffer
Protected res
Protected written
Protected x
Protected tmp$
hProcess = OpenProcess_(#PROCESS_ALL_ACCESS, #False, GetCurrentProcessId_());
Repeat
result=VirtualQueryEx_(hProcess, StartMemAddr, @mbi.MEMORY_BASIC_INFORMATION, SizeOf(MEMORY_BASIC_INFORMATION))
If mbi\State = #MEM_COMMIT And mbi\Protect <> #PAGE_READONLY And mbi\Protect <> #PAGE_EXECUTE_READ And mbi\Protect <> #PAGE_GUARD And mbi\Protect <> #PAGE_NOACCESS
sBuffer = AllocateMemory(mbi\RegionSize)
res = ReadProcessMemory_(hProcess, StartMemAddr, sBuffer, mbi\RegionSize, @written)
If written > 0
For x = 0 To written
tmp$ = PeekS(sBuffer+x, StrToFindLen)
If FindString(tmp$, StrToFind$, 1)
Debug "FOUND MATCH - " + Hex(mbi\BaseAddress+x) + "=" + tmp$
Debug PokeS(sBuffer+x, StrToReplace$, StrToFindLen) ; <<<<<<<<<<<<<<<<<<<<< ? :D
Debug WriteProcessMemory_(hProcess, StartMemAddr+x, sBuffer+x, StringByteLength(StrToReplace$), #Null)
EndIf
Next
EndIf
FreeMemory(sBuffer)
EndIf
StartMemAddr = mbi\BaseAddress + mbi\RegionSize
Until StartMemAddr >= EndMemAddr Or result = 0
EndProcedure
If OpenWindow(0, 0, 0, 300, 100, "ManiMem", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(1, 10, 10, 480, 20, "MeinTestTempText", 0)
ManiMem(0, $7FFFFFFF, "MeinTestTempText", "M31nT3stT3mpT3xt")
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Das sich der Fenstertext nicht ändert, liegt vllt an eigenen Buffern von Windows, die nicht im Prozess selbst liegen?FOUND MATCH - 1EE1310=MeinTestTempText
16
1
FOUND MATCH - 1EE1330=M31nT3stT3mpT3xt
16
1
FOUND MATCH - 1F247C5=M31nT3stT3mpT3xt
16
1