以前写的方法,为了解决:解除流氓软件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;
}
其实就是修改了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;
}
本文介绍了一种解决DLL注入导致目标进程崩溃的方法。通过修改SEH过滤器处理函数来阻止异常报告,防止进程因注入的DLL而崩溃。
5710

被折叠的 条评论
为什么被折叠?



