我试图使用CreateMoteThread将DLL注入现有过程。问题是,当该应用程序是从Visual Studio 2010中启动的应用程序时,它根本不起作用。
dll注射作品:
-
手动启动(来自Explorer)
-
手动启动并在注射前附加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)",现在一切都像魅力一样工作。
感谢任何试图帮助我解决这个问题的人,我发现了一些新方法来调试非工作应用程序。