从进程中卸载dll

时间:2019-02-24 10:16:33

标签: c++ winapi

您好,我想从注入该进程的过程中卸载该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";
}

1 个答案:

答案 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启动新线程。