DLL 注入在目标进程中不起作用
DLL injection doesn't work in target process
我正在尝试使用 CreateRemoteThread() 函数来注入函数 injectedFunction() 并使其 运行 进入远程进程。
不过,这段代码好像不行。一旦注入程序 运行 调用 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);
}
我认为您混淆了一些概念:基本上您是在尝试在不使用外部 DLL 的情况下注入一个函数,因此您在这里进行的并不是真正的 DLL 注入。
这是出了什么问题:
CreateRemoteThread
确实在目标进程space 的地址space 中创建了一个线程,它的执行从函数的第三个参数指向的地址开始(lpStartAddress)。但是,您的 injectedFunction() 位于注入器进程space的地址内,因此它的代码对于目标进程根本不可见。
假设您的 injectedFunction()
在您的注入器进程中位于地址 0xABCD1234。基本上,您在这里所做的是调用 目标进程 中的地址 0xABCD1234,其中包含一堆随机代码并且完全没有 injectedFunction() 代码的踪迹。这可能非常危险(好吧,这个随机代码格式化你的硬盘驱动器或做任何除了崩溃你的目标进程之外几乎没有危险的可能性非常低,但是,在随机位置执行代码仍然是 不是你应该曾经做的事情。
你应该做什么:
1) 首先在目标进程中分配一个space,其中包含你硬盘中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);
}
我正在尝试使用 CreateRemoteThread() 函数来注入函数 injectedFunction() 并使其 运行 进入远程进程。
不过,这段代码好像不行。一旦注入程序 运行 调用 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);
}
我认为您混淆了一些概念:基本上您是在尝试在不使用外部 DLL 的情况下注入一个函数,因此您在这里进行的并不是真正的 DLL 注入。
这是出了什么问题:
CreateRemoteThread
确实在目标进程space 的地址space 中创建了一个线程,它的执行从函数的第三个参数指向的地址开始(lpStartAddress)。但是,您的 injectedFunction() 位于注入器进程space的地址内,因此它的代码对于目标进程根本不可见。
假设您的 injectedFunction()
在您的注入器进程中位于地址 0xABCD1234。基本上,您在这里所做的是调用 目标进程 中的地址 0xABCD1234,其中包含一堆随机代码并且完全没有 injectedFunction() 代码的踪迹。这可能非常危险(好吧,这个随机代码格式化你的硬盘驱动器或做任何除了崩溃你的目标进程之外几乎没有危险的可能性非常低,但是,在随机位置执行代码仍然是 不是你应该曾经做的事情。
你应该做什么:
1) 首先在目标进程中分配一个space,其中包含你硬盘中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);
}