一周前,我开始制作一个项目来扫描另一个进程内存。首先,我只是想将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