3

プロセスメモリ全体をスキャンしようとしていますが、成功しません...私がやっていることは、テストのためにメモ帳を使用しているので、そこに%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;

var 'Buff' は TBytes です (TBytes について読んで、バイトの配列と同じだと思います)。そこで、バイトを 16 進数に変換し、それぞれ 25 と 42 の値を検索しています。コードは次のようになります。

if (IntToHex(Buff[i], 1) = '25') and (IntToHex(Buff[i+2], 1) = '42') then

16 進値の間に 00 があるためです。したがって、「+2」を追加する必要があります。この値のメモリ全体をスキャンするにはどうすればよいですか??

4

1 に答える 1

8

メモ帳は Unicode を使用するため、UTF-16 でエンコードされたデータを探す必要があり$0025ます$0042

比較する前に16進文字列に変換する必要があると感じる理由がわかりません。文字列の使用を必要とする 16 進数について特別なことは何もありません。16 進数は、基数が 16 の数値システムです。したがって、10 進数の 32 は 16 進数の 20 と同じ32=$20です。整数値と直接比較します。

if (Buff[i]=$25) and (Buff[i+2]=$42) then

つまり、バイト数を考慮すると、$00テストは実際には次のようになります。

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

コードの残りの部分に深く入り込みたくはありませんが、この行は

for I := 0 to SizeOf(Buff) do

多くの異なるレベルで間違っています。

  1. SizeOf(Buff)動的配列変数は本質的に単なるポインターであるため、ポインターのサイズを返します。覚えておくと便利なことはSizeOf、コンパイル時に評価されることです。
  2. Lengththenの代わりに使用SizeOfすると、リストの最後を反復処理することになります。動的配列をループするには、 from から0までループしLength(...)-1ます。
  3. ただし、この場合、ループ内で index にアクセスしているため、 from からto に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
    ....
于 2012-05-12T22:17:18.967 に答える