windows内核 win7 和 xp下 hook过滤KiFastCallEntry的不同之处(远离360 hook)
2011-10-05 12:29
423 查看
我们先看下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中
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中
相关文章推荐
- Windows内核安全编程__键盘过滤之内核级Hook(一)
- <寒江独钓>Windows内核安全编程__键盘过滤之内核级Hook(二)
- <寒江独钓>Windows内核安全编程__键盘过滤之内核级Hook(一)
- <读书笔记>Windows内核安全 —— 第四章 键盘的过滤
- windows service 2008和xp或者win7有什么区别啊?
- <寒江独钓>Windows内核安全编程__一个简单的Windows串口过滤驱动程序的开发
- 解决Win7访问Windows 2003、XP共享慢的问题
- windows过滤中设备绑定的内核API之一
- Win7下的IE8与XP下的IE8的不同
- windows(win7,win8,xp)hosts文件找不到原因分析及解决方法
- 键盘过滤之内核级Hook(二)
- windows过滤中设备绑定的内核API之一
- Windows 中 Cookie、Internet Temp Files、History、Temp Directory 具体路径(2000、Xp、Vista、Win7)
- itunes下载的固件在哪? (XP和win7,Mac存放的位置不同)
- windows下svn强制写日志hook脚本增强版(空格过滤)
- PJSIP在windows(xp或者win7)下的编译,编译工具是vs2008,PJSIP版本2.3
- 键盘过滤之内核级Hook(一)
- Win7和XP环境下,.net中DateTime.Now 前台时间输出显示格式的不同之处
- Windows内核API HOOK 之 Inline Hook
- WIN7情况下VMWARE虚构机中Microsoft Windows XP Professional 2002 Service Pack2与win7共享文件的编制: