本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 8374|回复: 15

360 hook KiFastCallEntry的逆向分析 [复制链接]

Rank: 2

发表于 2009-11-8 14:32:54 |显示全部楼层
     前天看到我老乡教主写逆向360的文章,说是hook 了kiFastCallEntry,这个函数是没导出的,莫非暴力搜索?,昨天下午看看,看到了他说的一张自己的服务表(初始化在0x18A44这的一个函数)。但是找不到hook KiFastCallEntry的地方。

     今天又看到教主模拟了那个东西,本来上午做经管院的项目的,心里痒痒,就看了看,在百度上搜搜看看有没有hook KiFastCallEntry的暴力搜索例子时发现已经有人写了360的hook方式(http://hi.baidu.com/index09/blog/item/c2817c0e7ff1b8c07bcbe1d4.html

      不过实在是写的看不懂,就自己慢慢看了,他提示的hook 了ZwSetEvent (0x191db处调用了一个函数,这个函数就是hook ZwSetEvent)让我省了不少力,大致代码如下:
  1. ZwSetEventAddress = GetAddress("ZwSetEvent");
  2. ZwSetEvent_SSDTIndex = *(_DWORD *)(ZwSetEventAddress + 1);    // 获取了NtSetEvent服务号,可以通过windbg反汇编一下ZwSetEvent
  3. 然后利用经典的cr0方式hook NtSetEvent的SSDT index
  4. someHandleForZwSetEvent = 0x288C58F1u; //这个数是个随手写的数,为了识别myNtSetEvent里是不是自己调用的
  5. ZwSetEvent((HANDLE)0x288C58F1, 0); //激发
复制代码

     然后看MyNtSetEvent,这个函数先检查传过来的句柄是不是0x288C58F1u,不是的话证明是别人调用的,直接调用原来的SetEvent。如果是得话就开始找KiFastCallEntry,这里使用的是ebp+4,这个地址就是KiFastCallEntry里的某一句代码了,因为调用的时候:
  1. ebp+c arg2
  2. ebp+8 arg1
  3. ebp+4 返回地址
  4. ebp+0 函数里要用到这个保存ebp
复制代码

      然后搜索适当的位置插入jmp   ;并且这个地方还是用了淫荡的二级跳,所以冰刃检测到的inline hook是unknown module

然偶恢复hook过的NtSetEvent

效果就是:
lkd> u
nt!KiFastCallEntry+0xcc:
804df7c0 ff0538f6dfff    inc     dword ptr ds:[0FFDFF638h]
804df7c6 8bf2            mov     esi,edx
804df7c8 8b5f0c          mov     ebx,dword ptr [edi+0Ch]
804df7cb 33c9            xor     ecx,ecx
804df7cd 8a0c18          mov     cl,byte ptr [eax+ebx]
804df7d0 8b3f            mov     edi,dword ptr [edi]
804df7d2 8b1c87          mov     ebx,dword ptr [edi+eax*4]
804df7d5 e92ef7b002      jmp     82feef08


最近还发现,对于一些要使用inline hook的东西,找添加钩子的地方时,在.data里查找0xE9就能省很大力气,360的.data里就是初始化为E9 00000002

看KiFastCallEntry时发现了熟悉的FS 30h……,内核情景分析那本书看着确实很不错很过瘾

Rank: 4

发表于 2009-11-8 14:43:07 |显示全部楼层
我的第二篇分析文章里有讲这个,只是你们看不到了。。。

Rank: 2

发表于 2009-11-8 14:46:49 |显示全部楼层
为啥呀……

Rank: 2

发表于 2009-11-8 14:47:42 |显示全部楼层
教主把第二篇写出来看看啊  

Rank: 2

发表于 2009-11-8 15:15:19 |显示全部楼层
被和谐了呗

Rank: 2

发表于 2009-11-8 20:34:30 |显示全部楼层
hook KiFastCallEntry的时候利用这个被和谐的zwxx函数进行堆栈回溯,这样就可以找到KiFastEntry的地址了

Rank: 1

发表于 2009-11-9 21:56:51 |显示全部楼层
ZwClose 和 好像是 SetEvent 这两个进行栈回溯..

Rank: 2

发表于 2009-11-10 14:38:35 |显示全部楼层
咱老乡。。。

Rank: 1

发表于 2009-11-10 20:19:24 |显示全部楼层
为什么不能通过SYSENTER_EIP_MSR寄存器直接获得KiFastCallEntry的地址?

Rank: 4

发表于 2009-11-10 21:55:26 |显示全部楼层
能,但是要在不用的系统下找到那个待修改的位置可能就麻烦了~

Rank: 4

发表于 2009-11-10 21:56:12 |显示全部楼层
不同的系统,打错了

Rank: 2

发表于 2009-11-10 22:28:51 |显示全部楼层
貌似上面的这个方法在ROOTKITS这本书里面有详细说明

Rank: 1

发表于 2009-11-15 23:59:43 |显示全部楼层
我也见过有类似的安全软件是如此实现的,但我觉得这样可能会导致修改SSDT表的正常应用程序有问题

Rank: 4

发表于 2009-11-16 01:11:49 |显示全部楼层
没有问题,360保存并调用的是从SSDT中取得的地址,所以SSDT  Hook依然有效,只是没有360的处理过程优先,若360先拦截了某调用,SSDT Hook就调用不到了

Rank: 1

发表于 2013-3-18 08:37:32 |显示全部楼层
来学习一下

Rank: 1

发表于 2013-4-13 23:13:37 |显示全部楼层
学习啦
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-5-21 09:51 , Processed in 0.034393 second(s), 8 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部