Code: Alles auswählen
;Programm - Speicher - Betrachter
;Beispiel für WinMine (Windows XP)
;Structuren definieren
MBI.MEMORY_BASIC_INFORMATION
SysInfo.SYSTEM_INFO
GetSystemInfo_(SysInfo) ;Ermittlung des für Programme zur Verfügung stehenden Speichers
MinAdr = SysInfo\lpMinimumApplicationAddress
MaxAdr = SysInfo\lpMaximumApplicationAddress
SystemDir$ = Space(#MAXBYTE)
FileL = GetSystemDirectory_(SystemDir$, #MAXBYTE)
WinMineDir$ = Left(SystemDir$, FileL) + "\winmine.exe"
;Prgramm-Handle
hProgram = RunProgram(WinMineDir$, "", GetCurrentDirectory(), #PB_Program_Open)
;damit die Programm-ID ermitteln; ist die, die auch der Task-Manager anzeigt (variabel!!!)
ProgID = ProgramID(hProgram)
;jetzt das Ganze für Vollzugriff öffnen
ProcessHandle = OpenProcess_(#PROCESS_ALL_ACCESS, #False, ProgID)
AnfAdresse = MinAdr
Delay(1000) ;Windows etwas Zeit zum Speicher-Organisieren geben
While AnfAdresse < MaxAdr
VirtualQueryEx_(ProcessHandle, AnfAdresse, MBI, SizeOf(MEMORY_BASIC_INFORMATION))
Eigner = MBI\State
Size = MBI\RegionSize
Status = MBI\Protect
If Eigner = #MEM_COMMIT And Status = #PAGE_READWRITE And AnfAdresse >= $1000000
BaseAdr = MBI\BaseAddress
EndAdr = BaseAdr + Size
Break
EndIf
AnfAdresse + Size
If AnfAdresse < 0 ;negativ!
Break
EndIf
Wend
Laenge = (EndAdr - BaseAdr)
Buffer = AllocateMemory(Laenge)
BufferS = AllocateMemory(Laenge)
If Buffer = 0 Or BufferS = 0
MessageRequester("Fehler !", "Der benötigte Speicher konnte nicht bereitgestellt werden !")
End
EndIf
If OpenWindow(0, 0, 0, 630, 505, "Programm - Speicher - Betrachter", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
ListIconGadget(0, 10, 10, 610, 485, "Adresse", 75, #PB_ListIcon_GridLines)
For b = 1 To 16
AddGadgetColumn(0, b, Hex(b-1), 32)
Next
ReadProcessMemory_(Processhandle, BaseAdr, Buffer, Laenge, 0)
n = Laenge
n >> 4
n - 1
For k = 0 To n
For i = 0 To 15
Test1$ + Chr(10) + RSet(Hex(PeekB(Buffer + z)), 2, "0")
z + 1
Next
AddGadgetItem(0, -1, Hex(BaseAdr + k << 4) + Test1$)
Test1$ = ""
Next
SetActiveGadget(0)
Repeat
EventId = WindowEvent()
CopyMemory(Buffer, BufferS, Laenge)
ReadProcessMemory_(Processhandle, BaseAdr, Buffer, Laenge, 0)
z = 0
n = Laenge-4
n >> 4
n - 1
For k = 0 To n
For i = 0 To 15
If (PeekB(Buffer + z) & 255) <> (PeekB(BufferS + z) & 255)
N$=RSet(Hex((PeekB(Buffer + z) & 255)), 2, "0") + "<" ;"<" als Zeichen für verändert
SetGadgetItemText(0, k, N$, i + 1)
EndIf
z + 1
Next
Next
Delay(5)
Until EventId = #PB_Event_CloseWindow
EndIf
Helle