2011-12-22 3 views
1

私は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を返します。誰でもこの問題についての手掛かりはありますか? ありがとう

+0

なぜそれをしたいですか?あなたがこれをやりたいと思った本当の問題を解決する良い方法があるはずです。また0xAABBCCDDの本当の価値をどうやって決めるのですか?おそらく、そのアドレスがどこから来るのかに応じて、 "無料で"起こる代替を得る方法があります。 – Flexo

+0

(これはWin32/MSVCですが、ここでは構文とシステムコールから推測しています。タグや質問に明示的に指定したい場合があります)。 – Flexo

+0

あなたは正確に何をしようとしていますか?ターゲットプロセスにフックをかけて機能にジャンプしようとしていますか?そうであれば、メモリブロックを 'VirtualProtect'する必要があります。あなたの関数ではなく、フックを作るために上書きします。また、あなたのコーデックから抜け出す必要があります(' call' + 'ret'または'jmp'を関数の最後にある特定のアドレスに置き換えます)。 – AusCBloke

答えて

1

これは機能しませんか?

int X = 0xAABBCCDD; 

void __declspec(naked) inline(void) 
{ 
     mov eax, [X] 
     call [X] 
} 
+0

ええ、アドレスは静的ではありません。私は実行時にそれを取得します。 – user1112347

+0

もちろん、実行時に取得できます。そして、アセンブリ関数を呼び出す前に 'X = the_address_I_got_at_runtime; 'というコード行を実行します。 –

+0

そうです。しかし、何か重要なことに言及するのを忘れた。私がしたいことは、コードをパッチして別のプロセスに注入し、そこから実行することです。私のプロセスではありません。しかし、要点は、インラインasmのどこでも実行時に値を書きたいということです。その理由は、私はvirtualprotectで書き込み可能な関数としてマークしようとしています。問題は、VirtualAllocが失敗するということです... – user1112347