私はC言語でプログラムを作成していますが、私はインラインasmを使用しています。インラインアセンブラコードには、実行時にパッチを適用したいいくつかのアドレスがあります。C - 実行時にasmパッチを適用する
コードの迅速なサンプルはこれです:
void __declspec(naked) inline(void)
{
mov eax, 0xAABBCCDD
call 0xAABBCCDD
}
アンは私がメインのCプログラムから0xAABBCCDD値を変更したいと言います。 私がやろうとしたことはVirtualProtectを関数のポインタとして呼び出すことでWriteableにしてから、memcpyを呼び出してコードに適切な値を追加することです。
DWORD old;
VirtualProtect(inline, len, PAGE_EXECUTE_READWRITE, &old);
VirtualProtectは失敗し、GetLastError()は無効なアドレスにアクセスすることを意味する487を返します。誰でもこの問題についての手掛かりはありますか? ありがとう
なぜそれをしたいですか?あなたがこれをやりたいと思った本当の問題を解決する良い方法があるはずです。また0xAABBCCDDの本当の価値をどうやって決めるのですか?おそらく、そのアドレスがどこから来るのかに応じて、 "無料で"起こる代替を得る方法があります。 – Flexo
(これはWin32/MSVCですが、ここでは構文とシステムコールから推測しています。タグや質問に明示的に指定したい場合があります)。 – Flexo
あなたは正確に何をしようとしていますか?ターゲットプロセスにフックをかけて機能にジャンプしようとしていますか?そうであれば、メモリブロックを 'VirtualProtect'する必要があります。あなたの関数ではなく、フックを作るために上書きします。また、あなたのコーデックから抜け出す必要があります(' call' + 'ret'または'jmp'を関数の最後にある特定のアドレスに置き換えます)。 – AusCBloke