您好我想从它注入的进程中卸载这个dll,我该怎么做?这就是我如何注入dll来处理:
这只是我展示了我如何将我的dll注入一个进程,但如果我的注入方法是这个,如何从进程中卸载/ UNINJECT这个dll
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, false, GetProcessIdByName("csgo.exe"));
if (h)
{
LPVOID LoadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
//cout << "[!] Initialized Library\n";
LPVOID dereercomp = VirtualAllocEx(h, NULL, strlen(dllName), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
//cout << "[!] Initialized memory allocation\n";
WriteProcessMemory(h, dereercomp, dllName, strlen(dllName), NULL);
//cout << "[!] Wrote dll name to memory: " << strlen(dllName) << " byte(s)\n";
HANDLE asdc = CreateRemoteThread(h, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, dereercomp, 0, NULL);
//cout << "[!] Created remote thread: " << asdc << endl;
//cout << "[!] Waiting for Dll exit...\n";
WaitForSingleObject(asdc, INFINITE);
VirtualFreeEx(h, dereercomp, strlen(dllName), MEM_RELEASE);
//cout << "[!] Freeing memory\n";
CloseHandle(asdc);
CloseHandle(h);
//cout << "[!] Closed all handles\n";
//cout << "[!] Complete!\n";
}
您正在使用CreateRemoteThread
在目标进程中启动运行“LoadLibraryA”的线程。
我不知道为什么评论者不喜欢你的注射代码。看起来对我好。我认为你正在关闭该线程,但是我建议在GetExitCodeThread
之后添加WaitForSingleObject
调用,这将为你提供LoadLibrary
的返回码,这样你就可以检查错误。你不能在那个句柄上调用FreeLibrary
,因为不同的进程。 GetLastError也不起作用。但至少你可以与nullptr
比较来检测失败。
DLL保持加载的原因是没有人调用FreeLibrary
。
这里的一个模式,在你的DLL的DllMain中,在DLL_PROCESS_ATTACH
的情况下,创建一个更远程的线程。这次不需要使用CreateRemoteThread
,只需调用正常的CreateThread
,因为该代码已在目标进程中运行。在返回的句柄上立即调用CloseHandle
(这不会杀死新线程只是释放句柄)。现在在第二个远程线程中,在目标进程中执行任何您想要执行的操作,完成后,调用FreeLibraryAndExitThread API。这将退出第二个远程线程,同时从目标进程卸载DLL。
更多信息:DllMain entry point对于DLL,HINSTANCE与HMODULE相同,只是将第一个参数转换为HMODULE并将该参数保存在某个变量中以传递给FreeLibraryAndExitThread
。
更新:正如评论者所说,理想情况下,您需要分配和复制一个额外的字符。在两种情况下,只需用strlen(dllName)
替换strlen(dllName)+1
。
更新2:顺便说一句,在DLL_PROCESS_ATTACH处理程序中首先调用DisableThreadLibraryCalls通常是一个好主意。特别是如果你然后从你的DllMain
发布新线程。