技术宅的结界

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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3549|回复: 4
收起左侧

关于多核环境下的MSR HOOK

[复制链接]

2

主题

7

帖子

78

积分

用户组: 小·技术宅

UID
587
精华
0
威望
1 点
宅币
42 个
贡献
27 次
宅之契约
0 份
在线时间
5 小时
注册时间
2014-12-11
发表于 2015-8-4 09:51:07 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 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下面我附上代码:

[C] 纯文本查看 复制代码
#include<ntddk.h>
 ULONG OldAddr;
 VOID DriverUnload(PDRIVER_OBJECT pDriver_Object);
 __declspec(naked)MyKiFastCallEntry(VOID)
 {
 __asm jmp OldAddr
 }
 NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver_Object,PUNICODE_STRING pRegstryString)
 {
 KAFFINITY     ActiveProcessors, CurrentAffinity;
 pDriver_Object->DriverUnload=DriverUnload;
     ActiveProcessors=KeQueryActiveProcessors(); 
      for(CurrentAffinity = 1;ActiveProcessors;CurrentAffinity <<= 1) 
     {
        if(ActiveProcessors & CurrentAffinity)
        {
            ActiveProcessors &= ~CurrentAffinity;
            KeSetSystemAffinityThread(CurrentAffinity);
        __asm
   {
 int 3
 cli
 push ecx
 push eax
 mov ecx,0x176
 rdmsr
 mov OldAddr,eax
 xor eax,eax
 mov eax,MyKiFastCallEntry
 wrmsr
 xor eax,eax
 xor ecx,ecx
 pop eax
 pop ecx
 sti
      }
          DbgPrint("KiFastCallEntry Addr:%08x\n",OldAddr);
       }
     }
 DbgPrint("NewKiFastCallEntry Addr:%08x\n",MyKiFastCallEntry);
 return STATUS_SUCCESS;
 }
 VOID DriverUnload(PDRIVER_OBJECT pDriver_Object)
 {
 KAFFINITY ActiveProcessors,CurrentAffinity;
 ActiveProcessors=KeQueryActiveProcessors(); 
      for(CurrentAffinity = 1;ActiveProcessors;CurrentAffinity <<= 1) 
     {
         if(ActiveProcessors & CurrentAffinity)
        {
            ActiveProcessors &= ~CurrentAffinity;
            KeSetSystemAffinityThread(CurrentAffinity);
 _asm
 {
 cli
 push ecx
 push eax
 mov ecx,0x176
 mov eax,OldAddr
 wrmsr
 xor ecx,ecx
 xor eax,eax
pop eax
 pop ecx
 sti
 }
 }
 }
 DbgPrint("驱动卸载成功\n");
 } 


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

a9ec1438619350.jpg

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

使用道具 举报

13

主题

76

帖子

1292

积分

用户组: 上·技术宅

UID
888
精华
0
威望
0 点
宅币
302 个
贡献
914 次
宅之契约
0 份
在线时间
36 小时
注册时间
2015-5-31
发表于 2015-8-4 10:33:15 | 显示全部楼层
顶贴

0

主题

6

帖子

37

积分

用户组: 初·技术宅

UID
286
精华
0
威望
1 点
宅币
29 个
贡献
0 次
宅之契约
0 份
在线时间
3 小时
注册时间
2014-5-14
发表于 2015-8-4 10:34:10 | 显示全部楼层
学习了多核环境下的

0

主题

41

帖子

45

积分

用户组: 初·技术宅

UID
3351
精华
0
威望
2 点
宅币
0 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2018-1-14
发表于 2018-1-14 16:01:54 | 显示全部楼层
可以可以!!
回复

使用道具 举报

24

主题

261

帖子

1489

积分

用户组: 上·技术宅

UID
3808
精华
6
威望
53 点
宅币
1002 个
贡献
90 次
宅之契约
0 份
在线时间
260 小时
注册时间
2018-5-6
发表于 2020-1-24 17:43:35 | 显示全部楼层
可以可以,支持楼主!
菜鸟一枚,直接指正,不必留情

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图  

GMT+8, 2020-7-5 20:35 , Processed in 0.198490 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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