3

アドレス10134CE0で私は持っています

10134CE0 - 40 - inc eax

これを変更するにはどうすればよいですか (できれば C++ を使用してWriteProcessMemory)

dec eax

inc eax40 手段と 48 手段は知ってdec eaxいますが、どうすれば 40 を 48 に変更できますか?

4

3 に答える 3

4

まず、これがコードであり、プログラムの一部である場合、セグメントが書き込み可能であることを確認する必要があります。そうしないと、コードに動的にパッチを適用できません。

そうであれば、次のように C でトリックを行います (C++ では、より美しい を使用することでメリットが得られる可能性がありますstatic_cast<>)。

uint8_t *code = (uint8_t*)0x10134ce0;
*code = 0x48;

最初の行はポインターを宣言し、コードのアドレスを割り当てます。2 行目では、このポインターを使用して元の命令を上書きします。

一般的に x86 コードにパッチを適用することを考えている場合は、単にこれを行うだけでは不十分であることに注意してください。x86 はパックされた命令セットであり、操作の長さが異なる場合があります。この場合、ある命令を別の命令で上書きするのは難しい場合があります。新しい命令は長くなる可能性があり、パッチを適用するつもりのない 1 つまたは複数の命令を上書きする可能性があるためです。

このような場合、元のコードを逆アセンブルし、古いコードの代わりに使用する新しいインスタンスを再アセンブルする必要があります。そのような目的のために、私はudis86 を逆アセンブラーとして使用し、AsmJitを使用してその場で新しいコードを作成するのが好きです。

于 2012-08-03T22:00:13.133 に答える
1

使用WriteProcessMemory(適切な場合):

uint8_t buffer;
BOOL ok

buffer = 0x48;
ok = WriteProcessMemory(<handle of the process>, 0x10134CE0, &buffer, 1, NULL);

しかし、許可を得ていても、別のプロセスのメモリに書き込む必要があるかどうかという問題があります。それがあなたが行っていることである場合。

于 2012-08-03T22:05:48.903 に答える
1

「メモリ位置 0x10134CE0 にバイト 0x48 を書き込むにはどうすればよいか」だけを尋ねている場合、それは次のとおりです。

*(char *)0x10134CE0 = 0x48

別のプロセスのメモリ空間で同じことを行うと、次のようになります。

char val = 0x48;
BOOL success = WriteProcessMemory(target, 0x10134CE0, &val, 1, NULL);

おそらく、あなたはこれ以上のことをしたいのですが、その「もっと」が何であるかを説明していないため、誰も答えるのが難しくなります. BjoemD は、あなたの心を読むためにいくつかの勇敢な試みをしました。彼が成功した場合、素晴らしい。そうでない場合は、他に何が必要か教えてください。

于 2012-08-04T00:53:53.503 に答える