您的位置:首页 > 其它

解除远程dll,屏蔽GP的方法

2007-08-08 15:55 330 查看
以前写的方法,为了解决:解除流氓软件inject到其他进程中的dll,导致目标进程(Explorer)崩溃的问题.
其实就是修改了SEH filter的处理函数,让他什么也不做,到达异常情况不报告~
如果不明白SEH问题,请参阅任何一本内核编程的书籍(ring3下fs指向TEB,具体描述在ldt中)

DWORD WINAPI InjectForFreeDll(IN LPINJECT_DATA lpData)
{
HMODULE hDestDll = NULL;
DWORD bResult = 1;

pfn_LoadLibrary LoadLibrary = NULL;
pfn_FreeLibrary FreeLibrary = NULL;
pfn_Sleep Sleep = NULL;

LPTOP_LEVEL_EXCEPTION_FILTER pOldfilter = NULL;
pfn_SetUnhandledExceptionFilter SetUnhandledExceptionFilter = NULL;

do
{
LoadLibrary = lpData->LoadLibrary;
FreeLibrary = lpData->FreeLibrary;
SetUnhandledExceptionFilter = lpData->SetUnhandledExceptionFilter;
Sleep = lpData->Sleep;

if (!(LoadLibrary && FreeLibrary && Sleep && SetUnhandledExceptionFilter))
break;

//push offset InjectUnhandledExceptionFilter;
//push fs:[0]
//mov fs:[0], esp
//add esp, 4
pOldfilter = SetUnhandledExceptionFilter(InjectUnhandledExceptionFilter);

HMODULE hDestDll = LoadLibrary(lpData->szDllPath);
if (hDestDll == NULL)
break;

do
{
if (!FreeLibrary(hDestDll))
{
if (GetLastError() == ERROR_MOD_NOT_FOUND)
{
bResult = 0;
}
break;
}

}while(1);

//2秒钟内的GP都给屏蔽掉
Sleep(2000);

//pop fs:[0]
SetUnhandledExceptionFilter(pOldfilter);

}while(0);

return bResult;
}

//啥也不处理,要的就是这种效果
LONG WINAPI InjectUnhandledExceptionFilter(IN struct _EXCEPTION_POINTERS* ExceptionInfo)
{
return -1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: