|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
/ \# a( a% t" ^* l" ?& O7 G( X+ ? w3 T/ S: \9 K7 K3 r3 s$ [
书名:《windows内核安全与驱动开发》( U8 r- k v" Y( ^8 D% V7 M
作者:谭文;陈铭霖
0 k; A" S( I; X/ z/ C; D3 m出版社:电子工业出版社: w, o9 r# f: q& f0 Y1 Q0 U% Z
出版年:2015年6月1日(第1版)
1 t! c9 M; J% U( {9 U定价:139.00元' f" t D( {6 E: |
装帧:平装
% k% L& P; c1 o( OISBN:9787121262159
# N# R. G9 j" n! Z4 w n2 w
: l7 C; f) @' J0 T! y购买链接:! l5 p/ P8 X) `7 P6 A
" h+ Z! u0 }* p3 i# \# G5 ~
+ t5 B y% P5 p$ i亚马逊 -> 传送门% ?) u+ {6 | m% ?2 @! U, u
% O, J+ d4 l( c% I3 O2 ? }2 K当当网 -> 传送门& u. S! \5 c. N6 ]! q
% f& U. q5 Z2 i" H2 Y* u
京东 -> 传送门
' |# c; K3 N% }, b0 a& I8 E4 u/ H1 r% U: V3 _0 W
天猫 -> 传送门# b# v! C* s W3 ]) t4 z- p' H
: p' c! W3 a ~7 C6 e
; `9 O, v j4 l8 I. m0 n9 k% h内容简介:
3 K' q: p/ t Q7 i) `- V: N
# A' u$ y0 `: i5 l " ^3 B$ D" v! h1 u7 E5 z0 n
本书的前身是《天书夜读——从汇编语言到Windows内核编程》和《寒江独钓——Windows内核安全编程》。与 Windows 客户端安全软件开发相关的驱动程序开发是本书的主题。书中的程序使用环境从 32 位到 64 位,从 Windows XP 到 Windows 8 都有涉及,大部分程序不经过修改即可在 Windows 10 上运行。同时本书也深入浅出地介绍了进行内核安全编程所需要的操作系统、汇编等基础知识。1 ]2 T! b; ?" B( A2 _
2 G- S1 ?* e; a9 b
本书共分三篇,基础篇囊括了驱动开发的基础知识,降低了入门的难度;开发篇介绍了在实际工作中可能遇到的各种开发需求的技术实现,包括:串口的过滤、键盘的过滤、磁盘的虚拟、磁盘的过滤、文件系统的过滤与监控、文件系统透明加密、文件系统微过滤驱动、网络传输层过滤、Windows 过滤平台、NDIS 协议驱动、NDIS 小端口驱动、NDIS 中间层驱动、IA-32 汇编基础、IA-32 体系中的内存地址、处理器权限级别切换、IA-32 体系结构中的中断和 Windows 内核挂钩;高级篇包含了汇编语言、操作系统原理、处理器体系架构相关的内容。本书是由长期从事这个行业的工程师自己写的,所以处处以实用为准。对细节的考究主要体现在对实际问题的解决,而不是知识的详尽程度上。
* k7 Q2 B7 F; I1 v7 U, w. G6 w) P% o: r- @) S: N
目录:- T! `! T" i t4 P2 u* `# r3 ~
4 |( V: A, U% Q
1 m; o1 F$ O, y6 Q4 r, \基 础 篇
, k) F2 \9 B6 V2 G/ C/ {
& V4 [7 X6 s/ Z+ w' S第1章 内核上机指导2
) C2 z1 I9 c: P. c* B7 s+ e: m
' H- F( B8 F5 B: w1.1 下载和使用WDK2
% g+ l* | v' U' C! g1.1.1 下载并安装WDK2 3 w, a) O5 v! G h: U+ }; u) p/ U! X
1.1.2 编写第一个C文件4 . T" b. J8 F' r' C: V" p. Z
1.1.3 编译一个工程5 ( i8 H9 g) E# Q5 _! W
1.2 安装与运行6
0 T6 q6 s- p# e/ e, M1 z1.2.1 下载一个安装工具6 1 x' T0 L e$ T; F
1.2.2 运行与查看输出信息7 ; S/ g6 P. ?- ?. ]4 p- P
1.2.3 在虚拟机中运行8
6 L, p, y" ?5 r2 y: J1 ]$ i+ E1.3 调试内核模块9 / d, T r e- x$ @
1.3.1 下载和安装WinDbg9 0 o0 L$ x7 y6 x; J0 o1 V- E1 y0 i5 s5 N
1.3.2 设置Windows XP调试执行9 2 h3 d; l! q5 a2 M& H9 q
1.3.3 设置Vista调试执行10 + i4 A" o8 [6 A2 i$ F4 d
1.3.4 设置VMware的管道虚拟串口11 & p* K! v% |( _. U9 j3 G2 K* E+ [
1.3.5 设置Windows内核符号表12 / N+ W1 R1 y; H# W7 q
1.3.6 实战调试first13
" ?; u0 J) }4 U8 q
9 W7 L4 w, E4 M第2章 内核编程环境及其特殊性16 ( \3 F1 W( Q; p+ \
+ e7 n0 o' W6 \) Y2.1 内核编程的环境16 & ?& w* u5 M3 v2 O0 s: _
2.1.1 隔离的应用程序16
1 D$ F+ i) b3 K# g2.1.2 共享的内核空间17 * U1 H, J7 I% N+ i1 u
2.1.3 无处不在的内核模块18
$ s6 W! G5 ~* E8 r" t! C8 ~2.2 数据类型19
3 e" }) D; i; D7 v! }/ O3 F" a2.2.1 基本数据类型19 # V. _ Q/ l) q/ Z
2.2.2 返回状态19
+ y+ ?. U! D- a. `! O" i4 g. I) u! l2.2.3 字符串20 ) M9 ~1 l5 `. Z1 t: N I4 O5 m
2.3 重要的数据结构21 : Y- e% _) X1 b- z& K0 t/ y
2.3.1 驱动对象21 + b- l, W5 d; N3 Y' D, O
2.3.2 设备对象22 2 O: z% V* a3 x% o( h
2.3.3 请求24
; I( B. ]# P' j0 N( L! i5 ?2 O& k2.4 函数调用25 7 B5 ?% x' A- d) k8 A: o A1 Q$ s
2.4.1 查阅帮助25 0 ?% V! l) B. `& Q' ]9 j
2.4.2 帮助中有的几类函数26
% i) s5 z: v& Y0 h E+ p2 F( @2.4.3 帮助中没有的函数28 . A# c9 b$ S' f) c' W. j+ w- i8 e$ r
2.5 Windows的驱动开发模型29
/ o. N/ W% L) |/ ]% \# e2.6 WDK编程中的特殊点30 % u: ]: V, }1 b) [4 ]
2.6.1 内核编程的主要调用源30
, B% ~" @/ R* p5 K& |# {5 M. t9 Z2.6.2 函数的多线程安全性30 + M% c( f! E/ Z8 u7 i
2.6.3 代码的中断级32
. A% V$ g' n5 l" P5 V4 D' P9 z3 W2.6.4 WDK中出现的特殊代码32
2 Y" o% L% h. u8 o# q$ I3 e% ^/ _ S1 l& U/ K2 ?
第3章 字符串与链表35 3 d* r. }3 i8 s+ H- Q n
: G1 @1 _5 K9 a3.1 字符串操作35 3 b4 R1 K% m$ ~) L$ s
3.1.1 使用字符串结构35 8 U! L5 e1 s- ^0 ~0 w3 p$ d
3.1.2 字符串的初始化36 4 X6 u. o; f4 [4 I' |" q% A: K
3.1.3 字符串的拷贝37 3 w1 F7 P- ~/ e6 U0 D4 z
3.1.4 字符串的连接38
' E! Y# \, h/ c4 A3.1.5 字符串的打印38 * L. i" V$ b4 n3 _. q2 H6 A
3.2 内存与链表40
$ N; f& E$ D7 [ i5 u3.2.1 内存的分配与释放40 5 X" V; X1 T: c: Y( N$ J
3.2.2 使用LIST_ENTRY41
; r! a; ?0 f9 D1 [: n1 ]9 ?3.2.3 使用长长整型数据43
2 s- X9 w" X$ `" J: {( n3.3 自旋锁44 r) T) d/ y9 {& J
3.3.1 使用自旋锁44 " E# R* x& b1 K( j; D
3.3.2 在双向链表中使用自旋锁45 6 p8 B) H7 ~+ Y9 K G( T" N. \
3.3.3 使用队列自旋锁提高性能46 9 L* _* _+ \$ p: Q, [( \2 b% h
# }+ S+ d7 {9 t
第4章 文件、注册表、线程47
" @, z5 q. z6 h9 X9 ~. \% _2 n6 ?+ _7 z- B9 _0 k: V: l
4.1 文件操作47
5 x# O# e1 U( s, H" X4.1.1 使用OBJECT_ATTRIBUTES47
6 F& ?9 r6 L8 J% C3 r: t' m4 i4.1.2 打开和关闭文件48
: f* l# g9 {2 [( m, s4.1.3 文件读/写操作51
" c' g6 G6 G- a& M% r4.2 注册表操作53 ; z) E4 k9 C: Q: ~
4.2.1 注册表键的打开53
' R* |) p1 p4 K( I/ v4.2.2 注册表键值的读55 4 S U5 I9 T0 w) b9 E
4.2.3 注册表键值的写57
3 M8 t+ W+ ?, F- Y c7 I k. ?3 \4.3 时间与定时器58
- o7 M0 V. a6 H4.3.1 获得当前“滴答”数58
' E6 _; C: s9 V1 w2 L4.3.2 获得当前系统时间58
4 c& y" j- X" E) B* X& v4.3.3 使用定时器59
, U' V9 h+ G5 k8 ~! l4.4 线程与事件62 9 q' L6 W) R' N& L1 X) R2 O9 P7 n
4.4.1 使用系统线程62 ! X6 I! Q1 V! Y! [" r9 Z
4.4.2 在线程中睡眠63 & Y+ u/ z, b+ K3 w% k9 T0 R
4.4.3 使用同步事件64 - X! y( h* m1 l. N/ R, g# |
) R6 \; ?# S2 X1 X4 |' w第5章 应用与内核通信67
5 {) x; w/ Z2 [+ R9 D! y5 d6 V4 w" c* v5 ]
5.1 内核方面的编程68
) E, t7 m1 A3 `. A& b" t5.1.1 生成控制设备68 ) P' r+ x/ L, \6 q( p
5.1.2 控制设备的名字和符号链接70 % f. C# D* y5 f
5.1.3 控制设备的删除71 , v2 Q+ p Z' N
5.1.4 分发函数72
* W' x- @* \) K* X$ F5.1.5 请求的处理73 6 H4 @, Z0 R. t. u
5.2 应用方面的编程74
5 Z( E. ^; O; a# ^6 R. c. v S9 c/ ~& X5.2.1 基本的功能需求74
+ a1 @1 b! j+ j5.2.2 在应用程序中打开与关闭设备75 6 ^5 F' t% B' q% C. Q
5.2.3 设备控制请求75 5 Q# _' ?" P2 \
5.2.4 内核中的对应处理77 7 r4 ^, n, |8 `/ k- m' G
5.2.5 结合测试的效果79
. r) b1 ^' w3 f# b/ R5.3 阻塞、等待与安全设计80 9 f& g \# t2 D9 w% l1 m1 F
5.3.1 驱动主动通知应用80
0 W& _! Y6 ?' ^2 Z) c a2 i' ^5.3.2 通信接口的测试81 8 w# U' z1 g8 b$ R( u+ u+ W
5.3.3 内核中的缓冲区链表结构83 # ]" f6 f: z- m" L
5.3.4 输入:内核中的请求处理中的安全检查84
0 c! F2 S& Q5 C$ a9 E0 S8 E3 t" X5.3.5 输出处理与卸载清理85 & m9 M1 w3 i9 o( D( l2 ~* Z
! |6 {0 Y6 N" K5 n9 ~5 ?$ |* _第6章 64位和32位内核开发差异88
0 D! Y7 A |+ y9 _* T8 c+ T: U& s
& \, `7 w5 U7 b9 k6.1 64位系统新增机制88 0 t0 u* {5 d6 j5 C$ B
6.1.1 WOW64子系统88 9 m; G9 `0 e8 ?2 X
6.1.2 PatchGuard技术91
' @& Z4 K P% X% G; c% v6.1.3 64位驱动的编译、安装与运行91
- D3 b* T9 t* g0 L, T% x4 c6.2 编程差异92
L* p$ ^* S. c2 J ^- L6.2.1 汇编嵌入变化92
6 l/ w# `9 p4 \# M/ N1 j3 O6.2.2 预处理与条件编译93 * q, r* X! \! r4 p3 o. G8 Q$ Q1 @
6.2.3 数据结构调整93
" Z' f7 Z7 N9 C# ?; K0 p& i
; `6 P; h2 j/ I2 \% }- Q# S# x2 T! J( J
开 发 篇 ( R) C# }9 w' D
8 k% `" R, @: `5 l0 j- |3 U第7章 串口的过滤96
( W# p% V* e7 P% x8 y8 _: d7 \: d, c. t6 G
7.1 过滤的概念96 * g% @7 M2 o. D# ]) m/ m6 ]8 I
7.1.1 设备绑定的内核API之一97 ; n3 v! m% x0 s& c
7.1.2 设备绑定的内核API之二98
# E2 _8 w7 f9 n- z: r% i7.1.3 生成过滤设备并绑定98 $ l8 [1 \- P* j; a5 c: K: b; F4 f
7.1.4 从名字获得设备对象100
0 {- I2 \, q8 l4 p4 W0 v7.1.5 绑定所有串口101 1 l' A. H# p/ k* L
7.2 获得实际数据102 ' `) x1 |) n G% e3 U
7.2.1 请求的区分102 ) }& p" {7 o' N, q6 P' F
7.2.2 请求的结局103
0 w# P% A( s* _* p0 l7.2.3 写请求的数据104
+ U$ O/ q! H1 g1 E7 o7.3 完整的代码105 1 C! Z+ K* d8 t, C: F
7.3.1 完整的分发函数105
- c( N$ Z5 d2 c) y7.3.2 如何动态卸载106 # m, X3 G: V2 g/ l7 } `
7.3.3 代码的编译与运行107
# ]: ?) g# L7 G# D) T# R4 q" S6 M% @ H" x% I+ L$ Y3 ^
第8章 键盘的过滤109 5 M" @, x6 s8 x5 d$ O
" ~9 i/ `+ M- U- n6 G% O
8.1 技术原理110 1 |( T3 z: S- C9 A) F9 b
8.1.1 预备知识110
% p. d$ X- S9 w1 g8.1.2 Windows中从击键到内核110
' G, n. E8 m8 e7 ?/ r& y8.1.3 键盘硬件原理112 , h3 Q9 s/ Q( g d) z* X% w
8.2 键盘过滤的框架112
, ^, P: f3 E1 X8.2.1 找到所有的键盘设备112 5 S+ ?5 M' Y% F4 a$ c/ E
8.2.2 应用设备扩展115
( U1 V: M2 P. w8 c/ e4 Z8.2.3 键盘过滤模块的DriverEntry117
/ h2 P$ M5 S: J7 M/ Y4 v8.2.4 键盘过滤模块的动态卸载117
( T: b( c8 @6 v; Z0 s( x8.3 键盘过滤的请求处理119 8 ?# H [" x; t3 m1 W
8.3.1 通常的处理119
3 v5 o4 a: Q e( k; G8 u! U9 F$ I8.3.2 PNP的处理120 $ R8 G7 a5 ~' H
8.3.3 读的处理121 " S W9 K+ K/ P4 G+ p" S$ Z9 i
8.3.4 读完成的处理122
. _6 R' \2 y; D R: E" }: e8.4 从请求中打印出按键信息123
3 \1 }$ W7 o2 {' W* q* e8.4.1 从缓冲区中获得KEYBOARD_INPUT_DATA123
3 v3 i; z# k/ I, m: T' _8.4.2 从KEYBOARD_INPUT_DATA中得到键124
" |# C1 ?+ p2 ~) ?& W8.4.3 从MakeCode到实际字符124 ! H$ H; S# N5 Q$ e
8.5 Hook分发函数126
r' C- p8 z& A; o; i7 K* H* e2 \8.5.1 获得类驱动对象126
" [# v# {4 p8 K8.5.2 修改类驱动的分发函数指针127 , p: m- [. @1 U o) G( B. d
8.5.3 类驱动之下的端口驱动128 " x9 y+ h3 R/ q! y& v0 D9 Q
8.5.4 端口驱动和类驱动之间的协作机制129
7 v: I4 ]' {8 X. \8.5.5 找到关键的回调函数的条件129
* A2 {6 a" Z2 k% F: u. v5 p! a8.5.6 定义常数和数据结构130
4 J# B9 t; y' W y8.5.7 打开两种键盘端口驱动寻找设备131
7 Z$ `, {' w4 c( g2 m1 K4 M0 E$ p8.5.8 搜索在KbdClass类驱动中的地址133 " ?& U' O+ X9 }7 s; F
8.6 Hook键盘中断反过滤135
* q6 s0 I1 u# h$ |. U' g8 G8.6.1 中断:IRQ和INT136 # |' L$ E1 E7 [* ?% }( b1 B* u
8.6.2 如何修改IDT136
, ^% U8 E J1 a8.6.3 替换IDT中的跳转地址137 ' R: i) l) D' b1 N9 `' b& z c" b
8.6.4 QQ的PS/2反过滤措施139 $ w) @9 z8 ]2 ]' o4 U
8.7 直接用端口操作键盘139
1 l v6 x' [6 `( n6 l7 o8.7.1 读取键盘数据和命令端口139 " }9 n% `) X, k5 C' {9 x
8.7.2 p2cUserFilter的最终实现140
* Y7 o8 }; {2 u7 J( v( b" P) l
. Z2 s/ o- V6 \+ z第9章 磁盘的虚拟143
. Y1 H8 L) z9 c8 w% C! U x
. z% ]* @, m4 A9 ^! ~6 l4 \% h9.1 虚拟的磁盘143
/ |. e3 t& N( g6 {0 t/ n9.2 一个具体的例子143 , P% G. x |; L. N1 r* x$ s0 A) F- d
9.3 入口函数144 $ H7 Q# [; C5 O# }/ @
9.3.1 入口函数的定义144 ; c8 ], o/ l0 A8 k( U# K4 G( |
9.3.2 Ramdisk驱动的入口函数145 _8 G& P" @$ N: M5 T- F
9.4 EvtDriverDeviceAdd函数146 8 ~; \ a) g m% q; C
9.4.1 EvtDriverDeviceAdd的定义146 : v6 ]% B! V* v4 }
9.4.2 局部变量的声明146
4 ^0 Z0 V! M; n8 z2 s$ H5 `# t$ \7 }9.4.3 磁盘设备的创建147 6 B2 j# X1 y% @9 a* c, ]1 e
9.4.4 如何处理发往设备的请求148 2 f9 u! z! G) h
9.4.5 用户配置的初始化149
a, `8 W, {, s+ s# T7 a8 m9.4.6 链接给应用程序151 ' ?5 R( r" ^* k- n: k% T- O& H
9.4.7 小结152
/ n2 [& ^9 o5 w: x- Q9 C9.5 FAT12/16磁盘卷初始化152 ) B% c% n+ F0 W) N& @9 r- h
9.5.1 磁盘卷结构简介152 # v. s( t j5 z8 c6 h. _& `
9.5.2 Ramdisk对磁盘的初始化154
+ Q6 j! f& H3 w4 v9.6 驱动中的请求处理160
6 `# Q6 X% [& `6 @9 u9.6.1 请求的处理160 . \) x6 U9 {- l" ]8 o* d
9.6.2 读/写请求160
* a7 @/ g1 v5 c9 q0 b& Y% J' F9.6.3 DeviceIoControl请求162 * Q# R$ j, t" S9 D4 U
9.7 Ramdisk的编译和安装164 # ~' D+ t5 l7 f# R' y* O2 i
9.7.1 编译164
9 e) s6 `4 d+ `( L9.7.2 安装164
" T; U7 Y) ^0 c, {" b- p9.7.3 对安装的深入探究165 8 s4 U" `( c- y1 C" j1 Q
8 g3 k, Q V) l2 O/ [9 { y
第10章 磁盘的过滤167 3 U9 I. m- Y3 X; @
/ L$ ], u8 a! y1 t
10.1 磁盘过滤驱动的概念167 ; Q) u& H% e- m d
10.1.1 设备过滤和类过滤167
# b; l% ^1 R- D( q# {3 \10.1.2 磁盘设备和磁盘卷设备过滤驱动167
9 M4 s# v* Z8 n4 `& z10.1.3 注册表和磁盘卷设备过滤驱动168 . ^( ]& n7 h4 g7 k! _* a
10.2 具有还原功能的磁盘卷过滤驱动168
3 C2 P2 Y/ u [* X2 f4 [10.2.1 简介168
. B/ Q4 r+ _1 d z10.2.2 基本思想169 " E& R' d. ^3 b1 p; v
10.3 驱动分析169
0 q- h. k6 ~, m10.3.1 DriverEntry函数169 : N3 T9 O' {: p0 V3 X7 B
10.3.2 AddDevice函数170 1 E" t+ g9 a7 _1 R( a
10.3.3 PnP请求的处理174
+ q$ }6 u3 Y+ m4 {* I4 b10.3.4 Power请求的处理178 $ u8 i {1 ]* _
10.3.5 DeviceIoControl请求的处理178 ) w2 Y4 Z( \. K+ `' y
10.3.6 bitmap的作用和分析182
! @; \6 s5 B' B, V7 s10.3.7 boot驱动完成回调函数和稀疏文件187
/ B* V( ~+ @( v1 k# T$ N, Y10.3.8 读/写请求的处理190 5 z4 p! K8 n1 i
: J! B# y8 E( }, k5 D5 F$ |4 H第11章 文件系统的过滤与监控199 2 i+ @1 G. J6 a/ \6 [
! O" X, w- g6 F% F! Y t Z+ \11.1 文件系统的设备对象200
& q$ U. I' L" A: @1 y. V2 V; m; E11.1.1 控制设备与卷设备200 + M: y2 _4 [! |2 \9 S4 \2 C, l
11.1.2 生成自己的一个控制设备201 : }( K; c+ O: E; I8 ?
11.2 文件系统的分发函数202
' G) b4 w% {! v. I+ a4 ^- b11.2.1 普通的分发函数202 ; P0 S% p" [2 ?1 l4 `
11.2.2 文件过滤的快速IO分发函数203 , B% n, z3 T" }, z
11.2.3 快速IO分发函数的一个实现205 : ]# Y8 l1 N+ D. F' u5 D
11.2.4 快速IO分发函数逐个简介206
5 H2 F$ Z. T6 m2 l2 d11.3 设备的绑定前期工作207 + N) {1 K4 n1 V0 e r1 m, w& k
11.3.1 动态地选择绑定函数207 4 `% F! C% F# q8 e6 Q& M
11.3.2 注册文件系统变动回调208
6 e$ U; Q* W8 X11.3.3 文件系统变动回调的一个实现209 6 }1 V2 t2 v" b
11.3.4 文件系统识别器211 ) j' h/ p* `7 i. _
11.4 文件系统控制设备的绑定212
8 |* R2 b- [5 y3 L4 J11.4.1 生成文件系统控制设备的过滤设备212 & D" z, b/ D# o% m
11.4.2 绑定文件系统控制设备213
, S6 o/ B' W9 [2 J4 ^, g11.4.3 利用文件系统控制请求215
& K3 m- N; W$ r# }# K5 ~11.5 文件系统卷设备的绑定217
3 K( }. D! g0 @" {# x" r' C11.5.1 从IRP中获得VPB指针217
, N, S& M( F& |) J11.5.2 设置完成函数并等待IRP完成218 + G) ]9 N! W- g3 ?: ?
11.5.3 卷挂载IRP完成后的工作221
2 M Y( l& W3 D: b) ~; G0 V6 f11.5.4 完成函数的相应实现223 2 Z F4 u+ j$ c- B
11.5.5 绑定卷的实现224 & O( D0 N1 e0 I* h G7 O
11.6 读/写操作的过滤226
2 ^7 P; ?' `; _# a+ e11.6.1 设置一个读处理函数226 ! j& F- h8 I( ^+ Q
11.6.2 设备对象的区分处理227 5 G$ G+ _. h; B: a: A
11.6.3 解析读请求中的文件信息228
! m0 e, O9 W5 i- k* Z1 b5 L- k11.6.4 读请求的完成230
7 z3 A! Q8 j6 a5 G' q9 V) A1 x11.7 其他操作的过滤234 5 d4 W) P6 |$ \8 K
11.7.1 文件对象的生存周期234
! Q; C9 T! {8 c9 k11.7.2 文件的打开与关闭235
^* I5 ~ ~+ U" J/ J7 e11.7.3 文件的删除237 $ v3 }/ x4 T' K
11.8 路径过滤的实现238
. I1 a3 b; D% s' F n& w11.8.1 取得文件路径的三种情况238 2 v0 m$ _( n( \8 \% l# s
11.8.2 打开成功后获取路径238
0 W2 e4 n5 _, `2 o2 s! Z11.8.3 在其他时刻获得文件路径240
4 j: h h; p7 g1 [$ u11.8.4 在打开请求完成之前获得路径名240 . w" \, A: c) x y
11.8.5 把短名转换为长名242 . y/ N9 q1 `9 z/ d: G. M: n/ ^: G, d
11.9 把sfilter编译成静态库243 2 n' Y$ Q/ w$ [: r
11.9.1 如何方便地使用sfilter243
0 n$ s0 i" [; U" z# i+ P11.9.2 初始化回调、卸载回调和绑定回调244
5 x* ^2 P( f) H11.9.3 绑定与回调245 ( V! p/ F5 a! Y& w" B) d! v! n
11.9.4 插入请求回调246
a l Z: P5 m2 K- b11.9.5 如何利用sfilter.lib249 ' Q; a$ e( o+ t1 W
4 c% t* v1 C" C第12章 文件系统透明加密252 . _) T6 o: x8 p
1 T6 f1 b) t5 [9 x) n' j
12.1 文件透明加密的应用252
8 w9 |7 o& U6 Y5 m2 I12.1.1 防止企业信息泄密252
/ a, C+ s( j: R6 N12.1.2 文件透明加密防止企业信息泄密253 7 V/ Q3 L( _8 o$ H* F
12.1.3 文件透明加密软件的例子253
% M$ R2 o6 u. n9 L9 {12.2 区分进程254 - w% |) q8 j; a$ L, X) |! p
12.2.1 机密进程与普通进程254 2 O$ j: w+ J/ T" r% k
12.2.2 找到进程名字的位置255 # s' t% q9 a& [' s, j3 Q
12.2.3 得到当前进程的名字256
( Z# x3 H% m+ U12.3 内存映射与文件缓冲257 0 `- G) S9 G% e& |: K! R3 J0 t3 n
12.3.1 记事本的内存映射文件257 / a. D) h! v4 R
12.3.2 Windows的文件缓冲258
! A) j: F/ }: \% N5 z& Y5 i4 R$ e12.3.3 文件缓冲:明文还是密文的选择259 ) I, f* u( l+ J
12.3.4 清除文件缓冲260 * u% ?6 Q1 Q- A$ M
12.4 加密标识263- {$ i& \6 u/ W) R& o
12.4.1 保存在文件外、文件头还是文件尾 263
6 Z: A+ E& n. j7 z: O12.4.2 隐藏文件头的大小 264: e4 E: A$ h" p* n2 w, k0 S" h
12.4.3 隐藏文件头的设置偏移 266
: u+ w% N7 d( r12.4.4 隐藏文件头的读/写偏移 267
6 w: C1 h7 W1 K: ]12.5 文件加密表 267
2 I; n+ |; f, F8 C" m. o5 a12.5.1 何时进行加密操作 267: t1 | m6 t; r1 L; o2 H& a s6 a
12.5.2 文件控制块与文件对象 268
( Y8 Z* b2 e1 S; I$ i7 U* q12.5.3 文件加密表的数据结构与初始化 2691 @# i$ _4 J5 Q( b; }( u
12.5.4 文件加密表的操作:查询 270
4 s: X* p# U+ q12.5.5 文件加密表的操作:添加 2718 M5 f4 J5 R7 T' a: [. I3 E
12.5.6 文件加密表的操作:删除 272
* @" ?% I5 }- P0 h$ u. X12.6 文件打开处理 273
I( ?& `3 \ H7 j12.6.1 直接发送IRP进行查询与设置操作 274
- f8 A( v3 V/ C$ `( }: ~* S12.6.2 直接发送IRP进行读/写操作 276% r2 d6 y. i2 `) A: p
12.6.3 文件的非重入打开 2778 F; Y( \, c! I1 Q
12.6.4 文件的打开预处理 280
' J6 l! p' s9 i- _5 {! E12.7 读/写加密和解密 285; j% G9 ~2 C2 x |' m- E
12.7.1 在读取时进行解密 285
& f8 k* J! |# N7 h1 i12.7.2 分配与释放MDL 286
3 |4 H: g6 n# M6 W% |$ m0 d) C12.7.3 写请求加密 287
! l9 Q7 v# h. X* ^4 {4 }12.8 crypt_file的组装 289, t4 ]- j# Y1 M2 a2 I
12.8.1 crypt_file的初始化 289
; w! r' q8 I5 D, r+ I2 N12.8.2 crypt_file的IRP预处理 290
- ?7 @3 P& l7 C" @; p3 y12.8.3 crypt_file的IRP后处理 293
! \3 }# X# D" J+ F5 L( P
+ ]7 b& D7 w8 H1 @: H; j第13章 文件系统微过滤驱动 297
( p8 |) a2 P1 @) q/ v/ @
7 j7 m% y% j& ~4 g4 e13.1 文件系统微过滤驱动简介 297
: {) U7 S: s. s; n% v13.1.1 文件系统微过滤驱动的由来 2979 a4 g) Q' {9 N- I8 Q5 X% o+ F
13.1.2 Minifilter的优点与不足 298% I" }8 D; _, y- [- k
13.2 Minifilter的编程框架 298, c! d& {5 L7 L. i7 v6 r
13.2.1 微文件系统过滤的注册 299) G- j# g9 p( c% y
13.2.2 微过滤器的数据结构 300
0 {! d( v9 j# p, P1 z6 _& M13.2.3 卸载回调函数 303
( Y, L+ n) E( _; Q5 B13.2.4 预操作回调函数 303
; b) G4 B- J* C13.2.5 后操作回调函数 306
: ~4 J! l) |5 |* \ u9 `0 F13.2.6 其他回调函数 307
3 F) k8 M: p: a! s- w! B13.3 Minifilter如何与应用程序通信 309
8 G" l+ p9 o" |8 [13.3.1 建立通信端口的方法 310
* h5 l: U4 `# I2 x2 z P13.3.2 在用户态通过DLL使用通信端口的范例 311" W# U [5 V! P4 Z
13.4 Minifilter的安装与加载 314
% Z' {: e5 }' X( ?" c13.4.1 安装Minifilter的INF文件 314$ Y+ d- E @' @0 R y4 R
13.4.2 启动安装完成的Minifilter 3164 l/ j' d8 l- o1 X
8 l% C4 _: h- L/ U! Y, Z
第14章 网络传输层过滤 317
3 }$ F' |$ A; s6 x5 E/ M7 u5 E) ?& b# U5 f7 m; A
14.1 TDI概要 317: X0 }1 _ i) G7 I& m; r; y
14.1.1 为何选择TDI 317
- Q$ \, |9 E4 z6 r) d+ \" B5 J14.1.2 从socket到Windows内核 318
7 A' H, d( @8 ~" [" B% g14.1.3 TDI过滤的代码例子 319
2 a+ V% G! u% q% }+ n14.2 TDI的过滤框架 319
5 L6 r2 E' x9 U- p3 O5 i5 L$ W2 x14.2.1 绑定TDI的设备 319
6 v1 h2 q. t. Z$ F14.2.2 唯一的分发函数 320: ?0 r- Y- p( z- f) K; c! u
14.2.3 过滤框架的实现 322( a0 ^0 d& D& {& i$ [7 `1 d8 W
14.2.4 主要过滤的请求类型 323
7 n- h& l' E9 f7 ^! k3 h" \' x14.3 生成请求:获取地址 324
7 X. ~# w1 D3 e6 _6 y14.3.1 过滤生成请求 324
( g, a2 A4 y X9 N/ C14.3.2 准备解析IP地址与端口 326
1 `' [, Q! e( K* W1 L14.3.3 获取生成的IP地址和端口 327
" N' H e4 W) F/ B14.3.4 连接终端的生成与相关信息的保存 329' ]4 B7 q" R N
14.4 控制请求 3304 \7 h: O$ M! B) w% w$ `+ J( r; I
14.4.1 TDI_ASSOCIATE_ADDRESS的过滤 330
, w9 D& V0 _/ A) v# [9 z: T7 Y14.4.2 TDI_CONNECT的过滤 332' c' p* T# c! i" ^
14.4.3 其他的次功能号 333& `2 o4 s' W' Y
14.4.4 设置事件的过滤 334
, i8 }+ B4 E9 v& g* n14.4.5 TDI_EVENT_CONNECT类型的设置事件的过滤 336
$ p) |- q3 E) ^4 l9 b$ k$ B2 W14.4.6 直接获取发送函数的过滤 3376 V1 a: |; \2 c0 K. c! D/ g9 T4 N
14.4.7 清理请求的过滤 3390 b. Y } N& E% `6 F' i* \: ]( c
14.5 本书例子tdifw.lib的应用 341
" P$ Z4 Z) `3 p' G) j14.5.1 tdifw库的回调接口 341. o, r& _! t- j: l8 x' u
14.5.2 tdifw库的使用例子 342
5 }5 r/ f# E, @- R. W4 P
' b; m1 `- o( V3 W# `$ h7 ^0 {第15章 Windows过滤平台 345! q$ S& T8 t9 \2 \8 P5 q
. w: m1 U/ r; e' J! R
15.1 WFP简介 345
Y% k* a7 Z& Z8 y# S15.2 WFP框架 345
! e: N3 F6 B5 `: N15.3 基本对象模型 347
7 O8 e7 W; |( H# M, j15.3.1 过滤引擎 347
3 ~/ b9 ]+ Y2 i# Y Y& r15.3.2 垫片 347
9 m, T2 ?! U/ b |7 J! F4 z0 i15.3.3 呼出接口 347
' s D) G; O$ K5 p5 n: i15.3.4 分层 3486 S) E5 F3 f4 X* [3 I! h, w
15.3.5 子层 349- f; k2 u0 s, u' Q; r
15.3.6 过滤器 350
' O$ p: E. K% q, o% K4 u15.3.7 呼出接口回调函数 354
3 \! R8 \! n3 I15.4 WFP操作 359/ M- n3 U( r7 B
15.4.1 呼出接口的注册与卸载 360$ x1 W! A* e2 Y
15.4.2 呼出接口的添加与移除 360" z7 Y% s! }( t+ X4 W
15.4.3 子层的添加与移除 361
5 n5 `1 U8 i, g' R2 ?15.4.4 过滤器的添加 362" K! y+ H& v- k4 L5 v a v/ M
15.5 WFP过滤例子 362! k) ]$ A* Z# |/ b& e" P0 p
2 y) u) T1 d% }0 L+ L' a. p
第16章 NDIS协议驱动 3707 r) Q8 z& Q3 N) Y
T' E) o. x* O( B16.1 以太网包和网络驱动架构 370
3 }% ?% H0 C u0 N' U) J16.1.1 以太网包和协议驱动 3701 \. K9 q; @ O" o
16.1.2 NDIS网络驱动 371: L$ o2 U0 Y& p# ~' e' j$ h; ~
16.2 协议驱动的DriverEntry 372, w& ]! g+ r6 d+ `6 i, p( @
16.2.1 生成控制设备 372
$ \3 g2 h0 [4 ]9 ~+ `* d16.2.2 注册协议 374
?* s/ o1 |1 b L v: Q16.3 协议与网卡的绑定 375
+ h3 E# E9 U* {; [1 C ?16.3.1 协议与网卡的绑定概念 375. H9 M0 Z3 s' X% ~0 j
16.3.2 绑定回调处理的实现 376
& C2 Z2 ]1 C! T16.3.3 协议绑定网卡的API 378- X" E; F0 E6 Z5 Y% N2 H- T2 ~
16.3.4 解决绑定竞争问题 3791 [" P4 I" k' l' Y1 ^3 _4 j# {+ h
16.3.5 分配接收和发送的包池与缓冲池 380
4 H w3 L/ A5 h( a# o16.3.6 OID请求的发送和请求完成回调 3810 ]& { B- }& }! ]4 a5 T+ g
16.3.7 ndisprotCreateBinding的最终实现 385
, [$ Y+ H4 R+ K6 A16.4 绑定的解除 390. v3 V4 c4 o' }7 K) R6 {/ x2 ~
16.4.1 解除绑定使用的API 390
% f( }& L% f2 d& L/ ^16.4.2 ndisprotShutdownBinding的实现 392
* J2 e' m: ^0 o16.5 在用户态操作协议驱动 3951 `# u& M& {: O D# O q" ^
16.5.1 协议的收包与发包 3956 [ b; R" |$ x: N* [! y. K/ x& k
16.5.2 在用户态编程打开设备 396
6 e$ E( l5 n& V* A( D! c16.5.3 用DeviceIoControl发送控制请求 397
g9 ]- r# G. `0 u. B5 ~( B16.5.4 用WriteFile发送数据包 399
$ e9 `0 U% V% ^/ K, O$ Q: e2 ^7 _16.5.5 用ReadFile发送数据包 400
2 B6 T" { B+ o& { `16.6 在内核态完成功能的实现 402
5 U) i1 B5 ]$ q- A+ {/ B16.6.1 请求的分发与实现 402
/ X2 {8 P# E# b16.6.2 等待设备绑定完成与指定设备名 402# K% j v8 z# F" _+ f6 ~ O
16.6.3 指派设备的完成 403
7 O* v* H) i3 c16.6.4 处理读请求 406: j% I3 S/ m. P* n: z* G
16.6.5 处理写请求 408, ]$ t3 [ q+ ?6 ~8 u
16.7 协议驱动的接收回调 412
3 G. ]4 s6 _- x16.7.1 和接收包有关的回调函数 4124 m# i! p8 g3 T' ?# x9 E0 n0 ^
16.7.2 ReceiveHandler的实现 413
* V, X! S& t9 K% `1 c16.7.3 TransferDataCompleteHandler的实现 417
( J) `2 Q6 z& e/ [$ v6 f0 X16.7.4 ReceivePacketHandler的实现 418) N2 y/ J0 g: J% x+ F9 {$ a+ m
16.7.5 接收数据包的入队 420) N3 S5 s0 d, z0 s+ I3 r9 V
16.7.6 接收数据包的出队和读请求的完成 422
- b8 l9 j3 R6 \1 P& A5 @( Q0 A7 n2 S1 ?
第17章 NDIS小端口驱动 4271 s( J; t$ R' s v" q0 {4 v3 a
( |9 ~: @/ j% U! ^$ E* z5 S17.1 小端口驱动的应用与概述 427
1 t2 n" r4 n( b' I! n4 Z17.1.1 小端口驱动的应用 427
2 q, J1 R. j, _0 e1 a17.1.2 小端口驱动示例 428
0 y" S! l/ v; K* S: H" F! j" f: a17.1.3 小端口驱动的运作与编程概述 429' f/ o9 ~7 s; @) a6 _
17.2 小端口驱动的初始化 429- t' `- x) l* e: s" F% u Y8 W! n
17.2.1 小端口驱动的DriverEntry 429* v) o" g* r( X5 R
17.2.2 小端口驱动的适配器结构 431
, b2 X' [% Y! C) _" x% L( s17.2.3 配置信息的读取 433
- T r- m6 F2 x! j. C( p& D17.2.4 设置小端口适配器上下文 433' n: z5 h1 A! H$ L4 S$ a6 }
17.2.5 MPInitialize的实现 434
; M* Z# O' }2 I1 I& I8 \17.2.6 MPHalt的实现 437/ S+ E! z1 G5 ^
17.3 打开ndisprot设备 438
5 ?% _, }) @& p+ N* c% ?6 S' D17.3.1 IO目标 4380 e4 O; N9 n6 ^6 }# V- S* m. F, @
17.3.2 给IO目标发送DeviceIoControl请求 4391 b6 F; r2 N# X' n3 M' d. d: t/ Q
17.3.3 打开ndisprot接口并完成配置设备 441
+ a6 q5 p1 K0 o! @17.4 使用ndisprot发送包 443: `1 K# Z/ ], r' W
17.4.1 小端口驱动的发包接口 443
2 a0 j) _' H7 p; @ B' A17.4.2 发送控制块(TCB) 4440 X) t. J$ W# q |
17.4.3 遍历包组并填写TCB 446* H9 h6 ?) H$ L9 g |
17.4.4 写请求的构建与发送 449 [0 d3 w5 O A# _ d
17.5 使用ndisprot接收包 451
3 w, b& j1 a5 l6 O$ p17.5.1 提交数据包的内核API 451! F3 l/ X C) n4 {
17.5.2 从接收控制块(RCB)提交包 452
/ @& M: S; k5 m% n. \17.5.3 对ndisprot读请求的完成函数 454
, a- T% \% g0 x- a. {! T! @' |6 _, U17.5.4 读请求的发送 456
. }. O; y! F# Z3 M) r17.5.5 用于读包的WDF工作任务 4573 z" v9 H: ?4 S) y, _0 k' x8 Z
17.5.6 ndisedge读工作任务的生成与入列 459% T$ _8 y! F$ D/ L4 Q; {1 o
17.6 其他的特征回调函数的实现 461% G* c4 X$ j/ O8 F. d
17.6.1 包的归还 461
9 ^6 o7 {+ H& w! k; v+ o* P% ~17.6.2 OID查询处理的直接完成 462
/ J& Z' |" }5 d- d2 h! r. d1 O1 }17.6.3 OID设置处理 4651 P) n1 v( P6 k# ^9 f
# ^' ~# l7 B, q7 J# b6 J4 b
第18章 NDIS中间层驱动 467* }9 Q. f0 V! f7 H3 w
( b' g2 \" p; }7 ~" S18.1 NDIS中间层驱动概述 467( N6 E' c4 }; b3 i3 v. G9 o
18.1.1 Windows网络架构总结 467
. p/ o& O" l% E1 S. h- t1 a18.1.2 NDIS中间层驱动简介 468. m- K6 o7 M6 o
18.1.3 NDIS中间层驱动的应用 469- R }1 X) S T4 }7 |3 I
18.1.4 NDIS包描述符结构深究 470
6 h% A) _) |7 Q& Q% O4 c18.2 中间层驱动的入口与绑定 473
8 `4 }! @ ]; b8 |/ \; C18.2.1 中间层驱动的入口函数 473
# o- C) g' I/ t18.2.2 动态绑定NIC设备 474- {# d6 y0 S# }& `7 k& {& S
18.2.3 小端口初始化(MpInitialize) 4754 o% Y# b4 s/ U! K
18.3 中间层驱动发送数据包 477/ |# V3 q5 D' Q1 C& e2 M
18.3.1 发送数据包原理 477( e$ K* C; s* h; _9 @1 ^, X- @6 E
18.3.2 包描述符“重利用” 478
7 B9 r( f7 E) x1 p18.3.3 包描述符“重申请” 4810 Q& x1 A( x0 ~% L
18.3.4 发送数据包的异步完成 482
1 K1 s$ }3 y8 ]3 I- K18.4 中间层驱动接收数据包 484
2 T8 O B I+ w3 Q7 @% T( w18.4.1 接收数据包概述 484
/ i* y& q1 f! s, v6 g: V18.4.2 用PtReceive接收数据包 485. A7 _0 \) B, H
18.4.3 用PtReceivePacket接收 490
$ S$ }4 K" X: L3 X: l: B# z18.4.4 对包进行过滤 491
4 D1 ]7 ?4 H q2 u" t18.5 中间层驱动程序查询和设置 494! \5 }( S# A( q0 W
18.5.1 查询请求的处理 494
' R3 S$ T% d3 ~7 t18.5.2 设置请求的处理 496
4 m5 I( P6 y) o- u18.6 NDIS句柄 498
9 z$ X# ^$ G5 n1 N9 R18.6.1 不可见的结构指针 498! [# X/ Q# A1 o/ ^, j
18.6.2 常见的NDIS句柄 499
$ M/ Y% t7 E) K) E. y% s, G18.6.3 NDIS句柄误用问题 500
9 V1 P. |" n; J8 E' o$ ^# e18.6.4 一种解决方案 5028 j s, s$ s8 E) x
18.7 生成普通控制设备 503. z) n4 D* I+ b2 b" G. F7 ^1 t
18.7.1 在中间层驱动中添加普通设备 503
" R6 ^6 Q- a: {. K18.7.2 使用传统方法来生成控制设备 505* e( ~& p t+ v1 I: s5 G; D% S
/ p. A& W% e3 k) K! [! W. y& j
第19章 IA-32汇编基础 511
- h$ ~+ ^ U4 z" r7 _( H) J4 R+ b3 Z; Z: Z8 K) l6 I
19.1 x86内存、寄存器与堆栈 511
+ L, @9 {# x7 U j9 D19.1.1 _asm关键字 511
9 E* H1 h8 F# D6 F) B19.1.2 x86中的mov指令 512" p- _+ q6 w. C4 i' k: v
19.1.3 x86中的寄存器与内存 512
+ F4 ^: f+ h' h19.1.4 赋值语句的实现 513% n& N" o/ `* z6 |/ l) X
19.2 x86中函数的实现 514$ n- E$ D& y) {* w% z" W. [
19.2.1 一个函数的例子 514
/ y. b) t: n( C+ x' o19.2.2 堆栈的介绍 515
7 u, |3 Y, `8 m! }5 f% P6 j19.2.3 寄存器的备份和恢复 516
8 E7 V7 o- M+ [+ k19.2.4 内部变量与返回值 5183 W8 `' o, y1 t! b7 R/ I3 d% u
19.3 x86中函数的调用与返回 521
! x5 u$ d( L- Q5 y' |2 O$ _ H19.3.1 函数的调用指令call 521$ p0 K2 `* G# b# D- Z& m
19.3.2 通过堆栈传递参数 521& f6 Y4 c) y8 v
19.3.3 从函数返回 523
* y5 u* Z" `/ J& h19.3.4 三种常见的调用协议 524
& m; Q8 j2 J8 R# X |5 q O6 o19.4 从32位汇编到64位汇编 526. b5 \9 Q* X: S# I7 Y
19.4.1 Intel 64与IA-32体系架构简介 526
- @+ m1 \+ u$ m; G9 F! m& \19.4.2 64位指令与32位指令 5269 x2 g6 F. m5 H5 g$ C! F- i* r
19.4.3 通用寄存器 527+ \3 F8 w6 \9 E! G% v4 R7 d
19.5 64位下的函数实现 5283 @) c+ R4 H; }) m* R5 E `# Z8 M
19.5.1 函数概览 528( F: z1 c9 J1 W- E. U
19.5.2 32位参数的传递 529
& {' v3 r) H/ Y4 {- E, f' a4 w) _19.5.3 64位参数与返回值 530# Y( w( p& q3 Y( h% D6 Q$ f
19.5.4 栈空间的开辟与恢复 531
% N) m' y. p! M! u$ C* G( C9 C' H- {9 z
# P% u$ J$ [8 j; M0 t* }第20章 IA-32体系中的内存地址 534, ^$ r& g/ |6 p+ Y* @6 Y- M
2 [+ q2 K7 i1 T8 W& M20.1 内存的虚拟地址 534
0 V) I1 D2 ?% y2 p20.1.1 C语言中的内存地址 534
' b6 }1 c2 ]1 {. U9 e7 D/ U8 _5 p20.1.2 虚拟地址的构成 535
7 ]: p8 Q F( r' _20.1.3 段的选择 536' `$ @) L$ q. @. T3 v& Z; ~1 x* X
20.2 全局描述符表和段描述符 538
f, @- A0 L; P# C$ q/ {' u20.2.1 全局描述符表 538
0 y9 L, \ N4 j( X$ i20.2.2 段类型 539+ {, ~9 B3 b3 b; d# \! |$ F9 T
20.2.3 段寄存器与段选择子 540
' q }" U5 ?1 G3 g% s" l5 w20.2.4 64位模式下的段 5416 d0 G" H: S- ~0 y$ g; b4 g9 N% `
20.3 分段编程实践 542/ I2 g# k4 y: A- S- |
20.3.1 系统表寄存器的结构 5426 M1 u: \9 Y/ L0 R' W0 z2 J
20.3.2 在汇编语言中获取全局描述表的位置 543
! Z" T% v) e' B0 _2 Z* [20.3.3 调试范例:sgdt指令的错误使用 545$ L3 ~6 v$ o5 \$ G/ o
20.3.4 在64位下获得全局描述符表 547
8 {, f# U' X0 @$ F20.4 线性地址基础 549
2 `$ m% Y7 V. t/ J# \1 u: ?20.4.1 分页控制机制 550
5 R8 p' A% r) }0 t20.4.2 线性地址的转换 551- s( x* K4 l5 w9 A5 J
20.4.3 混合页面大小 552
% z% R6 y( e' l20.4.4 32位物理地址的页目录和页表项 552- _$ s& t4 ~% ^6 |+ w' K
20.5 各种特殊分页方式 5555 k7 a0 [$ \$ e
20.5.1 PAE分页方式 5557 G3 {& r* {# k/ l
20.5.2 PSE-36分页机制 558
5 M: n' L1 O* O2 T4 {: M8 n20.5.3 IA-32e模式下的线性地址 5595 E$ I. z& w+ X) ]
20.6 分页编程实践 562" }* Z, o: Z2 O7 C! { Q
20.6.1 页目录和页目录指针表的获取 5625 h, Z7 ?' H7 R$ t! n2 F$ `/ e: `
20.6.2 页表的获取 564$ Q, v& v1 A" i8 J8 n- Q* H
20.6.3 线性地址的结构 567
% F& i# R9 J! K0 ^
8 K; q( [% R4 `4 u0 S% H第21章 处理器权限级别切换 571
7 K) X: ?8 e3 i$ r; h6 d1 c$ I+ Q+ m( m! H& F* t
21.1 Ring0和Ring3权限级别 571
$ i* Q! m( }2 g21.2 保护模式下的分页内存保护 572% x' ?$ s7 ]- H# D" @' F% S9 E
21.3 分页内存不可执行保护 5744 Z3 r, U& e8 `6 E
21.3.1 不可执行保护原理 574( A* G d6 `' }$ |* o k
21.3.2 不可执行保护的漏洞 575) S6 U/ @, @" O: e
21.3.3 上机实践 5778 n$ E1 P9 H4 d6 f7 ^6 J
21.4 权限级别的切换 579
7 [/ \/ A, _7 m7 y7 r21.4.1 调用门及其漏洞 579% @- M6 A& X& U3 S
21.4.2 sysenter和sysexit指令 581
. E/ K" F5 D# t3 T: y+ k21.4.3 上机实践 583
# m* d5 j) Y. ~" j
x2 a( h7 Q- r" v* _6 B第22章 IA-32体系结构中的中断 585
' O/ E# x0 L6 }1 M& @& Q# |+ z
& W& L# x7 S! `$ \8 R22.1 中断基础知识 585 O% e# }) j9 q6 n& o$ }* l
22.1.1 中断描述符表 585
8 s c& v, t8 ~" b22.1.2 中断处理过程 5870 p; f) R! Q, U' o
22.1.3 64位模式下的中断处理机制 589
# m) I$ g" e$ M R5 K; a5 s9 V2 g22.1.4 多核下的中断 589
) ~% @( v$ H( O# m7 u3 ]. o i* B22.2 Windows中断机制 593
3 t/ O: {' n: N) h$ ?. y& O22.3 中断编程实践 596; T4 p( }' b- G; T) s
22.3.1 IDT Hook 5964 c/ Q8 G- L8 d+ s6 Y5 E
22.3.2 巧用IDT Hook实现安全防护 598 b! _( V1 c! [# t; I6 w; P$ P. j! c0 n
$ \( S6 Y$ g0 y$ J, {
第23章 Windows内核挂钩 601' \4 o! g2 Y% C6 Y4 Z! _) A
3 `$ S) B9 F) B5 ?4 a0 q23.1 系统服务描述符表挂钩 602
) L$ s- M; E0 z8 J23.1.1 系统服务描述符表(SSDT) 602
! t" G4 _) y; M. |2 W23.1.2 系统服务描述符表挂钩的意图 603' V& k6 h: I# ^0 `. w) k
23.1.3 寻找要挂钩的函数的地址 604* U4 n3 k. P- W! o5 v' X+ E
23.1.4 函数被挂钩的过程 605
2 K a3 o) I% {& D) V: Y0 {$ g4 G23.1.5 具体实现的代码 606) J% } U, S: @: s! V
23.2 函数导出表挂钩 608& p* z, S, R3 z' n5 ~) m, [! h' ^* A' O: k+ i
23.2.1 内核函数的种类 608
! R, D! o/ s$ }, @9 g* {3 s& u( Z! o23.2.2 挂钩IoCallDriver 610
8 W4 x3 ]& l R& W23.2.3 对跳转地址进行修改 611
; T# z* O/ R& u- G' ^& j3 s23.3 Windows 7系统下IofCallDriver的跟踪 612( ?( y* o, p2 x2 N" E: d, |" @7 \- N
23.4 Windows 7系统下内联挂钩 615
, `8 x3 p* C0 A2 U3 r23.4.1 写入跳转指令并拷贝代码 615; o7 r2 d* n& \, T
23.4.2 实现中继函数 617$ t; u) W4 |( j* q
: y: J5 c G& u- o4 G
- w6 L5 |4 H- f& s/ n高 级 篇
. a4 i, j+ z9 D
7 ]# }. |+ |5 ]9 s8 X6 c5 t0 c第24章 Windows通知与回调 620
- t4 T( z4 M) u, ?
9 i+ G S/ F4 l8 s& {6 R24.1 Windows的事件通知与回调 620
0 U K( N5 V9 w! S2 |24.2 常用的事件通知 6201 W+ Y5 n( G; ?* x/ |" R
24.2.1 创建进程通知 6210 Z! \+ V, Q- b" Z
24.2.2 创建线程通知 625. W# b* v. _' I
24.2.3 加载模块通知 626
# _* F+ K# A& H8 @* f24.2.4 注册表操作通知 629
/ j+ b' H$ f5 T, P4 i( U6 j9 v24.3 Windows回调机制 636
$ d/ @3 K% ?: Y p# D7 b24.3.1 回调对象 636. B3 E5 C/ j; Q: X4 r
24.3.2 回调对象的创建 637! z% h9 G* h/ Q6 r1 F# Y
24.3.3 回调对象的注册 637) Z5 h- g- G2 x
24.3.4 回调的通告 638% Y4 f7 g+ |0 {0 r# A
24.4 安全的死角,回调的应用 639
* ]# ~% P m' C4 O; o6 M
1 Q* j! O( u& M' q, j5 u/ D# g第25章 保护进程 640( @+ D' L, A4 D6 b. V- I
4 R+ `+ a( M: H25.1 内核对象简介 640) `* {( K$ s2 b3 l- r2 {
25.2 内核对象的结构 6411 G, M. f! e. J9 A$ \
25.3 保护内核对象 642
, E* L1 s* s$ A' \' s0 R& i+ E25.3.1 处理对象的打开 643
" l7 c h% f O- a: _$ z! j3 G25.3.2 处理句柄的复制 644
; j8 E7 O1 c9 L2 F) [$ P25.3.3 处理句柄的继承 646
0 p3 y( _! R: ~1 H8 N* S25.4 进程的保护 6523 y) O, o s( E2 l
25.4.1 保护原理 652
1 ?. c% I5 H) ~) n: D8 f25.4.2 Vista以后的进程对象保护 654
9 H3 p: w& i' }( I25.4.3 进程的其他保护 655
/ K& X. _. X9 {1 ^- ^( b4 y" n% w7 T
附录A 如何使用本书的源码光盘 656
5 L5 e% ]# v0 o- n- P1 Z% i* o; w0 a) j4 a }# G7 f
附录B 练习题 6599 ?' M, w) x. R A' p
# w; w) B5 D0 A4 h- V" E4 g6 I- i, |) n: K0 k
|
|