1

関数を呼び出す前にプロセッサ レジスタの 1 つの値を実際に変更する必要がある C で記述したアプリケーションがあります。通常はインライン アセンブリでこれを行いますが、64 ビット アプリケーションでは削除されていることは周知のとおりです。特定のプロジェクトの制約により、ml64 でコンパイルされた別の .asm ファイルでこれを行うこともできません。したがって、基本的には、次のコードと同等のものをインラインで実行する必要があります。

_asm mov r10d, 0xDEADBEEF

レジスタの値をインラインで変更できるようにする、x64 に固有のクリエイティブなメソッドやその他のコンパイラを知っている人はいますか?

4

1 に答える 1

1

残念ながら、考えられる回避策を検討した結果、Hans は正しかったようで、レジスタの内容をインラインで変更することはまったく不可能です。それを行うために存在するコンパイラ組み込みはありません。唯一の代替手段は、関数全体を64ビットアセンブリに別の.asmファイルとして書き込んでml64でコンパイルするか、Alexeyが提案したようにして、前に実行可能なメモリブロックを割り当てることですオペコードを渡してそれに書き込みます。次に、関数ポインターを作成し、このコードを直接呼び出すことができます。たとえば、次のようなことをしたい場合:

mov r10d, ecx
ret

オペコードを格納する配列を作成するだけです。

BYTE copyValueToR10[] = "\x44\x8B\xD1\xC3";

次に、PAGE_EXECUTE 保護を使用して、この小さな関数の VirtualAlloc メモリを使用できます。次に、関数ポインタを作成するだけで準備完了です。確かに汚い方法ですが、インライン asm がない、または ml64 を使用してコンパイルしたいという制約を考えると、これが唯一の他の方法のようです。

于 2013-02-12T19:19:26.723 に答える