从进程中卸载dll

问题描述 投票:-3回答:1

您好我想从它注入的进程中卸载这个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";
}
c++ winapi
1个回答
0
投票

您正在使用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发布新线程。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.