一週前,我開始製作一個項目來掃描另一個進程內存。首先,我只是想將DLL注入進程,然後訪問它的內存,但由於所有困難,我開始使用VirtualQueryEx/ReadProcessMemory API進行此操作。 有些疑惑浮現在我的腦海,下面是代碼:VirtualQueryEx/ReadProcessMemory
var
Form1: TForm1;
PIDHandle: THandle;
PID: dword;
MemInfo: MEMORY_BASIC_INFORMATION;
SysInfo: SYSTEM_INFO;
PageSize, MemStart, ReceivedBytes: cardinal;
Buff: PChar;
IsWow64Process: TIsWow64Process;
IsWow64: BOOL;
while (VirtualQueryEx(PIDHandle, Pointer(MemStart), MemInfo, SizeOf(MemInfo)) > 0) do
begin
if ((MemInfo.State = MEM_COMMIT) and (not (MemInfo.Protect = PAGE_GUARD)
or (MemInfo.Protect = PAGE_NOACCESS))) then
begin
if (0<>MemInfo.Protect and PAGE_READWRITE) then
begin
GetMem(Buff, MemInfo.RegionSize);
if (ReadProcessMemory(PIDHandle, Pointer($00636ED0), Buff,
MemInfo.RegionSize, ReceivedBytes)) then
begin
Memo1.Lines.Append(PAnsiChar(Buff));
end;
FreeMem(Buff);
end;
end;
MemStart:= MemStart + MemInfo.RegionSize;
end;
CloseHandle(PIDHandle);
end;
首先全部 - 該方法時:
while (VirtualQueryEx(PIDHandle, Pointer(MemStart), MemInfo, SizeOf(MemInfo)) > 0) do
...
MemStart:= MemStart + MemInfo.RegionSize;
我是否掃描所有的內存地址?或者它只是「跳躍」地址而不讀取??! 第二個也是最重要的問題 - 我使用記事本進行測試,我的目標是讀取一些寫在那裏的字符串。如果我做這樣的:
if (0<>MemInfo.Protect and PAGE_READWRITE) then
begin
GetMem(Buff, MemInfo.RegionSize);
if (ReadProcessMemory(PIDHandle, Pointer($00636ED0), Buff,
MemInfo.RegionSize, ReceivedBytes)) then
begin
Memo1.Lines.Append(PAnsiChar(Buff));
end;
FreeMem(Buff);
end;
直接傳遞的地址中進行ReadProcess,它的工作原理,並得到我的字符串的第一個字母(或第一個字節)。記住的Buff是PChar類型......但是,如果我做同樣的事情,但ReadProcessMemory是這樣的:
if (ReadProcessMemory(PIDHandle, MemInfo.BaseAddress, Buff,
MemInfo.RegionSize, ReceivedBytes)) then
begin
Memo1.Lines.Append(PAnsiChar(Buff));
end;
FreeMem(Buff);
end;
它添加在備註一幫中國和無效字符。我怎樣才能自動掃描每一個內存地址,並讓我的字符串寫在那裏?任何有關代碼的問題,只是問我...等待你的幫助
試圖將此內存解釋爲文本是一個錯誤。這不是文字。您希望以與十六進制編輯器相同的方式顯示它。 –
是的,或多或少像這樣。有一些十六進制編輯器有一個功能來搜索內存中的確切文本字符串。我想這樣做,在內存中搜索某種字符串... – HwTrap