一周前,我开始制作一个项目来扫描另一个进程内存。首先,我在考虑将DLL注入进程然后访问其内存,但由于所有困难,我开始使用VirtualQueryEx / ReadProcessMemory API执行此操作。 我脑子里出现了一些疑问,下面是代码:
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;
First All - 这个方法:
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;
直接在ReadProcessMemory中传递地址,它可以工作并获取我的字符串的第一个字母(或第一个字节)。记住Buff是PChar ...但是如果我做同样的事情,但ReadProcessMemory是这样的:
if (ReadProcessMemory(PIDHandle, MemInfo.BaseAddress, Buff,
MemInfo.RegionSize, ReceivedBytes)) then
begin
Memo1.Lines.Append(PAnsiChar(Buff));
end;
FreeMem(Buff);
end;
它在Memo上添加了一堆中文和无效字符。如何自动扫描每个内存地址并在那里写入我的字符串?有关代码的任何问题,请问我......等待你的帮助
答案 0 :(得分:0)
在Buff中分配一个额外字符并将其初始化为零。我猜测Memo1.Lines.Append想要一个以空字符结尾的字符串,垃圾字符可能是在Buff之后发生在内存中的任何事情。
答案 1 :(得分:0)
要获取第一个内存地址,请执行以下操作:
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;
答案 2 :(得分:0)
如果你正在寻找dll注射(和其他有趣的技术),也许你应该看看这里? https://sites.google.com/site/delphibasics/system/app/pages/search?scope=search-site&q=dll+injection