首页
论坛
课程
招聘
[原创]windows内核 win7 和 xp下 hook过滤KiFastCallEntry的不同之处(远离360的hook)
2012-4-6 10:04 21174

[原创]windows内核 win7 和 xp下 hook过滤KiFastCallEntry的不同之处(远离360的hook)

2012-4-6 10:04
21174
我们先看下hook  kiFastCallentry 点的汇编代码:

winXp:

FF05 38060000  inc    dword ptr [638]
80542656  8BF2  mov    esi, edx
80542658  8B5F 0C  mov    ebx, dword ptr [edi+C]
8054265B  33C9  xor    ecx, ecx
8054265D  8A0C18  mov    cl, byte ptr [eax+ebx]
80542660  8B3F  mov    edi, dword ptr [edi]
80542662  8B1C87  mov    ebx, dword ptr [edi+eax*4]
80542665  2BE1  sub    esp, ecx

80542667  C1E9 02  shr    ecx, 2
8054266A  8BFC  mov    edi, esp
8054266C  3B35 34315680  cmp    esi, dword ptr [80563134]
80542672  0F83 A8010000  jnc    80542820
80542678  F3:A5  rep(e) movsw/d  dword ptr es:esi, es:edi
8054267A  FFD3  call   ebx

红色显示的是kiFastCallEntry函数内  调用 ssdt或者shadow ssdt的过程,eax是调用号,ebx是调用的函数地址edi是ssdt 或者shadow SSDT表的地址,以上是XP的

win7:

mov edx, dword ptr [edi+C]
mov edi, dword ptr [edi]
mov cl, byte ptr [eax+edx]
mov edx, dword ptr [edi+eax*4]
sub esp, ecx
shr ecx, 2
mov edi, esp
cmp esi, dword ptr [8418584C]
jnb 8405A3F5
rep movs dword ptr es:[edi], dword ptr [esi]
test byte ptr [ebp+6C], 1
je short 8405A1E5
mov ecx, dword ptr fs:[124]
mov edi, dword ptr [esp]
mov dword ptr [ecx+13C], ebx
mov dword ptr [ecx+12C], edi
mov ebx, edx
test byte ptr [84152688], 40
setne byte ptr [ebp+12]
jne 8405A584
call ebx

红色显示的是kiFastCallEntry函数内  调用 ssdt或者shadow ssdt的过程,eax是调用号,edx是调用的函数地址edi是ssdt 或者shadow SSDT表的地址,以上是win7的

可以看到 winXp和win7 最后都是通过call ebx来调用函数,只是winXP 前面直接把地址 给ebx,而win7是先把地址给edx,后面再把edx给ebx,所以但是他们都有相同的特征码

80542665  2BE1  sub    esp, ecx
80542667  C1E9 02  shr    ecx, 2
8054266A  8BFC  mov    edi, esp


所以在Hook   KiFastCallEntry时 可以 搜索相同的特征码,然后在返回过滤ssdt  或者shadow ssdt函数时,处理不同的寄存器,

在驱动初始化的时候 或者KiFastCallEntry的地址后,搜索以上特征码,然后在判断这里是 ebx 还是 edx,然后 就可以动态的返回ebx还是edx 地址

1.初始判断

if ( dwCallType == 0x1C8B )
   {
    pSysCallFilterInfo->FastCallType = FAST_CALL_EBX;
   }
   else if ( dwCallType == 0x148B  )
   {
    pSysCallFilterInfo->FastCallType = FAST_CALL_EDX;
   }

2.Hook filter 动态处理

#pragma LOCKEDCODE

