【问题标题】:Inject sleep() into a function of an external process将 sleep() 注入到外部进程的函数中
【发布时间】:2011-10-30 17:35:04
【问题描述】:

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

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

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

我知道,使用 detours 之类的框架,我可以创建一个蹦床函数,该函数调用我的函数,然后调用原始函数 - 但是我的问题是 while(1) 循环位于外部进程函数的某个位置。所以我知道循环开始的偏移量 - 之后我想先调用 sleep() 然后继续循环的正常路线。

到目前为止,我看到的唯一选择是二进制编辑程序,但这不是一个好的解决方案。

有什么建议吗?谢谢

【问题讨论】:

  • +1 用于尝试使用sleep()0xCAFEBABE

标签: c++ c dll inject detours


【解决方案1】:

原则上,只要您在另一个进程的空间内执行过一次,并且您知道循环没有执行,那么您可以启用写入文本页面和就地修补实际的循环代码。您需要一些冗余字节来编写对函数的调用(扩展函数需要大量重写,因为所有相对偏移都会中断)。

然而,这既不是非常容易也不是非常健壮。考虑一下为什么要这样做,以及是否可以通过其他方式实现目标。

【讨论】:

  • 正如我所说,我的目标是目标进程不会消耗一个核心上的所有 cpu,因为一些糟糕的编程会在没有睡眠的情况下执行一段时间(1)我可能能够指示一些不需要的函数调用在像 printF 这样的循环中,我可以用 sleep 替换它,这样堆栈指针等就不会受到影响,因为函数大小没有改变
  • 您如何确定程序有一个什么都不做的 while(1) 循环?如果您担心无响应,您不能只是 nice 进程降低调度程序的优先级吗?
【解决方案2】:

我觉得你在这里太可爱了。只需在计时器上交替调用 SuspendThread/ResumeThread。我知道这很丑,但我怀疑你不会在任何选美比赛中输入你的解决方案。

【讨论】:

  • 同意。或者更简单:使用 start.exe /low 启动进程
  • 这是个好主意 - 如果我将我的 dll 注入其中,如何从二进制文件中获取主线程?
  • 如果你有主窗口句柄你可以调用GetWindowThreadProcessId。
  • 如果是这样呢?你需要找到不法分子并着手对付他们。
【解决方案3】:
  1. 发布旋转等待程序的名称。

  2. 等待 SO-ers 向开发者发送仇恨邮件。

  3. 安装开发者作为贿赂发送给您的更新,以阻止仇恨邮件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 2010-09-15
    • 2018-12-03
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2011-07-19
    相关资源
    最近更新 更多