范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

TsFltMgr。sys系统蓝屏的原因是什么

  同事一WindowsXP系统,正常执行,关闭后,第二天无法启动,详细症状为:
  (1)安全模式以及带网络功能的安全模式都能够进入;
  (2)正常模式,还没出现WindowXP滚动栏就?始重新启动;
  (3)进安全模式,禁用自己主动重新启动后,再正常启动,出现蓝屏,报TsFltMgr.sys内存错误!
  经过互联网查询,和不断摸索,最后发现居然是可恶的QQ软件管家惹的祸,进安全模式果断卸载QQ软件管家后,再重新启动,系统全然正常了。
  以下转载了一篇分析QQ电脑管家的文章,请参考:
  QQ电脑管家中的TsFltMgr Hook框架分析
  新版的QQ电脑管家中多了一个名字叫TsFltMgr.sys的驱动,对该驱动进行了一些简单的分析,看见了一套美丽的Hook框架,发出来与大家分享。分析不正确的地方请多多包涵。
  首先TsFltMgr挂钩了KiFastCallEntry函数,Hook点在这里:
  代码:
  复制代码
  代码如下:
  kd> u KiFastCallEntry+e3
  nt!KiFastCallEntry+0xe3:
  8053dbb3 c1e902 shr ecx,2
  -------------------------------------------------------------------------
  8053dbb6 90 nop
  8053dbb7 90 nop
  8053dbb8 90 nop
  8053dbb9 e962170c77 jmp TsFltMgr+0x2320 (f75ff320)
  -------------------------------------------------------------------------
  8053dbbe 0f83a8010000 jae nt!KiSystemCallExit2+0x9f (8053dd6c)
  8053dbc4 f3a5 rep movs dword ptr es:[edi],dword ptr [esi]
  8053dbc6 ffd3 call ebx
  原始的KiFastCallEntry在 shr ecx, 2 指令后面应该是 mov edi,esp;cmp esi, MmUserProbeAddress,共8个字节,在这里被 TsFltMgr 替换成了3个nop和一个jmp。
  该jmp会跳转到 KiFastCallEntry_Detour 函数中,KiFastCallEntry_Detour 函数代码例如以下:
  代码:
  复制代码
  代码如下:
  // 保存现场
  pushfd
  pushad
  // 调用 KiFastCallEntry_Filter 函数,实现过滤
  push edi // 本次系统调用相应的SysCall Table的地址(SSDT或SSDTShadow的地址)
  push ebx // 本次系统调用在SysCall Table中相应的内核函数地址
  push eax // 本次系统调用相应的内核函数在SysCall Table中的功能号
  call KiFastCallEntry_Filter // 调用KiFastCallEntry_Filter,实现过滤
  mov [esp+10h], eax // 更改本次调用相应的内核函数地址!
  // 恢复现场
  popad
  popfd
  // 运行 KiFastCallEntry 函数中被替换掉的指令,并跳回原函数
  mov edi,esp
  cmp esi, g_7fff0000
  push g_JmpBack
  ret
  这里须要注意的是 call KiFastCallEntry_Filter 之后的 mov [esp+10h], eax。之前保存现场时的指令pushad会导致寄存器EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI依次入栈,并通过后面的popad指令恢复这些寄存器的值。因此此处的mov [esp+10h], eax实际上是用 KiFastCallEntry_Filter 函数的返回值来改写堆栈中保存的ebx的值,即改写本次系统调用相应的内核函数地址。
  KiFastCallEntry_Filter 是真正实现过滤的函数,该函数的?数和返回值上文已经说明了,其详细实现分析整理后,C语言描写叙述例如以下:
  代码:
  复制代码
  代码如下:
  ULONG __stdcall KiFastCallEntry_Filter(ULONG ulSyscallId, ULONG ulSyscallAddr, PULONG pulSyscallTable)
  {
  PFAKE_SYSCALL pFakeSysCall = NULL;
  if ( ulSyscallId >= 0x400 )
  return ulSyscallAddr;
  if ( pulSyscallTable == g_KiServiceTable && ulSyscallId <= g_ServiceNum/* 0x11c */ )
  {
  pFakeSysCall = g_FakeSysCallTable[ulSyscallId]; // SSDT
  }
  else if (pulSyscallTable == g_KeServiceDescriptorTable &&
  g_KeServiceDescriptorTable && ulSyscallId <= g_ServiceNum/* 0x11c */)
  {
  pFakeSysCall = g_FakeSysCallTable[ulSyscallId]; // SSDT
  }
  else if (pulSyscallTable == g_W32pServiceTableAddr && ulSyscallId <= g_ShadowServiceNum/* 0x29b */)
  {
  pFakeSysCall = g_FakeSysCallTable[ulSyscallId + 1024]; // ShadowSSDT
  }
  if ( pFakeSysCall && pFakeSysCall->ulFakeSysCallAddr )
  {
  pFakeSysCall->ulOrigSysCallAddr = ulSyscallAddr;
  return pFakeSysCall->ulFakeSysCallAddr;
  }
  return ulSyscallAddr;
  }
  这里须要说明的是,TsFltMgr内部有一张表,暂且命名为 g_FakeSysCallTable,该表中存放的是指向 FAKE_SYSCALL 结构的指针。表中的每个 FAKE_SYSCALL 结构相应一个系统调用,表的前半部分相应SSDT中的系统调用,1024项以后相应ShadowSSDT里的系统调用。
  当中 FAKE_SYSCALL 结构大致例如以下(当中非常多域的作用没弄明确):
  代码:
  复制代码
  代码如下:
  typedef struct __FAKE_SYSCALL__ {
  ULONG xxx1;
  ULONG ulSyscallId; // 该系统调用的功能号
  ULONG xxx3;
  ULONG ulTableIndex;
  ULONG xxx5;
  ULONG ulCountForPreWork;
  ULONG ulCountForPostWork;
  ULONG xxx8;
  ULONG ulOrigSysCallAddr; // 真实的系统调用地址
  ULONG ulFakeSysCallAddr; // 假的系统调用地址
  ULONG xxx11;
  ULONG xxx12;
  ULONG xxx13;
  ……
  } FAKE_SYSCALL, *PFAKE_SYSCALL, **PPFAKE_SYSCALL;
  因此 KiFastCallEntry_Filter 函数的所做的就是依据系统调用的功能号在 g_FakeSysCallTable 中索引出相应的 pFakeSysCall 对象,然后推断该系统调用是否须要hook,假设须要则将真实的系统调用地址保存到 pFakeSysCall->ulOrigSysCallAddr 中,并将 pFakeSysCall->ulFakeSysCallAddr 作为假系统调用的地址返回。
  这样的调用过程中动态获取真实系统调用地址的方法使 TsFltMgr 的Hook框架有较高的兼容性,比如不会使载入顺序晚于TsFltMgr的驱动中的SSDT Hook失效,比如QQ电脑管家本身带的TSKsp.sys驱动。
  对于我的?试系统(XP_SP2),TsFltMgr hook的函数有:
  代码:
  复制代码
  代码如下:
  // 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
  // ShadowSSDT中:
  NtUserBuildHwndList、NtUserFindWindowEx、NtUserGetForegroundWindow、NtUserMoveWindow、NtUserQueryWindow、NtUserSendInput、NtUserSetParent、NtUserSetWindowLong、NtUserSetWindowPlacement、NtUserSetWindowPos、NtUserShowWindow、NtUserShowWindowAsync、NtUserWindowFromPoint
  全部假系统函数都有统一的代码框架,假系统函数的代码框架大致例如以下:
  代码:
  复制代码
  代码如下:
  NTSTATUS __stdcall FakeNt_XXX(xxx)
  {
  PFAKE_SYSCALL pFakeSysCall;
  ULONG ulXXX = 0;
  ULONG ulStatus;
  NTSTATUS status;
  ULONGLONG ullTickCount;
  pFakeSysCall = g_pFakeSysCall_Nt_XXX; // 该系统调用相应的 pFakeSysCall 对象
  status = STATUS_ACCESS_DENIED;
  // 貌似是做性能?试时候须要的,实际版本号中 g_bPerformanceTest 为 FALSE
  if ( g_bPerformanceTest ) {
  ullTickCount = KeQueryInterruptTime();
  }
  // 系统调用的调用前处理!
  // +++
  InterlockedIncrement(&pFakeSysCall->ulCountForPreWork);
  ulStatus = PreWork(&ulXXX, pFakeSysCall);
  InterlockedDecrement(&pFakeSysCall->ulCountForPreWork);
  // ---
  if ( ulStatus != 0xEEEE0004 && ulStatus != 0xEEEE0005)
  {
  OrigSysCall * pOrigSysCall = pFakeSysCall->ulOrigSysCallAddr;
  // 调用原始系统调用!
  if ( pOrigSysCall && NT_SUCCESS(pOrigSysCall(xxx)) )
  {
  // 系统调用的调用后处理!
  // +++
  InterlockedIncrement(&pFakeSysCall->ulCountForPostWork),
  ulStatus = PostWork(&ulXXX),
  InterlockedDecrement(&pFakeSysCall->ulCountForPostWork),
  // ---
  }
  }
  // 0xEEEE0004 应该是拒绝调用的意思,0xEEEE0005 应该是同意调用的意思
  if (ulStatus == 0xEEEE0005)
  status = STATUS_SUCCESS;
  // PsGetCurrentProcessId 这个调用的返回值后面并没实用到,可能是多余的
  PsGetCurrentProcessId();
  // 貌似是做性能?试时候须要的
  if ( g_pFakeSysCall_NtTerminateProcess->xxx5 && ullTickCount && g_bPerformanceTest) {
  PerformanceTest(&g_pFakeSysCall_NtTerminateProcess->xxx13, ullTickCount);
  }
  return status;
  }

