0

通过使用“codecave”技术将代码注入另一个进程;是否可以注入代码来创建一个新线程(并为新线程注入代码)并让该线程与目标进程主线程并行执行?

我可以通过 dll 注入来管理它,但我想知道是否可以通过纯代码注入来实现。

目的首先是了解不同的注入技术,但最终为随机进程创建心跳功能以监督执行(高可用性)。Windows 是目标操作系统,语言是 C/C++(需要时使用内联 ASM)。

谢谢。

4

5 回答 5

0

有 CreateRemoteThread 函数。

于 2011-02-04T08:30:19.590 回答
0

您还可以使用 RtlCreateUserThread 函数来创建远程线程。

于 2013-09-21T07:35:52.833 回答
0

当使用诸如“Winject(调用 CreateRemoteThread 的那个)之类的 DLL 注入加载器时,很容易创建一直保留到目标进程关闭的线程。

只需在函数中创建线程:

void run_thread(void* ass)
{
  // do stuff until process terminates
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD result, LPVOID lpReserved)
{
  HANDLE handle = (HANDLE)_beginthread(run_thread, 0, 0);
}

问候,迈克尔

于 2011-08-08T19:57:04.903 回答
0

当然可以,但是您还必须将远程线程的代码注入进程(例如函数)。将整个函数注入远程进程是一件痛苦的事情,因为没有明确的方法来确定函数的大小。如果注入的代码很小,这种方法会更有效,在这种情况下,您只需注入一个简短的程序集存根,然后调用 CreateRemoteThread。

真的,与直接注入 DLL 相比,这样做有什么好处?您的“心跳”功能可以通过注入的 DLL 轻松实现。(除非有人会告诉我有很大的开销?)

于 2011-08-08T20:05:36.750 回答
0

问题是,即使您将代码注入进程,除非您在注入代码的开头创建一个线程,否则它仍然不会运行。通常,要进行代码注入,您将注入一个完整的 DLL。注入 DLL 的流行方法之一是:

  • 获取目标进程的句柄(EnumProcesses、CreateTool32Snapshot/Process32First/Process32Next、FindWindow/GetWindowThreadProcessId/OpenProcess等)
  • 在目标进程中分配与指向 DLL 路径的字符串长度相同的内存 (VirtualAllocEx)
  • 将指向您的 DLL 路径的字符串写入此分配的内存 (WriteProcessMemory)
  • 在 LoadLibrary 例程中创建一个远程线程(通过 GetModuleHandle/GetProcAddress 获取地址)并将指针作为参数传递给分配的内存(CreateRemoteThread)
  • 释放分配的内存(VirtualFreeEx)
  • 使用 CloseHandle 关闭任何打开的句柄(进程句柄、快照句柄等)

除非有特殊原因要避免使用此方法,否则最好自己复制代码(WriteProcessMemory 并可能设置页面保护 (VirtualProtectEx))。在不加载库的情况下,您将需要手动映射变量、重新定位函数指针以及 LoadLibrary 所做的所有其他工作。

您之前询问过 CreateRemoteThread 的语义。它将在另一个进程中创建一个线程,该线程将继续运行,直到它自己终止或其他事情(有人调用 TerminateThread 或进程终止并调用 ExitProcess 等)。该线程将以与合法创建的线程相同的方式并行运行(上下文切换)。

于 2011-08-08T20:53:39.020 回答