3

実行中のプロセスにDLLを挿入する方法と、プロセスによって内部的に使用される関数を利用する方法を知っています。

void__stdcall remoteMethod(unsigned short id)
{
typedef void (__stdcall *pFunctionAddress)(unsigned short);
pFunctionAddress pMyFunction = (pFunctionAddress)(0xCAFEBABE);
pMyFunction(id);
}

今、実行中のプロセスの既存のメソッドに sleep() を追加したいと思います。これはプログラムのメインループであり、1 秒も停止せず、すべての処理能力を使い果たします。

回り道のようなフレームワークを使用すると、関数を呼び出してから元の関数を呼び出すトランポリン関数を作成できることはわかっていますが、while(1) ループが外部プロセスの関数内のどこかにあるという問題があります。だから私はループが始まるオフセットを知っています - そしてその後、最初に sleep() を呼び出してから、ループの通常のルートを続けたいと思います。

これまでに見た唯一の代替手段は、プログラムをバイナリ編集することですが、これは良い解決策ではありません。

なにか提案を?ありがとう

4

3 に答える 3

3

私はあなたがここであまりにもかわいそうにしようとしていると思います. タイマーで SuspendThread/ResumeThread を交互に呼び出すだけです。私はそれが醜いことを知っていますが、私が疑う美人コンテストにあなたのソリューションを入力するつもりはありません.

于 2011-08-19T19:58:51.430 に答える
2
  1. スピン待ちプログラムの名前を投稿します。

  2. SO-ers が開発者に嫌がらせのメールを送信するのを待ちます。

  3. ヘイトメールを阻止するために、開発者が賄賂としてあなたに送ったアップデートをインストールしてください。

于 2011-08-19T20:04:20.680 に答える
1

原則として、他のプロセスのスペース内で一度実行され、ループが実行されていないことがわかっている限り、テキスト ページへの書き込みを有効にして、実際のループ コードをその場でパッチすることができます。関数への呼び出しを書き込むには、冗長なバイト数が必要です (関数を拡張するには、すべての相対オフセットが壊れるため、多くの書き換えが必要になります)。

ただし、これはそれほど簡単でもなく、非常に堅牢でもありません。なぜこれをしたいのか、別の方法で目標を達成できるかどうかを検討してください。

于 2011-08-19T15:33:45.627 に答える