啥也不说了,贴代码:
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;
}