您好,我想从注入该进程的过程中卸载该dll,该怎么办?这是我注入dll进行处理的方式:
这只是我的演示,我如何将我的dll注入到进程中,但是如果我的注入方法是这个,如何从进程中卸载/卸载该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";
}
答案 0 :(得分:0)
您正在使用CreateRemoteThread
在运行“ LoadLibraryA”的目标进程中启动线程。
我不知道为什么评论者不喜欢您的注入代码。在我看来还可以。我认为您正确关闭了该线程,但是我建议在GetExitCodeThread
之后添加WaitForSingleObject
调用,这将为您提供LoadLibrary
的返回代码,以便您检查错误。您无法在该句柄上调用FreeLibrary
,因为进程不同。 GetLastError也不起作用。但是至少您可以与nullptr
进行比较以检测失败。
DLL保持加载的原因是没有人称FreeLibrary
。
在DLL_PROCESS_ATTACH
情况下,在DLL的DllMain中的一种模式在此情况下,再创建一个远程线程。这次无需使用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
启动新线程。