3

我知道如何将 DLL 注入正在运行的进程中,以及如何利用进程内部使用的函数,例如

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

现在我想将 sleep() 添加到正在运行的进程中的现有方法中 - 这是程序的主循环,不会停止一秒钟并耗尽所有处理能力。

我知道使用 detours 之类的框架,我可以创建一个蹦床函数,它调用我的函数,然后调用原始函数 - 但是我的问题是 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 回答