首页
社区
课程
招聘
[求助]x64 Hook KiSystemCall64失败
发表于: 2016-1-15 17:11 10414

[求助]x64 Hook KiSystemCall64失败

2016-1-15 17:11
10414
最近在研究利用VT做syscall64 hook,逆向了一下卡巴斯基2016的驱动klhk.sys,虽然没有逆完,但是大体思路了解了,就自己写了一个差不多的。但是重载KiSystemCall64并修复相对偏移之后,wrmsr到我自己的syscall后会随机崩溃,WinDbg看了下发现是调用ZwAllocateVirtualMemory时出问题,但不知道是不是我没有发现,在卡巴斯基的驱动里并没有对ZwAllocateVirtualMemory的特殊处理。我自己的的代码和逆向卡巴的idb都放在附件了,质量很烂,有大神了解的可以帮忙看下吗?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 284
活跃值: (3564)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
2
mark
2016-1-15 19:19
0
雪    币: 35
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mark
2016-1-15 19:23
0
雪    币: 1176
活跃值: (1264)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
4
mark
2016-1-15 20:40
0
雪    币: 219
活跃值: (773)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
5
VT 是接管不是重载 .在说如果是HOOK是要触发PG的
win7 x64  shadown 是不触发PG
win8  10才要
win 10需要设置CR3,另外CPUID也要返回给系统处理
2016-1-15 21:28
0
雪    币: 677
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我知道VT只是负责处理系统对MSR的检测,但现在的问题是修复相对偏移,然后改MSR到我的函数之后,会随机性出错,而且在测试这个代码的时候是没有开启VT的,把MSR改成卡巴驱动里的函数就没有问题

出错的时候是在WinDbg中断下来提示Access Violation,而不是触发PG的BugCheck
2016-1-15 21:59
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
应该是你么个opcode计算错误吧,你在仔细比对下修正后的汇编
2016-1-16 00:39
0
雪    币: 219
活跃值: (773)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
8
===卡巴 是怎么重载内存的,不是寻址问题,全局变量,会有很大问题?
2016-1-16 02:46
0
雪    币: 677
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
KiSystemCall64里一共有这几个全局变量:

lea     r10,[nt!KeServiceDescriptorTable]
lea     r11,[nt!KeServiceDescriptorTableShadow]

cmp     rsi,qword ptr [nt!MmUserProbeAddress]
cmovae  rsi,qword ptr [nt!MmUserProbeAddress]

test dword ptr [nt!PerfGlobalGroupMask+0x8],40h

lea rdi,[nt!KeServiceDescriptorTableShadow+0x20]


算上所有的call xxxxxxxx 都已经在我自己的驱动空间里处理好了
2016-1-16 08:23
0
雪    币: 677
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
看了一下,是有一个地方没处理好
lea rdi,[nt!KeServiceDescriptorTableShadow+0x20]

后面那个+0x20我没有注意到

但是这个改好之后还是出错啊,内存中的汇编我逐字节和卡巴自己的函数对比了,都是一样的

难道是自己处理的SSDT表有问题?
2016-1-16 08:25
0
雪    币: 219
活跃值: (773)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
11
要这样
上传的附件:
2016-1-16 15:15
0
雪    币: 677
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
参考了类似方法之后成功了,感谢!

但是为什么卡巴那种方式却不能用呢?应该还是我的代码有问题吧
2016-1-16 19:27
0
雪    币: 99
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
mark
2016-1-16 22:43
0
雪    币: 284
活跃值: (3564)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
14
bug report (win7x64) :
1.Fix FF15 Call
2.In FixOpcodeTestInDriver:
your : test qword ptr [XXX], 40h
sys  : test dword ptr [nt!PerfGlobalGroupMask+0x8], 40h
3.your_SSDT_Table[i] |= sys_SSDT_Table[i] & 0xF;
  your_SSSDT_Table[i] |= sys_SSSDT_Table[i] & 0xF;
2016-3-1 17:51
0
雪    币: 130
活跃值: (402)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
mark
2016-3-6 10:12
0
游客
登录 | 注册 方可回帖
返回
//