組み立てが苦手なのでどうしたらいいのかわかりません。
別のプログラムにフックしているプログラムがあります。フックされたプログラムの .exe 内で関数が配置されている場所へのオフセットを取得しました
#define FuncToCall 0x00447E5D
では、__asm{} を使用してその関数を呼び出すにはどうすればよいでしょうか?
組み立てが苦手なのでどうしたらいいのかわかりません。
別のプログラムにフックしているプログラムがあります。フックされたプログラムの .exe 内で関数が配置されている場所へのオフセットを取得しました
#define FuncToCall 0x00447E5D
では、__asm{} を使用してその関数を呼び出すにはどうすればよいでしょうか?
簡単に言えば、アセンブリを知らない場合は、これを行うべきではありません (笑)。
しかし、ウォール ハッキング、つまり正当なプログラムの動作を変更することに熱心な場合は、単にアドレスを取得してそれを有効と呼ぶことはできません。
実際の関数を見つけるには、シンボルを検索するか (幸せな Linux ランドの場合)、sig スキャン (または両方の D= ) を使用する必要があります。
それができたら比較的簡単で、mov と jmp を書くだけです。実行中のプロセスへのアクセスが既にあり、sig スキャナーが正しいアドレスを見つけたと仮定すると、このコードのビットはあなたが望むようになります
mov eax, 0×deadbeef
jmp eax
さて、あなたが望むこの関数がクラスメソッドである場合..もう少し勉強する必要があります。しかし、そのアセンブリの一部は、必要な静的関数を実行します。
さまざまな呼び出し規約に対処するための混乱もあります。そのため、コメント者はそれについて私に電話をかけようとしません。
EDIT:ちなみに、 call を使用するときは、スタックフレームやその他の非常に面倒なことを心配する必要があるため、 call は使用しません。このコードは、任意のアドレスにジャンプして実行を開始します。
コードに戻りたい場合、それは別の話ですが、クラスメソッドなどではなく、正しい呼び出し規則である限り、ターゲット関数が動作します。
そのアドレスを関数ポインターにキャストして、そのように呼び出すこともできると思います。そのほうがいいかもしれません。
答えてくれてありがとう、しかし私はそれを理解しました。これは私がやっていることです:
#define FuncToCall 0x00447E5D
DWORD myfunc = FuncToCall;
__asm call dword ptr [myfunc];
それが機能する場合は、修正しないでください。
これはトリッキーなものです。パラメーターと戻り値でも使用できます。関数へのポインター (FuncToCall) によって指定された、呼び出す予定の関数にすべてを転送するだけです。
void call_FuncToCall(.......)
{
__asm__
("call label1\n label1:\n"
"pop %eax\n"
"movl FuncToCall, %eax\n"
"leave\n"
"jmp *%eax");
}