2012-05-12 17 views
3

私はプロセスメモリ全体をスキャンしようとしていますが、成功しません...私は何をしていますか:テスト用に私はメモ帳を使用していますので書きます%B HEXの値は25(%)と42(B)です。したがって、コードは次のとおりです。ReadProcessMemoryで全プロセスメモリをスキャンする

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

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

16進数値の間に00があるためです。だから私は '+2'を追加する必要があります。この値のメモリ全体をスキャンするにはどうすればよいですか?

答えて

8

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

私はなぜ比較する前に16進数の文字列に変換する必要があるのか​​分かりません。文字列の使用を必要とするhexには何も特別なものはありません。 16進数は、基数16の数値システムに過ぎません。したがって、小数点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. SizeOfの代わりにLengthを使用した場合は、リストの最後まで繰り返します。動的配列をループするには、0からLength(...)-1にループします。
  3. この場合、ループ内のインデックスi+2にアクセスしているので、0からLength(...)-3にループする必要があります。

実際には、一致するものを見つけるために4バイト連続して比較する必要があります。おそらく、次のようになります。

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

ありがとうございました。しかし、なぜ私のためのミステリープログラムは、メモ帳のメモリ内の値を見つけることができません。 ReadProcessMemoryのように: ReadProcessMemory(PIDHandle、Pointer($ 00367ED0)、Buff、MemInfo.RegionSize、ReceivedBytes)を正しいアドレスポインタで使用すると、それが見つかります。しかし、メモリ全体をスキャンして、何も見つかりません。不便をおかけして申し訳ありません... – HwTrap

+0

最新のアップデートはありますか? –

+0

はい...ありがとうございます! – HwTrap

関連する問題