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