啥也不说了,贴代码:
#include "stdafx.h" #define MAX_MODULE_NAME_LEN 16 // 传入到远程线程中的参数结构定义 typedef struct tagThreadParam { DWORD dwFreeLibrary; // FreeLibrary 地址 DWORD dwGetModuleHandle; // GetModuleHandle 地址 TCHAR szModuleName[MAX_MODULE_NAME_LEN];// 需要卸载的模块的名称 }ThreadParam,*PThreadParam; /* 远程线程函数 */ void RemoteThreadFun(PThreadParam PParam) { DWORD dwFreeLibrary; DWORD dwGetModuleHandle; DWORD dwModuleName; dwFreeLibrary = PParam->dwFreeLibrary; dwGetModuleHandle = PParam->dwGetModuleHandle; dwModuleName = (DWORD)PParam->szModuleName; // 释放的最高次数 DWORD dwCount = 100; // 循环寻找指定模块的句柄,如果找到,那么调用FreeLibrary释放, // 直到该模块被释放 __asm { START: push dwModuleName; // 模块名称压栈 call dwGetModuleHandle; // 调用GetModuleHandle test eax,eax; // jz OVER; // 没有找到模块返回 dec dwCount; jz OVER; // 达到最高次数 push eax; // 模块句柄压栈 call dwFreeLibrary; // 调用FreeLibrary test eax,eax; jnz START; OVER: } return; } /* 调整权限 */ bool AdjustPurview() { TOKEN_PRIVILEGES TokenPrivileges; bool bRet; HANDLE hToken; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &TokenPrivileges.Privileges[0].Luid); OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); TokenPrivileges.PrivilegeCount = 1; TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; bRet = !!AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, 0, NULL, NULL); CloseHandle(hToken); return bRet ; } BOOL FreeModuleByPid(TCHAR * szModuleName,DWORD dwPid) { // 参数构造 ThreadParam Param = ...{0}; Param.dwFreeLibrary = (DWORD)FreeLibrary; Param.dwGetModuleHandle = (DWORD)GetModuleHandleA; MoveMemory(Param.szModuleName,szModuleName,MAX_MODULE_NAME_LEN); // 打开指定的进程 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid); if(hProcess==NULL) { OutputDebugString(_T("OpenProcess failed!!")); return FALSE; } // 参数写入 LPVOID lpParam = NULL; lpParam = VirtualAllocEx(hProcess,NULL,sizeof(Param),MEM_COMMIT,PAGE_READWRITE); if (lpParam == NULL) { return FALSE; } if (!WriteProcessMemory(hProcess,lpParam,&Param,sizeof(Param),0)) { VirtualFreeEx(hProcess,lpParam,0,MEM_RELEASE); return FALSE; } // 函数写入 LPVOID lpThread = NULL; lpThread = VirtualAllocEx(hProcess,NULL,0x100,MEM_COMMIT,PAGE_EXECUTE_READWRITE); if (lpThread == NULL) { return FALSE; } if (!WriteProcessMemory(hProcess,lpThread,RemoteThreadFun,0x100,0)) { VirtualFreeEx(hProcess,lpThread,0,MEM_RELEASE); return FALSE; } // 创建线程 HANDLE hThread = NULL; hThread = CreateRemoteThread(hProcess,0,0,(LPTHREAD_START_ROUTINE)lpThread,lpParam,0,NULL); if(hThread == NULL) { return FALSE; } // 等待线程结束 WaitForSingleObject(hThread,INFINITE); // 清理工作 VirtualFreeEx(hProcess,lpThread,0,MEM_RELEASE); VirtualFreeEx(hProcess,lpParam,0,MEM_RELEASE); CloseHandle(hProcess); return TRUE; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { AdjustPurview(); TCHAR * szModuleName = _T("AcroIEHelper.dll"); DWORD dwPid = 1128; FreeModuleByPid(szModuleName,dwPid); return 0; }