【问题标题】:Can't unload an injected dll with loadlibrary (C++)无法使用 loadlibrary (C++) 卸载注入的 dll
【发布时间】:2020-06-30 19:06:23
【问题描述】:

今天我得到了一个 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 的新手,在互联网上没有找到可行的解决方案。

【问题讨论】:

  • 请发送minimal reproducible exampleFreeLibraryAndExitThread 应与 hLibModule 一起调用(由 LoadLibraryLoadLibraryExGetModuleHandleGetModuleHandleEx 返回)。我认为CreateRemoteThread 不会返回兼容的句柄。
  • 所以如果我切换到 LoadLibrary 或 LoadLibraryEx 我可以卸载 dll 吗?
  • 你不能只切换功能。 CreateRemoteThread 创建一个线程,LoadLibrary 加载一个 DLL。我从来没有做过 DLL 注入,所以我不确定库在你的场景中的加载位置。
  • 我的意思是,切换整个注入代码。
  • 我不知道。我从来没有做过注射。

标签: c++ dll loadlibrary dll-injection


【解决方案1】:

您没有正确卸载 DLL。

您在滥用FreeLibraryAndExitThread()。它希望卸载已加载 DLL 的 HMODULE,但您将其提供为远程线程的 HANDLE - 您已经事先通过 CloseHandle() 关闭了它。在任何情况下,FreeLibraryAndExitThread() 都会终止 调用 线程,这不是您在这种情况下想要做的。

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

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

CreateRemoteThread on LoadLibrary and get the HMODULE back

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多