1

組み立てが苦手なのでどうしたらいいのかわかりません。

別のプログラムにフックしているプログラムがあります。フックされたプログラムの .exe 内で関数が配置されている場所へのオフセットを取得しました

#define FuncToCall 0x00447E5D

では、__asm{} を使用してその関数を呼び出すにはどうすればよいでしょうか?

4

4 に答える 4

3

簡単に言えば、アセンブリを知らない場合は、これを行うべきではありません (笑)。

しかし、ウォール ハッキング、つまり正当なプログラムの動作を変更することに熱心な場合は、単にアドレスを取得してそれを有効と呼ぶことはできません。

実際の関数を見つけるには、シンボルを検索するか (幸せな Linux ランドの場合)、sig スキャン (または両方の D= ) を使用する必要があります。

それができたら比較的簡単で、mov と jmp を書くだけです。実行中のプロセスへのアクセスが既にあり、sig スキャナーが正しいアドレスを見つけたと仮定すると、このコードのビットはあなたが望むようになります

mov eax, 0×deadbeef
jmp eax

さて、あなたが望むこの関数がクラスメソッドである場合..もう少し勉強する必要があります。しかし、そのアセンブリの一部は、必要な静的関数を実行します。

さまざまな呼び出し規約に対処するための混乱もあります。そのため、コメント者はそれについて私に電話をかけようとしません。

EDIT:ちなみに、 call を使用するときは、スタックフレームやその他の非常に面倒なことを心配する必要があるため、 call は使用しません。このコードは、任意のアドレスにジャンプして実行を開始します。

コードに戻りたい場合、それは別の話ですが、クラスメソッドなどではなく、正しい呼び出し規則である限り、ターゲット関数が動作します。

于 2009-12-18T03:06:21.693 に答える
1

そのアドレスを関数ポインターにキャストして、そのように呼び出すこともできると思います。そのほうがいいかもしれません。

于 2009-12-18T03:01:35.323 に答える
1

答えてくれてありがとう、しかし私はそれを理解しました。これは私がやっていることです:

#define FuncToCall 0x00447E5D
DWORD myfunc = FuncToCall; 
__asm call dword ptr [myfunc]; 

それが機能する場合は、修正しないでください。

于 2009-12-18T03:32:45.820 に答える
0

これはトリッキーなものです。パラメーターと戻り値でも使用できます。関数へのポインター (FuncToCall) によって指定された、呼び出す予定の関数にすべてを転送するだけです。

void call_FuncToCall(.......)
{
  __asm__
  ("call label1\n label1:\n"
   "pop %eax\n"
   "movl FuncToCall, %eax\n"
   "leave\n"
   "jmp *%eax");
}
于 2011-05-23T08:04:23.303 に答える