您现在的位置是:首页 > 互联网 > 正文

蓝屏失败的操作fltmgr.sys(TsFltMgr.sys系统蓝屏的原因分析(小心QQ电脑管家))

发布时间:2022-05-03 00:19:03来源:

导读 大家好,小太来为大家解答以上问题。蓝屏失败的操作fltmgr sys,TsFltMgr sys系统蓝屏的原因分析(小心QQ电脑管家)这个很多人还不知道,现在

大家好,小太来为大家解答以上问题。蓝屏失败的操作fltmgr.sys,TsFltMgr.sys系统蓝屏的原因分析(小心QQ电脑管家)这个很多人还不知道,现在让我们一起来看看吧!

一个同事的WindowsXP系统运行正常。关机后,第二天就无法启动了。详细症状如下:

(1)安全模式和具有网络功能的安全模式都可以访问;(2)正常模式,在WindowXP滚动条出现前重启;(3)进入安全模式,禁用自启动,然后正常启动。出现蓝屏,报错TsFltMgr.sys内存错误!

经过网上查询,不断摸索,终于发现其实是可恶的QQ软件管家的诅咒。进入安全模式,果断卸载QQ软件管家后,重启,系统完全正常。

一、以下转载了一篇分析QQ电脑管家的文章,请參考:

QQ电脑管家中TsFltMgr钩子框架分析

新版QQ电脑管理器中有一个名为TsFltMgr.sys的驱动程序(应该是Sysnap大牛开发的,拜)。这个驱动简单分析一下,看到一个漂亮的钩子框架,发出来和大家分享一下。请原谅我不正确的分析。首先,TsFltMgr挂钩KiFastCallEntry函数,挂钩点在这里:

代码:

复制代码如下:kduKiFastCallEntrye3nt!KiFastCallEntry0xe:8053dbb3c1e902SHRecx,2-8053dbb690nop8053dbb790nop8053dbb890nop8053dbb9e962170c77jmpTsFltMgr0x2320(f75ff320)-8053dbb0f83a8010000jaent!kisystemcallexit20x9f(8053d6c)8053DBC4F3a5repmovsdwordptres:[EDI],dwordptr[ESI]8053DBC6ffd3callebx

原KiFastCallEntry应该是MOVEDI,ESP在shrecx,2指令之后;Cmpesi,MmUserProbeAddress,共8个字节,这里被TsFltMgr替换为3个nop和1个jmp。

jmp会跳转到kifastcollection_Detroit函数,kifastcollection_Detroit函数的代码如下:

代码:

复制代码如下://保存现场pushfdpushad/p

P//调用KiFastCallEntry_Filter函数,实现pushedi//本次系统调用中对应SysCall表的地址(SSDT或SSDTShadow的地址)pushebx//本次系统调用中对应SysCall表中的内核函数地址pusheax//本次系统调用SysCall表中对应内核函数的函数号callkifastcollection_Filter//,调用KiFastCallEntry_Filter过滤mov[esp10h],eax///本次调用中对应内核函数的地址发生变化!/p

P//在站点上还原popadpopfd/p/p

P//运行KiFastCallEntry函数中被替换的指令,跳回原函数Movedi,ESPCMPESI,G_7FFF0000PushG_JMPBackret。

这里需要注意的是,mov[esp10h],eax在调用KiFastCallEntry_Filter之后。在保存场景时,前面的命令pushad将导致寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI按顺序堆叠,这些寄存器的值将由下面的popad命令恢复。所以mov[esp10h],这里的eax实际上是用KiFastCallEntry_Filter函数的返回值重写了堆栈中存储的ebx的值,也就是重写了这个系统调用对应的内核函数地址。

KiFastCallEntry_Filter是一个真正实现过滤的函数。上面已经解释了这个函数的参数和返回值。在分析整理了它的详细实现后,C语言是这样描述的:

代码:

复制代码如下:ULONG__STDCALLKIFASTCALLENTRY_FILTER(ULONGULSYSCALID,ULON

这里须要说明的是,TsFltMgr内部有一张表,暂且命名为g_FakeSysCallTable,该表中存放的是指向FAKE_SYSCALL结构的指针。表中的每个FAKE_SYSCALL结构相应一个系统调用,表的前半部分相应SSDT中的系统调用,1024项以后相应ShadowSSDT里的系统调用。

当中FAKE_SYSCALL结构大致例如以下(当中非常多域的作用没弄明确):

代码:

复制代码代码如下:typedefstruct__FAKE_SYSCALL__{ULONGxxx1;ULONGulSyscallId;//该系统调用的功能号ULONGxxx3;ULONGulTableIndex;ULONGxxx5;ULONGulCountForPreWork;ULONGulCountForPostWork;ULONGxxx8;ULONGulOrigSysCallAddr;//真实的系统调用地址ULONGulFakeSysCallAddr;//假的系统调用地址ULONGxxx11;ULONGxxx12;ULONGxxx13;……}FAKE_SYSCALL,*PFAKE_SYSCALL,**PPFAKE_SYSCALL;

因此KiFastCallEntry_Filter函数的所做的就是依据系统调用的功能号在g_FakeSysCallTable中索引出相应的pFakeSysCall对象,然后推断该系统调用是否须要hook,假设须要则将真实的系统调用地址保存到pFakeSysCall->ulOrigSysCallAddr中,并将pFakeSysCall->ulFakeSysCallAddr作为假系统调用的地址返回。

这样的调用过程中动态获取真实系统调用地址的方法使TsFltMgr的Hook框架有较高的兼容性,比如不会使载入顺序晚于TsFltMgr的驱动中的SSDTHook失效,比如QQ电脑管家本身带的TSKsp.sys驱动。

对于我的測试系统(XP_SP2),TsFltMgrhook的函数有:

代码:

复制代码代码如下://SSDT中:NtCreateFile、NtCreateKey、NtCreateSection、NtCreateSymbolicLinkObject、NtCreateThread、NtDeleteFile、NtDeleteKey、NtDeleteValueKey、NtDeviceIoControlFile、NtDuplicateObject、NtEnumerateValueKey、NtLoadDriver、NtOpenProcess、NtOpenSection、NtProtectVirtualMemory、NtQueryValueKey、NtRequestWaitReplyPort、NtSetContextThread、NtSetInformationFile、NtSetSystemInformation、NtSetValueKey、NtSuspendThread、NtSystemDebugControl、NtTerminateProcess、NtTerminateThread、NtWriteFile、NtWriteVirtualMemory</p> <p>//ShadowSSDT中:NtUserBuildHwndList、NtUserFindWindowEx、NtUserGetForegroundWindow、NtUserMoveWindow、NtUserQueryWindow、NtUserSendInput、NtUserSetParent、NtUserSetWindowLong、NtUserSetWindowPlacement、NtUserSetWindowPos、NtUserShowWindow、NtUserShowWindowAsync、NtUserWindowFromPoint

全部假系统函数都有统一的代码框架,假系统函数的代码框架大致例如以下:

本文到此结束,希望对大家有所帮助。

标签:

上一篇
下一篇