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



  

 

 我们先看下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  //注意这里要改成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中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值