通过使用“codecave”技术将代码注入另一个进程;是否可以注入代码来创建一个新线程(并为新线程注入代码)并让该线程与目标进程主线程并行执行?
我可以通过 dll 注入来管理它,但我想知道是否可以通过纯代码注入来实现。
目的首先是了解不同的注入技术,但最终为随机进程创建心跳功能以监督执行(高可用性)。Windows 是目标操作系统,语言是 C/C++(需要时使用内联 ASM)。
谢谢。
通过使用“codecave”技术将代码注入另一个进程;是否可以注入代码来创建一个新线程(并为新线程注入代码)并让该线程与目标进程主线程并行执行?
我可以通过 dll 注入来管理它,但我想知道是否可以通过纯代码注入来实现。
目的首先是了解不同的注入技术,但最终为随机进程创建心跳功能以监督执行(高可用性)。Windows 是目标操作系统,语言是 C/C++(需要时使用内联 ASM)。
谢谢。
有 CreateRemoteThread 函数。
您还可以使用 RtlCreateUserThread 函数来创建远程线程。
当使用诸如“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);
}
问候,迈克尔
当然可以,但是您还必须将远程线程的代码注入进程(例如函数)。将整个函数注入远程进程是一件痛苦的事情,因为没有明确的方法来确定函数的大小。如果注入的代码很小,这种方法会更有效,在这种情况下,您只需注入一个简短的程序集存根,然后调用 CreateRemoteThread。
真的,与直接注入 DLL 相比,这样做有什么好处?您的“心跳”功能可以通过注入的 DLL 轻松实现。(除非有人会告诉我有很大的开销?)
问题是,即使您将代码注入进程,除非您在注入代码的开头创建一个线程,否则它仍然不会运行。通常,要进行代码注入,您将注入一个完整的 DLL。注入 DLL 的流行方法之一是:
除非有特殊原因要避免使用此方法,否则最好自己复制代码(WriteProcessMemory 并可能设置页面保护 (VirtualProtectEx))。在不加载库的情况下,您将需要手动映射变量、重新定位函数指针以及 LoadLibrary 所做的所有其他工作。
您之前询问过 CreateRemoteThread 的语义。它将在另一个进程中创建一个线程,该线程将继续运行,直到它自己终止或其他事情(有人调用 TerminateThread 或进程终止并调用 ExitProcess 等)。该线程将以与合法创建的线程相同的方式并行运行(上下文切换)。