无法使用加载库卸载注入的 dll (C++)

Can't unload an injected dll with loadlibrary (C++)

本文关键字:dll C++ 注入 卸载 加载      更新时间:2023-10-16

今天我得到了一个 LoadLibraryA 注入器,它运行良好,但它不允许在注入后删除 dll(加载库的东西(,我尝试做 FreeLibraryAndExitThread,但它不起作用。

我尝试的代码:FreeLibraryAndExitThread(hThread, 0);

注入代码:

const char* procName = "notepad.exe";
DWORD procID = 0;
while (!procID)
{
procID = GetProcID(procName);
Sleep(30);
}
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, procID);
if (hProc && hProc != INVALID_HANDLE_VALUE)
{
void* loc = VirtualAllocEx(hProc, 0, MAX_PATH, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (loc)
{
WriteProcessMemory(hProc, loc, dllPath, strlen(dllPath) + 1, 0);
}
HANDLE hThread = CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, loc, 0, 0);
if (hThread)
{
CloseHandle(hThread);
}
if (hProc)
{
CloseHandle(hProc);
}

FreeLibraryAndExitThread(hThread, 0);
return 0;
}

顺便说一句,很抱歉有愚蠢的问题,我是 cpp 的新手,在互联网上找不到有效的解决方案。

您没有正确卸载 DLL。

您滥用FreeLibraryAndExitThread(). 它期望加载的 DLL 的HMODULE卸载,但您改为为其提供远程线程的HANDLE- 您已经事先通过CloseHandle()关闭了该线程。 无论如何,FreeLibraryAndExitThread()终止调用线程,这不是您在这种情况下想要执行的操作。

您需要等待LoadLibrary()完全完成。 创建远程线程后,使用WaitForSingleObject()或相关函数等待线程HANDLE

之后,您可以将调用 toFreeLibrary()注入到远程进程的上下文中,将LoadLibrary()返回的HMODULE传递给它 - 您当前没有。 使用LoadLibrary()作为线程过程时,线程的退出代码将包含返回的HMODULE。 如果目标是 32 位进程,则可以使用GetExitCodeThread()检索该HMODULE。 但是,如果您的目标是 64 位进程,事情会变得更加复杂,因为线程的退出代码将截断HMODULE值。

请参阅 LoadLibrary 上的 CreateRemoteThread 并取回 HMODULE。

我不太确定你想要什么,但你不能这样做,因为你关闭了句柄:

if (hThread)
{
CloseHandle(hThread);
} 
...
FreeLibraryAndExitThread(hThread, 0);