__declspec(naked) NTSTATUS FakeKiFastCallEntry(VOID)
{
__asm{
  pop esi
  pushfd
  pushad

  mov     ecx,dword ptr [pSysCallFilterInfo]
cmp     dword ptr [ecx + 29h],FAST_CALL_EBX   //如果是ebx则  jne     _fun2

//ebx的情况
  push edi
  push ebx
  push eax

  mov esi,0x12345678 //特征码驱动初始化时 修改为自己的过滤函数
  call esi   
  mov  dword ptr [esp+10h],eax
  jmp  _exit
_fun2:
  mov     ecx,dword ptr [pSysCallFilterInfo]
cmp     dword ptr [ecx + 29h],FAST_CALL_EDX //edx的情况  jne     _exit
  
  push edi
  push edx
  push eax

mov esi,0x12345678  //特征码驱动初始化时 修改为自己的过滤函数
  call esi
  mov  dword ptr [esp+14h],eax  //把过滤所得的值付给edx,注意这里要改成esp + 0x14
/**********************************************************
/*知识点:PUSHAD指令压入32位寄存器,使他们按照EDI,ESI,EBP,ESP,EBX,EDX,ECX,最后是EAX的顺序出现在堆栈中。
/*很多人不明白此处看知识点可以知道edx保存在 在esp + 0x14的地址 0x14 = 20 相当 5个dword ,call esi 前面5 个
寄存器EDI,ESI,EBP,ESP,EBX  所以是 esp + 0x14就改变了pushad中的edx值 ,一边后来popad恢复到edx中从而改变
ssdt的调用函数地址,因此推论前面改变ebx值是esp + 0x10,而此处改变ebx值是esp + 0x14
/********************************************************************

_exit:
  popad
  popfd
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
push g_ulRetEntry//返回点  retn
  __emit 0xCC
  __emit 0xCC
  __emit 0xCC
  __emit 0xCC
}

}

以上处理 适合在winXp win7中

【注意了】
不好意思,我没写清楚。
靠 我刚才发现 还没过几个月360的hookport的 hook kiFatscall 点 又变了 ,这个是几个月前 写的,现在的360 hook又变了 ,占了我几个月前的位置

红色显示的是 现在 360的位置,以前360是在这个位置的上面。 几个月就变了,地址 二进制 汇编
80542656 8BF2 mov esi, edx
80542658 8B5F 0C mov ebx, dword ptr [edi+C]
8054265B 33C9 xor ecx, ecx
8054265D 8A0C18 mov cl, byte ptr [eax+ebx]
80542660 8B3F mov edi, dword ptr [edi]
80542662 8B1C87 mov ebx, dword ptr [edi+eax*4]
80542665 E9 2638B40A jmp 8B085E90
8054266A 8BFC mov edi, esp
8054266C 3B35 34315680 cmp esi, dword ptr [80563134]
80542672 0F83 A8010000 jnc 80542820
80542678 F3:A5 rep(e) movsw/d dword ptr es:esi, es:edi
8054267A FFD3 call ebx
8054267C 8BE5 mov esp, ebp
8054267E 64:8B0D 24010000 mov ecx, dword ptr fs:[124]
80542685 8B55 3C mov edx, dword ptr [ebp+3C]
80542688 8991 34010000 mov dword ptr [ecx+134], edx
8054268E FA cli
8054268F F745 70 00000200 test dword ptr [ebp+70], 20000
80542696 75 06 jne 8054269E
80542698 F645 6C 01 test byte ptr [ebp+6C], 1
8054269C 74 56 je 805426F4
8054269E 64:8B1D 24010000 mov ebx, dword ptr fs:[124]
805426A5 C643 2E 00 mov byte ptr [ebx+2E], 0
805426A9 807B 4A 00 cmp byte ptr [ebx+4A], 0
805426AD 74 45 je 805426F4
805426AF 8BDD mov ebx, ebp

该死的360,估计是几个月前把我的 驱动上传分析了,我这个文章在别处发表了很长时间了,要么就是360看到了文章后来改了hook点了,把我的位置占掉了

[注意] 欢迎加入看雪团队!base上海,招聘安全工程师、逆向工程师多个坑位等你投递!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (17)
雪    币: 463
活跃值: 活跃值 (15)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
KiDebug 活跃值 4 2012-4-6 10:44
2
0
都被360“带坏”了。
雪    币: 172
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
windowsa 活跃值 2012-4-6 10:56
3
0
360也成就一部分人啊!!朋友
雪    币: 1332
活跃值: 活跃值 (318)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Crakme 活跃值 2012-4-6 12:52
4
0
没看出和360有啥关系
雪    币: 1817
活跃值: 活跃值 (840)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
basketwill 活跃值 1 2012-4-6 14:35
5
0
不好意思,我没写清楚。
靠 我刚才发现 还没过几个月360的hookport的 hook kiFatscall 点 又变了 ,这个是几个月前 写的,现在的360 hook又变了 ,占了我几个月前的位置

红色显示的是 现在 360的位置,以前360是在这个位置的上面。 几个月就变了,地址 二进制 汇编
80542656 8BF2 mov esi, edx
80542658 8B5F 0C mov ebx, dword ptr [edi+C]
8054265B 33C9 xor ecx, ecx
8054265D 8A0C18 mov cl, byte ptr [eax+ebx]
80542660 8B3F mov edi, dword ptr [edi]
80542662 8B1C87 mov ebx, dword ptr [edi+eax*4]
80542665 E9 2638B40A jmp 8B085E90
8054266A 8BFC mov edi, esp
8054266C 3B35 34315680 cmp esi, dword ptr [80563134]
80542672 0F83 A8010000 jnc 80542820
80542678 F3:A5 rep(e) movsw/d dword ptr es:esi, es:edi
8054267A FFD3 call ebx
8054267C 8BE5 mov esp, ebp
8054267E 64:8B0D 24010000 mov ecx, dword ptr fs:[124]
80542685 8B55 3C mov edx, dword ptr [ebp+3C]
80542688 8991 34010000 mov dword ptr [ecx+134], edx
8054268E FA cli
8054268F F745 70 00000200 test dword ptr [ebp+70], 20000
80542696 75 06 jne 8054269E
80542698 F645 6C 01 test byte ptr [ebp+6C], 1
8054269C 74 56 je 805426F4
8054269E 64:8B1D 24010000 mov ebx, dword ptr fs:[124]
805426A5 C643 2E 00 mov byte ptr [ebx+2E], 0
805426A9 807B 4A 00 cmp byte ptr [ebx+4A], 0
805426AD 74 45 je 805426F4
805426AF 8BDD mov ebx, ebp

该死的360,估计是几个月前把我的 驱动上传分析了,我这个文章在别处发表了很长时间了,要么就是360看到了文章后来改了hook点了,把我的位置占掉了
雪    币: 2140
活跃值: 活跃值 (404)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
zhouws 活跃值 2 2012-4-6 14:47
6
0
看得出,发贴的和回贴的都很无聊,包括我
雪    币: 0
活跃值: 活跃值 (24)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
tihty 活跃值 2 2012-4-6 17:24
7
0
分析不错,但是360那些事早就不关心了
雪    币: 242
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
爱你的X 活跃值 1 2012-4-6 19:01
8
0
欢迎分析下 3600safe的kifastcallentry的hook,www.3600safe.com/3600safe0.2.1.rar
雪    币: 71
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mumaren 活跃值 2012-4-6 22:16
9
0
很有用啊

谢谢啦
雪    币: 216
活跃值: 活跃值 (120)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dayang 活跃值 2012-4-7 10:17
10
0
文章不错,支持下!
雪    币: 177
活跃值: 活跃值 (256)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
viphack 活跃值 4 2012-4-9 15:53
11
0
inline hook
雪    币: 266
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
icezy 活跃值 2012-4-10 23:27
12
0
搞来搞去,还是在这个函数PATCH,没啥意思。
雪    币: 274
活跃值: 活跃值 (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wwwzhigang 活跃值 2012-4-11 09:20
13
0
楼主很强,向楼主学习了
雪    币: 191
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hnzcyjszc 活跃值 2012-4-20 10:50
14
0
哥们 你其实可以用 drx 把360的HOOK给PASS了
轻松简单  无需要为那么几个字节发什么愁
雪    币: 206
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
seny 活跃值 2012-11-8 16:52
15
0
大牛。。还请说说怎么个轻松绕过法啊??动不动就给报警,,都加载不了。
雪    币: 85
活跃值: 活跃值 (75)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wodexinren 活跃值 2013-9-18 14:03
16
0
mark
雪    币: 79
活跃值: 活跃值 (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cqzj70 活跃值 2014-5-30 10:42
17
0
mark
雪    币: 137
活跃值: 活跃值 (495)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
niuzuoquan 活跃值 2017-12-4 08:36
18
0
mark
游客
登录 | 注册 方可回帖
返回