DLL注入在目标进程

时间:2016-08-27 16:51:58

标签: c++ winapi dll-injection

我试图使用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);

}

1 个答案:

答案 0 :(得分:6)

我认为你正在修改一些概念:基本上你试图在不使用外部DLL的情况下注入一个函数,所以它实际上并不是你在这里做的DLL注入。

这是出了什么问题:

CreateRemoteThread会在目标进程的地址空间内创建一个线程,该线程的执行从函数的第三个参数(lpStartAddress)指向的地址开始。但是,您的injectFunction()在您的注入过程的地址空间,因此目标进程的代码根本不可见。

假设您的injectedFunction()位于注射器进程中的地址0xABCD1234。基本上,你在这里做的是调用目标进程中的地址0xABCD1234,它包含一堆随机代码,并且没有跟踪所有的injectFunction()代码。这可能是非常危险的(好吧,这个随机代码会格式化你的硬盘驱动器或者除了崩溃你的目标进程之外几乎没什么危险的概率非常低,但是,在随机位置执行代码 NOT < / strong>你应该永远做的事情。

你应该做什么:

1)首先,在目标进程中分配一个空间,该空间包含硬盘驱动器中DLL的文件路径(文件路径必须在目标进程中,否则它将不可见)。请使用VirtualAllocExWriteProcessMemory

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);
}