gpt4 book ai didi

c++ - Dll 注入(inject)仅在未从 Visual Studio 启动时有效

转载 作者:太空狗 更新时间:2023-10-29 23:07:14 25 4
gpt4 key购买 nike

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

DLL 注入(inject)有效:

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

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

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

注入(inject)代码:

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 运行注入(inject)应用程序时。

最佳答案

终于找到问题了!

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

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

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

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

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

我已将此属性更改为“$(SolutionDir)$(Configuration)\”,现在一切正常。

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

关于c++ - Dll 注入(inject)仅在未从 Visual Studio 启动时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13351691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com