首页
社区
课程
招聘
[原创]Anti SSDT Hook
发表于: 2009-2-15 00:23 45871

[原创]Anti SSDT Hook

2009-2-15 00:23
45871

前几天去当面膜拜了女王大牛,果然****,还让我等了一个来小时。。。

在xp中ntdll.dll的调用都是通过sysenter切换到内核的,sysenter调用了KiFastCallEntry,而KiFastCallEntry函数则是在ssdt表找到相应的
函数地址,然后call,所以只要伪造一张原始的ssdt表,并且欺骗过KiFastCallEntry函数,这样ssdt hook就无效了。。。
先看KiFastCallEntry函数:

nt!KiFastCallEntry:
80541790 b923000000      mov     ecx,23h
80541795 6a30            push    30h
80541797 0fa1            pop     fs
80541799 8ed9            mov     ds,cx
8054179b 8ec1            mov     es,cx
8054179d 648b0d40000000  mov     ecx,dword ptr fs:[40h] 
805417a4 8b6104          mov     esp,dword ptr [ecx+4]  
805417a7 6a23            push    23h
805417a9 52              push    edx  
805417aa 9c              pushfd
805417ab 6a02            push    2
805417ad 83c208          add     edx,8 
805417b0 9d              popfd
805417b1 804c240102      or      byte ptr [esp+1],2
805417b6 6a1b            push    1Bh
805417b8 ff350403dfff    push    dword ptr ds:[0FFDF0304h]
805417be 6a00            push    0
805417c0 55              push    ebp
805417c1 53              push    ebx
805417c2 56              push    esi
805417c3 57              push    edi
//ebx=_KPCR.SelfPcr
805417c4 648b1d1c000000  mov     ebx,dword ptr fs:[1Ch] 
805417cb 6a3b            push    3Bh
//esi=_KPCR.PrcbData.CurrentThread
805417cd 8bb324010000    mov     esi,dword ptr [ebx+124h]  
805417d3 ff33            push    dword ptr [ebx]
805417d5 c703ffffffff    mov     dword ptr [ebx],0FFFFFFFFh   
805417db 8b6e18          mov     ebp,dword ptr [esi+18h] 
805417de 6a01            push    1
805417e0 83ec48          sub     esp,48h
805417e3 81ed9c020000    sub     ebp,29Ch
805417e9 c6864001000001  mov     byte ptr [esi+140h],1
805417f0 3bec            cmp     ebp,esp
805417f2 758d            jne     nt!KiFastCallEntry2+0x49 (80541781)
805417f4 83652c00        and     dword ptr [ebp+2Ch],0
805417f8 f6462cff        test    byte ptr [esi+2Ch],0FFh
805417fc 89ae34010000    mov     dword ptr [esi+134h],ebp
80541802 0f8538feffff    jne     nt!Dr_FastCallDrSave (80541640)
80541808 8b5d60          mov     ebx,dword ptr [ebp+60h]
8054180b 8b7d68          mov     edi,dword ptr [ebp+68h]
8054180e 89550c          mov     dword ptr [ebp+0Ch],edx
80541811 c74508000ddbba  mov     dword ptr [ebp+8],0BADB0D00h
80541818 895d00          mov     dword ptr [ebp],ebx
8054181b 897d04          mov     dword ptr [ebp+4],edi
8054181e fb              sti
//eax为函数序号,但是在KeServiceDescriptorTableShadow时是函数序号+1000h,
//所以在KeServiceDescriptorTableShadow经过下面运算ecx最终为10h,否则为0
8054181f 8bf8            mov     edi,eax
80541821 c1ef08          shr     edi,8
80541824 83e730          and     edi,30h
80541827 8bcf            mov     ecx,edi
//KTHREAD.ServiceTable gdi32.dll和user32.dll调用时,
//ServiceTable为KeServiceDescriptorTableShadow,
//ntdll.dll调用时ServiceTable为KeServiceDescriptorTable
//在KeServiceDescriptorTableShadow时+10正好得到win32.sys调用
80541829 03bee0000000    add     edi,dword ptr [esi+0E0h]   
8054182f 8bd8            mov     ebx,eax  
//保留三个字节,得到正真的序号
80541831 25ff0f0000      and     eax,0FFFh
//和ssdt或shadow ssdt总共项数比较,eax大则跳
80541836 3b4708          cmp     eax,dword ptr [edi+8] 
80541839 0f8333fdffff    jae     nt!KiBBTUnexpectedRange (80541572)
//判断是shadow ssdt还是ssdt,不跳则是shadow ssdt,跳则是ssdt
8054183f 83f910          cmp     ecx,10h 
80541842 751b            jne     nt!KiFastCallEntry+0xcf (8054185f)  
80541844 648b0d18000000  mov     ecx,dword ptr fs:[18h]
8054184b 33db            xor     ebx,ebx
8054184d 0b99700f0000    or      ebx,dword ptr [ecx+0F70h]
80541853 740a            je      nt!KiFastCallEntry+0xcf (8054185f)
80541855 52              push    edx
80541856 50              push    eax
80541857 ff1528c75580    call    dword ptr [nt!KeGdiFlushUserBatch (8055c728)]
8054185d 58              pop     eax
8054185e 5a              pop     edx
8054185f 64ff0538060000  inc     dword ptr fs:[638h]
80541866 8bf2            mov     esi,edx
80541868 8b5f0c          mov     ebx,dword ptr [edi+0Ch]
8054186b 33c9            xor     ecx,ecx
8054186d 8a0c18          mov     cl,byte ptr [eax+ebx]
//edi=KeServiceDescriptorTable->ServiceTableBase
//在这里patch 把edi指向构造的ssdt
80541870 8b3f            mov     edi,dword ptr [edi]  
//得到真实地址,edi为KiServiceTable,eax为函数序号  
80541872 8b1c87          mov     ebx,dword ptr [edi+eax*4] 
80541875 2be1            sub     esp,ecx
80541878 c1e902          shr     ecx,2
8054187a 8bfc            mov     edi,esp
8054187c 3b3574f73ff4    cmp     esi,dword ptr ds:[0F43FF774h]
80541882 0f83a8010000    jae     nt!KiSystemCallExit2+0x9f (80541a30)
//把参数复制到内核
80541888 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]
//调用函数
8054188a ffd3            call    ebx
8054188c 8be5            mov     esp,ebp
8054188e 648b0d24010000  mov     ecx,dword ptr fs:[124h]
80541895 8b553c          mov     edx,dword ptr [ebp+3Ch]
80541898 899134010000    mov     dword ptr [ecx+134h],edx

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (39)
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不懂,站位学习
2009-2-15 00:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习学习·~~~
2009-2-15 00:43
0
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
学习学习,希望能自己再创新一些.这些大牛说过了,不过比我这个菜鸟好多了,呵呵
2009-2-15 02:06
0
雪    币: 2512
活跃值: (672)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
若要把映射的内核模块重新定位一下,然后伪造内核表为映射内核模块的内核表,这样我感觉连inline hook 也过了!!!!
2009-2-15 08:33
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
发bin,src看着特别扭~
2009-2-15 09:27
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
好帖~膜拜楼上看bin比src还溜的老V
2009-2-15 10:19
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
8
嗯,思路很旧了. 360Safe好早就这样用了...
支持一下~ 呵呵
2009-2-15 10:31
0
雪    币: 44
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
那也可以伪造到自己的SSDT了
2009-2-15 16:25
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
现在什么都流行造假。。。。。
2009-2-15 16:29
0
雪    币: 220
活跃值: (721)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
#include "kernelfun.h"

