DLL注入仅在没有从视觉工作室开始时起作用

Dll Injection works only when not started from Visual Studio

本文关键字:视觉 工作室 开始时 起作用 注入 DLL      更新时间:2023-10-16

我试图使用CreateMoteThread将DLL注入现有过程。问题是,当该应用程序是从Visual Studio 2010中启动的应用程序时,它根本不起作用。

dll注射作品:

  1. 手动启动(来自Explorer)

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

当我选择:在Visual Studio 2010中开始调试(F5)时,CreateMoteThread返回正常。我什至在注入的过程中在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"的汇编指令" ret"更换为呼叫getlasterror,并且我在eax寄存器中获得了以下值:126。从MSDN系统错误代码126表示error_mod_not_found(找不到指定的模块。)。只有在Visual Studio运行注入式应用时才发生。

才会发生。

最后我发现了问题!

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

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

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

当我手动启动应用程序时,工作目录是exe文件的路径,但是当它从Visual Studio启动时,它会使用Project Properties-> Configuration Properties-> debugging的工作目录。

由于默认情况下将其设置为" $(projectDir)",并且注入的DLL在调试/发行DIR中,因此找不到DLL文件,因此ERROR 126 ERROR_MOD_MOD_NOT_FOUND。

我已将此属性更改为" $(solutiondir)$(configuration)",现在一切都像魅力一样工作。

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