3

我正在尝试使用 CreateRemoteThread 将 DLL 注入现有进程。问题是当应用程序从 Visual Studio 2010 中启动时,它根本不起作用。

DLL 注入的工作原理:

  1. 手动启动时(从资源管理器)

  2. 当手动启动它并在注入前附加 VS 2010 调试器时。

当我选择:在 Visual Studio 2010 中开始调试 (F5) 时,CreateRemoteThread 返回 OK。我什至在注入过程中在 LoadLibraryA 上放置了一个断点,它被命中了。所以线程启动了,但它没有到达 DllMain函数。LoadLibraryA 被执行,但模块不会被加载。

注入代码:

void InjectDll(DWORD processId, string dllFile)
{
    HANDLE hProcess = OpenProcess(CREATE_THREAD_ACCESS, FALSE, processId);
    if ( hProcess != NULL )
    {
        int lenWrite = dllFile.length();
        LPVOID allocMem = (LPVOID)VirtualAllocEx(hProcess, NULL, lenWrite, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
        WriteProcessMemory(hProcess, allocMem , dllFile.c_str(), lenWrite, NULL);
        LPTHREAD_START_ROUTINE injector = (LPTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); 

        if(!injector)
            return;
        DWORD threadId;
        HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, injector, allocMem, 0, &threadId);

        DWORD Result = WaitForSingleObject(hThread, 10*1000); //Time out : 10 secondes
        VirtualFreeEx(hProcess, allocMem, lenWrite, MEM_RELEASE);
        CloseHandle(hProcess);
        CloseHandle(hThread);
    }
}

和 DllMain 代码:

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            HelloWorldMessageBox();
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

感谢帮助!

编辑:

我使用 ollyDbg 在 LoadLibraryA 上放置断点。我已将汇编指令“ret”替换为对 GetLastError 的调用,并且在 EAX 寄存器中得到以下值:126。从 MSDN 系统错误代码 126 表示 ERROR_MOD_NOT_FOUND(找不到指定的模块。)。很奇怪,它只在 Visual Studio 运行注入应用程序时发生。

4

1 回答 1

1

终于我发现了问题!

获取我使用的完整模块路径

GetFullPathName("Inj_DLL.dll", MAX_PATH, dll_path, NULL);

它使用当前工作目录来确定文件路径。

当我手动启动应用程序时,工作目录是 exe 文件的路径,但是当它从 Visual Studio 启动时,它使用项目属性->配置属性->调试中的工作目录。

由于默认设置为“$(ProjectDir)”,并且注入的dll在Debug/Release目录下,所以找不到dll文件,所以报错126 ERROR_MOD_NOT_FOUND。

我已将此属性更改为“$(SolutionDir)$(Configuration)\”,现在一切都像魅力一样。

感谢任何试图帮助我解决这个问题的人,我发现了一些调试非工作应用程序的新方法。

于 2012-11-13T22:31:33.303 回答