找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 7168|回复: 5

关于多核环境下的MSR HOOK

[复制链接]
发表于 2015-8-4 09:51:07 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 dumingqiao 于 2015-8-4 12:10 编辑

  最近需要研究自己实现 KiFastCallEntry的实现,所以我们必须先获取到这个函数的地址,下面我来说说这个玩意儿在哪里能找到,在CPU里有逻辑处理器(Processor)每个处理器内部都有形形色色的寄存器(Registers),其中有一个特殊的寄存器-——MSR(Model Specific Registers 特殊模块寄存器),保存着这个函数的地址,但是呢在x86下保存在0x176的模块号中,x64下则保存在0xc0000082中。

        好,废话不多说上WinDbg,先找出这个地址再说,我这里使用的windows XP测试的,所有对应的地址应该在0x176中,在x86下我们可以使用汇编指令rdmsr/wrmsr进行读写MSR寄存器,在X64下由于不能使用内联汇编,读写MSR 可以用_readmsr()/_writemsr(),关于这两个指令和函数的使用请大家查阅相关文档,下面大家看图。
19e71438618878.jpg

Ok下面我附上代码:

  1. #include<ntddk.h>
  2. ULONG OldAddr;
  3. VOID DriverUnload(PDRIVER_OBJECT pDriver_Object);
  4. __declspec(naked)MyKiFastCallEntry(VOID)
  5. {
  6. __asm jmp OldAddr
  7. }
  8. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver_Object,PUNICODE_STRING pRegstryString)
  9. {
  10. KAFFINITY     ActiveProcessors, CurrentAffinity;
  11. pDriver_Object->DriverUnload=DriverUnload;
  12.      ActiveProcessors=KeQueryActiveProcessors();
  13.       for(CurrentAffinity = 1;ActiveProcessors;CurrentAffinity <<= 1)
  14.      {
  15.         if(ActiveProcessors & CurrentAffinity)
  16.         {
  17.             ActiveProcessors &= ~CurrentAffinity;
  18.             KeSetSystemAffinityThread(CurrentAffinity);
  19.         __asm
  20.    {
  21. int 3
  22. cli
  23. push ecx
  24. push eax
  25. mov ecx,0x176
  26. rdmsr
  27. mov OldAddr,eax
  28. xor eax,eax
  29. mov eax,MyKiFastCallEntry
  30. wrmsr
  31. xor eax,eax
  32. xor ecx,ecx
  33. pop eax
  34. pop ecx
  35. sti
  36.       }
  37.           DbgPrint("KiFastCallEntry Addr:%08x\n",OldAddr);
  38.        }
  39.      }
  40. DbgPrint("NewKiFastCallEntry Addr:%08x\n",MyKiFastCallEntry);
  41. return STATUS_SUCCESS;
  42. }
  43. VOID DriverUnload(PDRIVER_OBJECT pDriver_Object)
  44. {
  45. KAFFINITY ActiveProcessors,CurrentAffinity;
  46. ActiveProcessors=KeQueryActiveProcessors();
  47.       for(CurrentAffinity = 1;ActiveProcessors;CurrentAffinity <<= 1)
  48.      {
  49.          if(ActiveProcessors & CurrentAffinity)
  50.         {
  51.             ActiveProcessors &= ~CurrentAffinity;
  52.             KeSetSystemAffinityThread(CurrentAffinity);
  53. _asm
  54. {
  55. cli
  56. push ecx
  57. push eax
  58. mov ecx,0x176
  59. mov eax,OldAddr
  60. wrmsr
  61. xor ecx,ecx
  62. xor eax,eax
  63. pop eax
  64. pop ecx
  65. sti
  66. }
  67. }
  68. }
  69. DbgPrint("驱动卸载成功\n");
  70. }
复制代码


我们把上面附上的这段代码编译为驱动后加载之后再去看看

a9ec1438619350.jpg

这里说明下网上有类似的代码,我发现并没有处理多核环境下的问题,虚拟机是两个核心的,而这两个核心都被修改了,到这里我们也就HOOK成功了,接下来我们也就是要自己实现KiFastCallEntry的部分了,希望对大家有帮助,过段时间我再发怎么自己实现这个函数来过滤系统调用,今天就写到这里。
回复

使用道具 举报

发表于 2015-8-4 10:33:15 | 显示全部楼层
顶贴{:soso_e103:}
回复 赞! 靠!

使用道具 举报

发表于 2015-8-4 10:34:10 | 显示全部楼层
学习了多核环境下的
回复 赞! 靠!

使用道具 举报

发表于 2018-1-14 16:01:54 | 显示全部楼层
可以可以!!
回复

使用道具 举报

发表于 2020-1-24 17:43:35 | 显示全部楼层
可以可以,支持楼主!
回复 赞! 靠!

使用道具 举报

发表于 2021-6-21 07:20:33 | 显示全部楼层
  谢谢分享
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 11:30 , Processed in 0.034474 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表