您的位置:首页 > 其它

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中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: