リターン アドレスを返すインライン アセンブリ関数を C++ コードで記述したいとします。
したがって、関数 returnAddress() をあるアドレスから呼び出していて、関数が終了した後にアドレス X に戻る必要がある場合、returnAddress() が値 X を返すようにします。
returnAddress() のコード例:
void* getAddress()
{
__asm {
pop ebx; // moving return offset to ebx?
push ebx; // restoring stack state
xor eax, eax;
mov ax, cs; // ax <- code segment
mov ecx, 16;
mul ecx; // multiplying the code segment by 16
add eax, ebx;// adding offset
}
}
前のコードは正しく動作しません。alt+8 を押すと、コードのアドレスがこの関数の戻り値と完全に異なることがはっきりとわかります。
メモリ内のコードのアドレスを見つけたいのは、コード自体の実行中にアドレスを変更しようとするためです。インライン アセンブリを使用せずに (おそらく Windows API を使用して) コードのアドレスを見つける方法が他にある場合は、お知らせください。
また、Visual Studio 2010 を使用して CS (コード セグメント) の値を使用することさえできないと確信しているので、おそらくそれが問題の原因です... CS は常に 35 に等しくなります。アセンブリ ビュー (alt+8) は正しく表示されませんか? VS2010 は仮想マシンを実行するため、アドレスは?
これは私の最初の投稿なので、私の主張をあまり明確にしていない可能性があります。より明確にするために自分自身を説明できるかどうか教えてください。