kernelfun.h在哪呢?请楼主提供下吧
2009-2-15 17:03
0
雪    币: 255
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
偶看自己不搞驱动米前途了
2009-2-18 09:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
雪下得那么深下得那么认真
倒映出我躺在雪中的伤痕
我并不在乎自己究竟多伤痕累累
可我在乎今后你有谁陪
2009-2-18 09:58
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
14
下场雪 让好多人都诗了
2009-2-18 16:44
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
[QUOTE=;]...[/QUOTE]
景仰高手.............................!
2009-3-6 11:56
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
楼主能不能发个完整工程,或者把那个头文件发上来

想学习下,不错得说
2009-3-20 11:20
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
对啊,楼主把头文件发出来学习一下啊,求你了
2009-3-20 22:11
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
不懂,也顶。。。。大牛们都说好。
2009-5-27 09:29
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
19
这好像是歌词吧???
2009-5-27 10:18
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
#include "kernelfun.h"

kernelfun.h在哪呢?请楼主提供下吧

同问,编译的时候出了很多错误,又没有bin.....这很难说这代码管用
2009-6-2 14:33
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
感觉这么做可能对360的主防有影响。。。

貌似360会通过传入的edi判断基址位置,就不知道它原始存的会不会取到LZ改的edi,如果取不到会跳出去什么都不做,那就相当于废了它的主防啊
2009-9-11 00:40
0
雪    币: 306
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
路过学习,顺便膜拜v大
2009-9-12 18:11
0
雪    币: 243
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
23
lkd> dt _KTHREAD
nt!_KTHREAD
   +0x000 Header           : _DISPATCHER_HEADER
   ...
   +0x0e0 ServiceTable     : Ptr32 Void;就是KeServiceDescriptorTable吧
2009-9-15 10:32
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
kernelfun.h怎么找都找不到啊,谁能发个上来?
2009-9-18 10:58
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
新的方法
好的文章
学习了
2009-9-18 12:52
0
游客
登录 | 注册 方可回帖
返回
//