0

在我的项目中,我将一个 DLL(64 位 Windows 10)注入到带有手动映射和线程劫持的外部进程中,我在那里做了一些事情。

在当前状态下,我使用“RtlCreateUserThread”创建一个新线程并在那里做一些额外的工作来分配它以获得更好的性能。

我现在的问题是......是否可以从当前进程访问其他线程(劫持它)并在那里添加您自己的工作负载/代码。不创建新线程?

我在互联网上还没有发现任何有用的东西,我为线程劫持使用和修改的代码似乎只适用于 DLL 文件。因为我对 C++ 很陌生,所以我还在学习,我已经感谢任何帮助。

(如果您想查看注入器 Google GHInjector 的源代码,请在 github 上找到该库。)

4

1 回答 1

0

这是可能的,但非常复杂,可能并非在所有情况下都有效。您需要拼接现有线程的机器代码,因此您需要对代码页内存进行写访问。逻辑:

  1. 找到线程 id 和线程句柄,然后使用 SuspendThread WINAPI 调用挂起线程
  2. 挂起的线程现在可能处于等待状态,也可能处于系统DLL调用中,因此您需要分析当前的执行堆栈,回溯它并从应用程序空间中找到执行地址。在某些情况下,您需要 API 函数 StackWalk 和 PDB 文件。它还取决于运行架构(x86、amd64、...)。遍历堆栈,直到您的 EIP/RIP 不在应用程序内存地址空间中
  3. 解码机器指令(它将是“调用”)并将下一条指令拼接到您的函数调用。您需要使用 __declspec(naked) 声明的函数或 ASM 实现的函数来执行您的代码并替换指令。
  4. 简历线程

此方法可能只工作一次,因为不能保证应用程序代码在循环中执行。

于 2020-07-07T10:59:11.887 回答