Dll Injection仅在不从Visual Studio启动时才起作用

时间:2012-11-12 21:16:18

标签: c++ visual-studio-2010 dll dll-injection

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

DLL注入工作:

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

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

  3. 当我选择:在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运行注入应用程序时才会发生。

1 个答案:

答案 0 :(得分:2)

最后我发现了问题!

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

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

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

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

由于默认设置为“$(ProjectDir)”,并且注入的dll位于Debug / Release目录中,因此无法找到dll文件,因此错误126 ERROR_MOD_NOT_FOUND。

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

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