使用ReadProcessMemory扫描整个进程内存

HwT*_*rap 3 delphi delphi-2010

我正在尝试扫描整个进程内存但没有成功...我正在做的是:对于我正在使用记事本的测试,所以我在那里写了%B并且HEX中的这些值是:25(%)和42 (B).所以代码是:

  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)) and (MemInfo.Protect = PAGE_READWRITE)) then
          begin
            SetLength(Buff, MemInfo.RegionSize);
              if (ReadProcessMemory(PIDHandle, MemInfo.BaseAddress, Buff,
                                        MemInfo.RegionSize, ReceivedBytes)) then
                begin
                for I := 0 to SizeOf(Buff) do
                 begin
   if (IntToHex(Buff[i], 1) = '25') and (IntToHex(Buff[i+2], 1) = '42') then
                  Form1.Memo1.Lines.Append(IntToHex(Buff[i], 1));
                 end;

                end;
          end;
      MemStart:= MemStart + MemInfo.RegionSize;
    end;
  CloseHandle(PIDHandle);
  end;
Run Code Online (Sandbox Code Playgroud)

var'Buff'是TBytes(我读到TBytes并认为它与byte数组相同).所以我将字节转换为十六进制,并分别搜索值:25和42.代码如下:

if (IntToHex(Buff[i], 1) = '25') and (IntToHex(Buff[i+2], 1) = '42') then
Run Code Online (Sandbox Code Playgroud)

因为十六进制值之间有00.所以我需要添加'+2'.如何扫描整个内存中的这个值?

Dav*_*nan 8

记事本使用Unicode,因此您需要查找UTF-16编码数据,$0025以及$0042.

我不明白为什么你觉得在比较之前需要转换成十六进制字符串.十六进制没有什么特别需要使用字符串.十六进制只是一个基数为16的数字系统.因此,十进制32与十六进制20相同,即32=$20.直接与积分值进行比较:

if (Buff[i]=$25) and (Buff[i+2]=$42) then
Run Code Online (Sandbox Code Playgroud)

也就是说,考虑到$00你的测试应该是这样的字节:

var
  Target: string;
....
Target := '%B';
if CompareMem(@Buff[i], @Target[1], Length(Target)*SizeOf(Char)) then
  ....
Run Code Online (Sandbox Code Playgroud)

我不想深入研究其余的代码,但这一行

for I := 0 to SizeOf(Buff) do
Run Code Online (Sandbox Code Playgroud)

在许多不同的层面都是错的.

  1. SizeOf(Buff)返回指针的大小,因为动态数组变量本质上只是一个指针.要记住的一件有用的事情SizeOf是在编译时进行评估.
  2. 如果你使用Length而不是SizeOf那么你将迭代在列表的末尾.循环遍历动态数组,循环0Length(...)-1.
  3. 但在这种情况下,您正在访问i+2循环内的索引,因此您应该循环0Length(...)-3.

但事实上,您需要与4个连续字节进行比较才能找到匹配项.也许是这样的:

TargetByteLength = Length(Target)*SizeOf(Char);
for i := 0 to Length(Buff)-TargetByteLength do
  if CompareMem(@Buff[i], @Target[1], TargetByteLength) then
    ....
Run Code Online (Sandbox Code Playgroud)