メモ帳では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
です。さまざまなレベルで間違っています。
SizeOf(Buff)
は、動的配列変数が本質的に単なるポインタであるため、ポインタのサイズを返します。便利なことは、コンパイル時にSizeOf
が評価されることです。
SizeOf
の代わりにLength
を使用した場合は、リストの最後まで繰り返します。動的配列をループするには、0
からLength(...)-1
にループします。
- この場合、ループ内のインデックス
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
....
ありがとうございました。しかし、なぜ私のためのミステリープログラムは、メモ帳のメモリ内の値を見つけることができません。 ReadProcessMemoryのように: ReadProcessMemory(PIDHandle、Pointer($ 00367ED0)、Buff、MemInfo.RegionSize、ReceivedBytes)を正しいアドレスポインタで使用すると、それが見つかります。しかし、メモリ全体をスキャンして、何も見つかりません。不便をおかけして申し訳ありません... – HwTrap
最新のアップデートはありますか? –
はい...ありがとうございます! – HwTrap