0

我怎样才能进入另一个进程?喜欢,共享另一个进程的名称?因此,如果我的应用程序是 griddemo.exe,并且我想嵌入到 explorer.exe,这可能吗?只需从 kernel32 中阅读有关 CreateRemoteThread() 的内容。这是在正确的方向吗?会有安全/UAC 问题吗?

4

4 回答 4

3

首先很抱歉,但我的回答将作为另一个答案更长。

多年来,我在不同版本的操作系统(从 Windows NT 4.0 到 Windows 7)中使用 DLL 注入,并且我对任何病毒扫描程序(包括不同版本的 Norton 和 McAfee)都没有任何问题。所以我在这方面不同意斯蒂芬克利里(见他的回答)。

的使用CreateRemoteThread()实际上只是其中一种方式。AppInit_DLLs是另一种方式。两者都有其优点和缺点。AppInit_DLLs 的主要优点是在任何进程中注入 DLL 的简单性。AppInit_DLLs 方法的主要缺点如下:

  1. 所有 GUI 应用程序都将加载 DLL。如果您只想在explorer.exe之类的一个进程中加载​​它,则无法执行此操作。所以你的DLL会增加所有GUI进程的工作空间。DLL 中的错误(尤其是在 DLL 内部DllMain或任何依赖 DLL 中)可能会导致许多您当前不知道的进程崩溃。
  2. 您不能在控制台应用程序或任何不依赖 User32.dll 的 EXE 中注入关于 AppInit_DLLs 方法的 DLL。
  3. 你应该在你的内部非常小心DllMain,因为它会在User32.dll 完全初始化之前被调用。因此,您可以在 DLL 中使用的安全DllMainDLL 是 Kernel32.dll。

关于CreateRemoteThread()一个可以在一个进程中启动一个额外的线程。的主要问题CreateRemoteThread()是它的lpStartAddress参数必须是来自远程进程的地址。因此必须使用函数OpenProcessVirtualAllocEx并将WriteProcessMemory一些信息写入目标进程的内存中。为了能够打开一个进程,必须启用调试权限。如果您只想在目标进程中执行 2 + 2,您可以将相应的二进制代码直接复制到目标进程中。所有真正有趣的工作都可以通过使用一些 Windows API 来完成。所以大多数人不复制代码。而不是那个调用LoadLibrary("MyPath\\MyDll.dll") 在目标进程内部。因为 的原型与 的原型LoadLibrary相同ThreadProcCreateThread你可以打电话LoadLibraryThreadProc. CreateRemoteThread()这种方式的名称为DLL Injection

我建议您仅在确实需要时才使用此 DLL 注入。如果您的目标应用程序有其他方式(如插件)在进程中加载​​您的 DLL,您应该使用这种方式而不是 DLL 注入。

在获得 DLL 注入的工作示例后,您必须解决一些一般性问题。这个问题你第一次看是看不到的,但是在你的应用程序长期使用之后你会发现它的重要性:

  1. 您应该找到目标进程已经运行的时刻,然后才能使用CreateRemoteThread().
  2. 在调用之前,目标应用程序必须已经初始化CreateRemoteThread()。所以你不应该CreateRemoteThread()太早使用。在 explorer.exe 的情况下,您可以使用从运行注册表项启动您的小型触发器程序。目前 explorer.exe 已经为 DLL 注入做好了充分的准备。
  3. 您应该考虑 64 位版本的 Windows。
  4. 不要忘记目标进程内的 DLL 重定位。请注意,您的 DLL 可以像在您的进程中一样被加载到另一个地址的目标进程中。大多数情况下,为您将注入的 DLL 选择一个好的基地址(链接器选项)是一个好主意。Kernel32.dll 有时(很少)会加载到源进程中的其他地址。您可以创建一个没有此问题的 DLL 注入代码。
  5. 终端服务通过设计隔离每个终端会话。因此,CreateRemoteThread如果目标进程与调用进程处于不同的会话中,则会失败。如果您尝试从 Windows 服务进行 DLL 注入,您可以在 XP(未连接到域)或 Vista 或 Windows 7 上看到该问题。要解决此问题,您应该从与目标进程在同一终端会话上运行的进程进行 DLL 注入,或者您必须在使用CreateRemoteThread. 您的进程必须SE_TCB_NAME启用权限并使用SetTokenInformation参数TokenSessionId。要获取目标进程的会话 ID,您可以使用不同的方法。带有前缀 WTS(如WTSGetActiveConsoleSessionId)的函数非常有用。

所以一切都不是很容易,但这是一个非常有趣的主题,你可以在其中学习很多关于操作系统的东西。您应该只花一点时间来分析您的问题和解决问题的不同方法,然后再选择一种与您的项目要求相对应的方法并开始编程。

于 2010-06-07T16:51:58.287 回答
1

DLL 注入是执行此操作的传统方法。这很棘手,尤其是因为病毒扫描程序对这种做法持怀疑态度。因此,即使您让它正常工作,Norton/McAfee 也可能会阻止您 - 或在未来阻止您。

DLL 注入的一种简单方法是AppInit_DLLs 注册表值。请注意,Microsoft 保留了简单地删除此功能的权利(并且将来可能会这样做)。

Microsoft 批准的实现 DLL 注入的方法是许可Microsoft Detours

请注意,您的 DLL 必须针对 CLR 4.0 或更高版本构建才能安全地执行 DLL 注入,因为这是第一个支持并行进程的版本。

于 2010-06-07T02:37:29.397 回答
0

我最近没有尝试过,但另一种方法是创建一个 Hook DLL:

  1. 创建一个包含像MessageProc这样的 Hook 过程的 DLL 。

  2. 将此 DLL 安装到 Windows\System32。

  3. 使用 FindWindows(Ex) 定位受害者进程的窗口。

  4. 使用GetWindowThreadProcessId () 查找该窗口的拥有线程。这对于避免将 DLL 注入系统上的每个进程是必要的。

  5. 使用SetWindowsHookEx挂钩该线程。

  6. PostMessage 向窗口发送 WM_USER 消息 - 如果 Hook DLL 尚未激活,则激活它。

如果您不是足够特权的用户,这可能会调用新的Windows Vista/7 UIPI/UAC,但这取决于许多因素 - 您的里程可能会有所不同。

于 2010-06-07T17:08:06.670 回答
0

如果您的意思是将代码注入另一个进程,那么 dll 注入是一种技术:

http://en.wikipedia.org/wiki/DLL_injection

多年来一直没有这样做,所以不确定现代 MS Windows 操作系统(即 XP 后)对此会有多满意。

于 2010-06-07T02:04:44.833 回答