给你带来与众不同的特别感受
简单说说SSDT (转贴)
上一篇 /
下一篇 2008-06-10 19:54:10
/ 个人分类:杂志相关
| 简单说说SSDT |
|
爱好者博墅v
h#`j&I"u;xJc YE,R 论技术,我还差得远,而且网上关于SSDT的文章也多不胜数。但是还是想自己写一下,因为我想试试我能不能用最简单的语言来描述SSDT——这个对一般来人来说比较神秘的属于内核的地带。引用EVA说的一句话,“以为写个驱动就是内核,还远着了”——大概是这么个意思,记得不是很清楚。 爱好者博墅kQ'])dk6j M*j\*F
o2p;t)mHu%K0关于SSDT,描述得最清楚的应该算《SSDT Hook的妙用-对抗ring0 inline hook》一文了,作者是堕落天才。这里引用一下他写的开头部分,略有个别字符的修改: 7jB*nB\0 `3{;u-iL0内核中有两个系统服务描述符表,一个是KeServiceDescriptorTable,由ntoskrnl.exe导出,一个是KeServieDescriptorTableShadow,没有导出。这两者都是一个结构体,结构下面会给出。他们的区别是,KeServiceDescriptorTable仅有 ntoskrnel一项,而KeServieDescriptorTableShadow则包含了ntoskrnel和win32k。一般的Native API的服务地址由KeServiceDescriptorTable分派,而gdi.dll和 *l7SP @u2i9`#Da0user.dll的内核API调用服务地址,由 KeServieDescriptorTableShadow分派。还有要清楚一点的是win32k.sys只有在GUI线程中才加载,一般情况下是不加载的。 爱好者博墅v {|H5b%iY5}']H*y2}
(?9vgI!l:I0他们的结构如下: 爱好者博墅A,I4`$@|6U\:Dzo.f 代码:
爱好者博墅7~&j*i-T&L/QT typedef struct _SYSTEM_SERVICE_TABLE 爱好者博墅KeUrd2D { kxm$STn`;a/bz3~&y0 PVOID ServiceTableBase; //这个指向系统服务函数地址表 爱好者博墅&\q{@W$L PULONG ServiceCounterTableBase; 爱好者博墅 [+c
BS
D^AY3S6? ULONG NumberOfService; //服务函数的个数,NumberOfService*4 就是整个地址表的大小 爱好者博墅)F-Y8L`'WG ULONG ParamTableBase; 爱好者博墅:uuU:J/h$f
J }SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE; 5sY7C!A&f"^~0 oz9Q6w,av0typedef struct _SERVICE_DESCRIPTOR_TABLE 爱好者博墅RK([P/f+XO\ Xx { 爱好者博墅$\j5i7Cq#P SYSTEM_SERVICE_TABLE ntoskrnel; //ntoskrnl.exe的服务函数 Z&?yEG(qW2\l0 SYSTEM_SERVICE_TABLE win32k; //win32k.sys的服务函数,(gdi.dll/user.dll的内核支持) *\(hh"lM3N'M&b1?2N q0 SYSTEM_SERVICE_TABLE NotUsed1; sq4H\0u6q0 SYSTEM_SERVICE_TABLE NotUsed2; 爱好者博墅CLoL tIBop }SYSTEM_DESCRIPTOR_TABLE,*PSYSTEM_DESCRIPTOR_TABLE; ILI7v9hK o!bz0 | 爱好者博墅2N#`'O2{Bm
:Lly,\cZ g6}0当系统需要使用一个本机API的时候,就会去查找SYSTEM_DESCRIPTOR_TABLE这个表,也就是由ntoskrnl.exe导出的KeServiceDescriptorTable: 爱好者博墅x%x/N1PX7J1Y
JU/{1N
X_"J7j0代码:
)qJ
T.G })Bgcg
ZB0nt!RtlpBreakWithStatusInstruction: 爱好者博墅*z;Ld3z0m}\ 80527fc8 cc int 3 爱好者博墅.n qI.n@4](zV
H{ kd> dd KeServiceDescriptorTable 爱好者博墅+IY,ii7[ `} 80553380 805021fc 00000000 0000011c 80502670 爱好者博墅px7S/C5pv 80553390 00000000 00000000 00000000 00000000 爱好者博墅:Z,N/lh3Jx._Khj 805533a0 00000000 00000000 00000000 00000000
[+k,~;B*Spo#iu0805533b0 00000000 00000000 00000000 00000000 {x}"s_InwD$k4F0805533c0 00002710 bf80c227 00000000 00000000 爱好者博墅@(^
ktdy 805533d0 f9e6da80 f963a9e0 816850f0 806e0f40
P1IOUU8U;h0805533e0 00000000 00000000 00000000 00000000 /rLA0Iu0805533f0 97c5ac40 01c7abf5 00000000 00000000 爱好者博墅/}Tu1v3g
| 爱好者博墅:Oa"am5k1S-V 可以看到,KeServiceDescriptorTable的地址是80553380。现在看看这个地址保存的是什么,因为这个地址的值就是SYSTEM_SERVICE_TABLE的起始地址。好了,我们看到这个地址保存的是805021fc,那么也就是说,系统服务的地址表起始地址为805021fc了。看看这个表是些什么鬼东西: R$F0oQ5U!wLQ6?5E0代码:
Z^8l
Q3v0Q'U0kd> dd 805021fc SJ
a3L K/~2p+se0805021fc 80599746 805e6914 805ea15a 805e6946 爱好者博墅m;{P}1dv@T)D'g 8050220c 805ea194 805e697c 805ea1d8 805ea21c 爱好者博墅E1^2k0}A"g!uU/n` 8050221c 8060b880 8060c5d2 805e1cac 805e1904 ah]@m{
E:LSt08050222c 805ca928 805ca8d8 8060bea6 805ab334 爱好者博墅yh8W5g qON$K
E!re1{ 8050223c 8060b4be 8059dbbc 805a5786 805cc406 爱好者博墅]TL xAW D_B 8050224c 804ffed0 8060c5c4 8056be64 805353f2 爱好者博墅&oW"M$f/r
SxF 8050225c 80604b90 805b19c0 805ea694 80619a56 #z0^V|8B'ku%q08050226c 805eeb86 80599e34 80619caa 805996e6 Y8Xc{G@V0 |
|