我知道如何将DLL注入正在运行的进程中,以及如何利用进程内部使用的函数,例如。
void__stdcall remoteMethod(unsigned short id)
{
typedef void (__stdcall *pFunctionAddress)(unsigned short);
pFunctionAddress pMyFunction = (pFunctionAddress)(0xCAFEBABE);
pMyFunction(id);
}
现在我想在运行过程中将sleep()添加到现有方法中 - 这是程序的主循环,并且不会停止一秒并耗尽所有处理能力。
我知道对于像detours这样的框架我可以创建一个调用我的函数然后是原始函数的trampoline函数 - 但是我的问题是while(1)循环在外部进程的函数内。所以我知道循环开始的偏移量 - 之后我想首先调用sleep()然后继续循环的正常路径。
到目前为止,我看到的唯一替代方案是对程序进行二进制编辑,但这不是一个好的解决方案。
有什么建议吗?感谢
答案 0 :(得分:3)
我觉得你在这里太可爱了。只需在计时器上交替调用SuspendThread / ResumeThread即可。我知道这很难看,但你不会在我怀疑的任何选美比赛中输入你的解决方案。
答案 1 :(得分:1)
原则上,只要你在另一个进程的空间内执行了一次,并且你知道循环没有执行,那么可以启用写入文本页面和在原地修补实际的循环代码。你需要一些冗余字节来调用你的函数(扩展函数将需要大量的重写,因为所有相对偏移都会中断)。
然而,这不是非常容易,也不是非常强大。考虑一下你为什么要这样做,如果你能以另一种方式实现目标。答案 2 :(得分:1)
发布旋转等待程序的名称。
等待SO-ers向开发者发送仇恨邮件。
安装开发人员发送给您的贿赂更新以阻止仇恨邮件。
答案 3 :(得分:0)
API挂钩可以解决您的问题。 An excellent article is available in codeproject.请参阅