我试图使用CreateRemoteThread()函数来注入一个函数injectFunction()使其在远程进程内运行。
然而,似乎这段代码无法正常工作。一旦注入器程序运行CreateRemoteThread()函数,目标程序就会崩溃。什么出错了指针?
void injectedFunction()
{
MessageBoxA(NULL, "Injection OK", "Injection OK", NULL);
}
void injectionFunction()
{
HANDLE hTargetProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pid);
CreateRemoteThread(hTargetProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)injectedFunction, NULL, NULL, NULL);
}
答案 0 :(得分:6)
我认为你正在修改一些概念:基本上你试图在不使用外部DLL的情况下注入一个函数,所以它实际上并不是你在这里做的DLL注入。
CreateRemoteThread
会在目标进程的地址空间内创建一个线程,该线程的执行从函数的第三个参数(lpStartAddress)指向的地址开始。但是,您的injectFunction()在您的注入过程的地址空间内,因此目标进程的代码根本不可见。
假设您的injectedFunction()
位于注射器进程中的地址0xABCD1234。基本上,你在这里做的是调用目标进程中的地址0xABCD1234,它包含一堆随机代码,并且没有跟踪所有的injectFunction()代码。这可能是非常危险的(好吧,这个随机代码会格式化你的硬盘驱动器或者除了崩溃你的目标进程之外几乎没什么危险的概率非常低,但是,在随机位置执行代码 NOT < / strong>你应该永远做的事情。
1)首先,在目标进程中分配一个空间,该空间包含硬盘驱动器中DLL的文件路径(文件路径必须在目标进程中,否则它将不可见)。请使用VirtualAllocEx
和WriteProcessMemory
。
2)调用CreateRemoteThread,其中LoadLibraryA
为第三个参数,VirtualAllocEx
返回的值为第四个参数(包含DLL文件路径的字符串的地址)。这将创建一个只加载DLL的线程。 DLL将开始运作并完成剩下的工作。
<强> DLL.cpp 强>
extern "C" __declspec(dllexport) VOID injectedFunction(void)
{
MessageBoxA(NULL, "Injection OK", "Injection OK", NULL);
}
<强> Injector.cpp 强>
void injectionFunction()
{
HANDLE hTargetProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pid);
LPVOID lpParameter = VirtualAllocEx(hTargetProcess, NULL, 16, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hTargetProcess, (PBYTE)lpParameter, PATH_OF_YOUR_DLL, SIZE_OF_THE_DLL_PATH, NULL);
CreateRemoteThread(hTargetProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryA, lpParameter, NULL, NULL);
}