vivoS9内存融合3G是什么运行内存显示3G是什么意思vivoS9是拥有内存融合3G功能的一款手机,内存融合3G是什么意思,运行内存显示3G是什么意思,一起来看看吧内存融合3G是什么内存融合是将RAM和ROM通过算法优化融合起来,大幅移动手机h网是什么意思移动手机h网指的是3G网络吗h网是什么意思?相信很多移动手机用户都有这个疑问,就是在自己的手机屏幕的信号栏上会出现一个h的标识,有人说这个字母代表的是h网。那么,h网是什么意思呢?而它与目前移动推出的2G网络剑灵传说灵核应该怎么打造打造方法步骤方法剑灵传说灵核怎么打造?剑灵传说灵核的打造方法是什么?传说灵核的打造方式购买或者平时拍取灵核,兑换一段的灵核。灵核进化请使用高级灵核,如果相信自己的脸,可以使用普通的。如果五段是一属剑灵新传说武器黑龙武器属性介绍成长不会失败详解剑灵新传说武器黑龙武器属性怎么样?新白青传说武器在成长过程中不会失败,也会有小惊喜mdashmdash成长出祝福属性,获得祝福后,继续成长的费用不会提升。到10段后,新传说武器会变炉石传说手持血吼武器战士卡组分享详解炉石传说手持血吼的武器战士卡组分享,喜欢这游戏的朋友都过来看看吧。一组卡思路不得不承认土豪战确实很稳定,以至于天梯里碰到的战士10个有9个是拼后期拼大哥的土豪战,玩腻了土豪战又想玩炉石传说平民机械法组牌心得分享详解作为一个炉石新手一想到摆在眼前的经典卡包NAXX资料片机械卡包三座大山就感觉到亚历山大,然后我就组出一套机械法,于是尝试了一下却不小心打到了9级。然后硬着头皮继续打居然上传说了卡组刀塔传奇新手怎么玩刀塔传奇新手攻略刀塔传奇是一款以DOTA故事背景为题材的卡牌类手机网游。玩家在游戏中可收集到Q版的DOTA英雄,并顺着故事线索突破重重关卡,体验真实的刀塔世界。下面为大家带来刀塔传奇新手攻略。游戏炉石传说德鲁伊冷门卡牌有什么潜力炉石传说德鲁伊冷门卡牌潜力分析炉石传说中有些卡牌由于种种原因为人所忽视,很少能在对局中出现,但或许他们身上还具有着独到的价值,我将在接下来的文章中一一分析他们,这期是德鲁伊。野蛮之击潜力曾经这张卡是这样的,2费什么是软屏什么是硬屏软屏和硬屏哪种好详细介绍什么是软屏硬屏软屏根据制作工艺及表面涂料的不同一般分为普通白色屏幕和玻珠屏幕。普通白色屏幕是在专用织物上喷涂白色涂料,并做简单处理后制成的,具有价格便宜视角广泛视觉效果柔和的优点。sva屏幕是什么sva屏幕与硬屏之间的区别介绍图文随着社会的进步以及科技的发展,越来越多的电子产品出现在我们的生活中,而这些电子产品大多都使用电子屏幕,一般的电子屏幕分为软屏和硬屏两种。sva屏幕就是我们常说的软屏中的一种,它是V什么是移动电视机软屏电视和硬屏电视之间区别详细介绍随着科技越来越发展,在我们观念以及印象中非常古板的电视也散发出了非常多不同的科技以及创新,其中软屏的出现是电视发展史上一个非常重要的关节点。虽然软屏电视在我们的生活中已经有着非常多
联想M490s屏幕尺寸是多少联想M490sAITH(简称联想M490s)采用了标准的14。0英寸LED背光显示屏,屏幕比例为169。联想M490s采用了全新的Intel第三代酷睿智能i3处理器,i33217U联想M490s怎么样联想M490sAITH(简称联想M490s)采用了标准的14。0英寸LED背光显示屏,屏幕比例为169,最大分辨率为1366times768。屏幕的尺寸与分辨率并没有太多的亮点可言联想M490s多少钱联想M490sAITH(简称联想M490s)目前市场售价5663元。联想M490s采用了全新的Intel第三代酷睿智能i3处理器,i33217U,默认主频1。8GHz,三级缓存3M联想M490s有读卡器吗联想M490sAITH(简称联想M490s)集成了四合一读卡器。联想M490sAITH(简称联想M490s)采用了标准的14。0英寸LED背光显示屏,屏幕比例为169,最大分辨率为联想M490s电池怎么样联想M490sAITH(简称联想M490s)配备了一块4芯2200mAh的锂离子电池,电池规格与很多入门级超极本的电池规格相当。联想M490sAITH将电池仓做成了支架状。这个电池联想M490s重量是多少联想M490sAITH(简称联想M490s)机身重量为1。892kg,加上电源适配器重量为2。23kg。联想M490sAITH(简称联想M490s)采用了标准的14。0英寸LED背联想M490s静音吗联想M490sAITH(简称联想M490s)静音。联想M490sAITH(简称联想M490s)采用了标准的14。0英寸LED背光显示屏,屏幕比例为169,最大分辨率为1366tim联想M490s有摄像头吗联想M490sAITH(简称联想M490s)有摄像头。联想M490sAITH(简称联想M490s)采用了标准的14。0英寸LED背光显示屏,屏幕比例为169,最大分辨率为1366t联想M490s支持网卡吗联想M490sAITH(简称联想M490s)内置101001000M网卡。联想M490sAITH(简称联想M490s)采用了标准的14。0英寸LED背光显示屏,屏幕比例为169,最联想M490s旅行重量是多少联想M490sAITH(简称联想M490s)旅行重量2。23kg。联想M490sAITH(简称联想M490s)采用了标准的14。0英寸LED背光显示屏,屏幕比例为169,最大分辨率联想M490s有什么接口联想M490sAITH(简称联想M490s)左右两侧配备了2timesUSB3。01timesUSB2。0HDMISD卡槽以及RJ45网口。联想M490sAITH(简称联想M490