Delphi VirtualQueryEx/ReadProcessMemory
一周前,我开始做一个项目来扫描另一个进程的内存。首先,我想在进程中插入一个DLL,然后访问它的内存,但由于种种困难,我开始使用VirtualQueryEx/ReadProcessMemory API来实现这一点。 我脑海中浮现出一些疑问,下面是代码:Delphi VirtualQueryEx/ReadProcessMemory,delphi,delphi-2010,Delphi,Delphi 2010,一周前,我开始做一个项目来扫描另一个进程的内存。首先,我想在进程中插入一个DLL,然后访问它的内存,但由于种种困难,我开始使用VirtualQueryEx/ReadProcessMemory API来实现这一点。 我脑海中浮现出一些疑问,下面是代码: var Form1: TForm1; PIDHandle: THandle; PID: dword; MemInfo: MEMORY_BASIC_INFORMATION; SysInfo: SYSTEM_INFO; Page
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;
我正在扫描所有的内存地址吗?或者只是“跳转”地址而不阅读??!
第二个也是最重要的问题——我正在使用记事本进行测试,我的目标是读取写在那里的字符串。如果我这样做:
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;
if (ReadProcessMemory(PIDHandle, MemInfo.BaseAddress, Buff,
MemInfo.RegionSize, ReceivedBytes)) then
begin
Memo1.Lines.Append(PAnsiChar(Buff));
end;
FreeMem(Buff);
end;
它在备忘录上加了一串中文和无效字符。如何自动扫描每个内存地址并将字符串写入其中?任何关于代码的问题,只要问我。。。等待您的帮助在Buff中额外分配一个字符,并将其初始化为零。我猜Memo1.Lines.Append需要一个以null结尾的字符串,垃圾字符可能是Buff之后内存中出现的任何字符。要获取第一个内存地址,请执行以下操作:
var
sysinfo : TSystemInfo;
GetSystemInfo(sysinfo);
start : DWORD;
begin
start := DWORD(sysinfo.lpMinimumApplicationAddress);
end;
您得到的是垃圾,因为在显示所有内存之前字符串中出现了0,所以请执行此操作
var
mybuffer : String;
begin
SetLength(mybuffer,MemInfo.RegionSize);
CopyMemory(@mybuffer[1],Buff,MemInfo.RegionSize);
Memo1.Lines.Add(mybuffer);
end;
如果您正在寻找dll注入(和其他有趣的技术),也许您应该看看这里?
我不知道我是否理解你说的话,但我可以在备忘录中看到所有收到的buff,这只是垃圾。只有第一行是:RESCHIT其他所有内容都是垃圾进程中的大部分内存在解释为文本时通常是垃圾。您正在读取记事本内存进行测试?记事本使用unicode字符(16位字符),因此大多数拉丁语字符的高字节为零。如果ansi字符被解释为unicode,那么您将得到大量的中文等垃圾(因为每个字符的高字节就是下一个字符)。我并没有完全遵循你想要达到的目标。将进程内存转储到文本字段中?并非所有内存都转储到文本字段中。但是我想解析每个具有读/写属性的内存地址来搜索字符串。我搜索的这个字符串显然是文本(ASCII或Unicode),但是如何获取呢?这是我的问题。试图将这些记忆解释为文本是错误的。它不是文本。您希望以与十六进制编辑器相同的方式显示它。是的,或多或少是这样。有一些十六进制编辑器,具有在内存中搜索精确文本字符串的功能。我想这样做,在内存中搜索某种字符串…不工作,因为记事本不使用ascii编码您自己的应用程序在delphi 7中使用tmemo和测试itI在delphi 2010上。。。有什么办法可以改变它吗?!
var
mybuffer : String;
begin
SetLength(mybuffer,MemInfo.RegionSize);
CopyMemory(@mybuffer[1],Buff,MemInfo.RegionSize);
Memo1.Lines.Add(mybuffer);
end;