广告
淘宝内部优惠券
当前位置: 开发异常方案库» C/C++ » DLL注入后没法卸载

DLL注入后没法卸载

开发异常方案库  收集整理于:2020-05-27 21:52:00  浏览:66次
最近在学习DLL注入,在使用CreateRemoteThread后可以将DLL注入到进程中,但卸载后却发现DLL还在进程中,请问是怎么回事? BOOL EjectDll(DWORD PID, LPCTSTR DllPath) {     BOOL                    bMore = FALSE, bFound = FALSE;     HANDLE                  hSnapshot = INVALID_HANDLE_VALUE;     HANDLE                  hProcess = NULL;     MODULEENTRY32           me = { sizeof(me)};     LPTHREAD_START_ROUTINE  pThreadProc = NULL;     HMODULE                 hMod = NULL;     hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID);     if (INVALID_HANDLE_VALUE == hSnapshot)     {         _tprintf(L"创建进程快照失败!",GetLastError());         return FALSE;     }     bMore = Module32First(hSnapshot, &me);     for (; bMore; bMore = Module32Next(hSnapshot, &me))//查找模块句柄     {         if (_wcsicmp(me.szModule, DllPath) || _wcsicmp(me.szExePath, DllPath))         {             bFound = TRUE;             break;         }     }     if (!bFound)     {         _tprintf(L"未在被注入进程中发现注入的DLL");         if (hSnapshot != INVALID_HANDLE_VALUE)             CloseHandle(hSnapshot);         return FALSE;     }     hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);     if (!hProcess)     {         _tprintf(L"打开被注入进程失败,未获取进程句柄!",GetLastError());         if (hSnapshot != INVALID_HANDLE_VALUE)             CloseHandle(hSnapshot);         return FALSE;     }     hMod = GetModuleHandle(L"kernel32.dll");     if (hMod == NULL)     {         _tprintf(L"无法获取kernel32.dll的模块句柄!",             GetLastError());         if (hProcess)             CloseHandle(hProcess);         if (hSnapshot != INVALID_HANDLE_VALUE)             CloseHandle(hSnapshot);         return FALSE;     }     pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "FreeLibrary");     if (pThreadProc == NULL)     {         _tprintf(L"获取FreeLibrary函数起始地址失败!",GetLastError());         if (hProcess)             CloseHandle(hProcess);         if (hSnapshot != INVALID_HANDLE_VALUE)             CloseHandle(hSnapshot);         return FALSE;     }     HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, pThreadProc, me.modBaseAddr, 0, NULL);     if (!hThread)     {         _tprintf(L"创建远程线程失败!");         if (hProcess)             CloseHandle(hProcess);         if (hSnapshot != INVALID_HANDLE_VALUE)             CloseHandle(hSnapshot);         return FALSE;     }     if (hSnapshot != NULL)          CloseHandle(hSnapshot);     if (hThread != NULL)          CloseHandle(hThread);     if (hProcess != NULL)          CloseHandle(hProcess);     return TRUE; }

------网友观点--------------------
dll内部自身调用 卸载函数。

------网友观点--------------------
引用 1 楼 smwhotjay 的回复:
dll内部自身调用 卸载函数。
不行,让它自身卸载自己也失败了,DLL还是留在进程里

------网友观点--------------------
引用 1 楼 smwhotjay 的回复:
dll内部自身调用 卸载函数。
使用过FreeLibraryAndExitThread和FreeLibrary,结果注入的进程崩溃了。
发布此文章仅为传递网友分享,不代表本站观点,若侵权请联系我们删除,本站将不对此承担任何责任。
软件开发 程序错误 异常 ybaby.netCopyright © 2020-2026  ybaby 版权所有  桂ICP备17004385号-2 网站地图