|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
% x7 h0 \$ i6 J: t" x
! a( I% I! c: |7 Z; W# p0 U
书名:《windows内核安全与驱动开发》- H4 a$ \ s: S. M
作者:谭文;陈铭霖8 v O. N4 P# [( m
出版社:电子工业出版社
5 w: j. [, I, X! N- U+ H4 H/ A出版年:2015年6月1日(第1版)
+ w1 L( g& k1 c定价:139.00元
8 k2 s' `3 Y3 z) W装帧:平装
7 r, p& V' L& @ISBN:9787121262159
. y8 T5 e+ E( r0 I
: Y2 g+ I( n7 O+ e0 [( K( @" v- Y' u购买链接:
6 W+ F- O* k. b* F4 F5 ]% x- v$ t4 V+ z* v
7 ~2 R. l0 v" y# ~
亚马逊 -> 传送门
% ^6 u' \7 q) C: H# N$ x2 j
5 d2 C% B5 Z4 Z6 M6 ?4 s, _当当网 -> 传送门6 t( N* N( m. h V" Q l% J
! C# b/ D% I7 l, U" G; f$ B: r京东 -> 传送门! m2 O/ P* W* b- Z6 H2 B
) u- y7 E/ X3 a. Y天猫 -> 传送门- a, F. z) a7 V1 m" C
2 G$ x. y8 f: g1 M# U: Q5 V' [. X, p8 P( y: J
内容简介:
1 ^* B7 R, S, u" k1 v: ]* \: }5 d
$ Q. V& O2 E$ @0 _: M0 I9 X
4 c9 Q2 j2 o$ d+ y本书的前身是《天书夜读——从汇编语言到Windows内核编程》和《寒江独钓——Windows内核安全编程》。与 Windows 客户端安全软件开发相关的驱动程序开发是本书的主题。书中的程序使用环境从 32 位到 64 位,从 Windows XP 到 Windows 8 都有涉及,大部分程序不经过修改即可在 Windows 10 上运行。同时本书也深入浅出地介绍了进行内核安全编程所需要的操作系统、汇编等基础知识。
1 y- N4 E* d1 D A/ Z9 ~ Q% ?( S7 R) r- \1 y
本书共分三篇,基础篇囊括了驱动开发的基础知识,降低了入门的难度;开发篇介绍了在实际工作中可能遇到的各种开发需求的技术实现,包括:串口的过滤、键盘的过滤、磁盘的虚拟、磁盘的过滤、文件系统的过滤与监控、文件系统透明加密、文件系统微过滤驱动、网络传输层过滤、Windows 过滤平台、NDIS 协议驱动、NDIS 小端口驱动、NDIS 中间层驱动、IA-32 汇编基础、IA-32 体系中的内存地址、处理器权限级别切换、IA-32 体系结构中的中断和 Windows 内核挂钩;高级篇包含了汇编语言、操作系统原理、处理器体系架构相关的内容。本书是由长期从事这个行业的工程师自己写的,所以处处以实用为准。对细节的考究主要体现在对实际问题的解决,而不是知识的详尽程度上。
3 G* X& B5 p5 W. j9 k+ U4 Y5 O' U
! { z# q) O. e3 e/ i2 i目录:
) f& j$ B# C+ h; _" N& `$ s
$ t8 P$ y4 X0 n
- ^7 F; b C" i" T& ~3 H" P基 础 篇
) V9 N% P' {, [6 K3 |
$ N: ]# L1 K- d& R第1章 内核上机指导2 , [6 W+ t7 k/ e1 f ?2 E. g; x) n1 l
( o. C/ i/ m/ g( g4 o
1.1 下载和使用WDK2 5 |' d* S% ~' N, S+ f6 o0 e
1.1.1 下载并安装WDK2 0 Z3 |; s: b; }
1.1.2 编写第一个C文件4 4 m) I0 D( N: c) R5 C i" a/ D
1.1.3 编译一个工程5
! y. n* {! O' d& n3 d D1.2 安装与运行6
7 u: ^1 z# A! L" U1.2.1 下载一个安装工具6 3 U. I4 k. Y5 O# A, m7 l
1.2.2 运行与查看输出信息7 ! v! I$ F7 n. i* K- i7 {2 S3 u
1.2.3 在虚拟机中运行8 0 Y" P1 K# A& N- a" g% r8 T3 F
1.3 调试内核模块9 9 T9 P" v9 k! i/ C% s! j
1.3.1 下载和安装WinDbg9
) l0 B7 @6 z6 Y; `7 G; O1.3.2 设置Windows XP调试执行9
( x0 y0 n& y' D1.3.3 设置Vista调试执行10
6 x9 B9 e2 T4 P |( \* E. E: [1.3.4 设置VMware的管道虚拟串口11 ( d' C0 X+ i* U, `3 T4 ]
1.3.5 设置Windows内核符号表12 % A2 i: s1 q% {. V6 W
1.3.6 实战调试first13 ! X# g; @ c7 R+ x4 s/ j
- _# q) T: u2 E0 l! ~第2章 内核编程环境及其特殊性16 7 ]# M3 V" O. p7 N
+ n! Y2 N2 Q: x' \% q$ x2.1 内核编程的环境16 V5 L' g1 c1 s" G/ W1 R
2.1.1 隔离的应用程序16
$ a1 d1 w. L; ?$ H! e0 w2.1.2 共享的内核空间17
$ R/ z& @4 z- d. G( W0 t2.1.3 无处不在的内核模块18 " J2 }0 C$ L; r$ ~- Q( l
2.2 数据类型19 . E, e3 ^/ _3 e
2.2.1 基本数据类型19 + } h* ?% K3 ?9 [% Y* \
2.2.2 返回状态19 3 x6 U# x7 c8 e @; d& k% V) I; N
2.2.3 字符串20
, O+ u. U8 ]" |, U$ h2.3 重要的数据结构21 : S: ~$ [% F- i0 m& P5 B) c
2.3.1 驱动对象21
0 J8 @' q b2 f* b2.3.2 设备对象22 : u: ?: `6 r$ V. O! F* M; } v7 v
2.3.3 请求24 3 G# Q$ e: G$ [: t- b# ~
2.4 函数调用25
; \# b; d8 [0 _& X& T( c2.4.1 查阅帮助25
/ V9 i1 J% D5 Y9 X) S2.4.2 帮助中有的几类函数26
' Q5 ?' M K9 C7 F2.4.3 帮助中没有的函数28 2 V$ Z( T$ @. E5 Q
2.5 Windows的驱动开发模型29
; x. N% H* x% a2.6 WDK编程中的特殊点30 4 \( x. l7 d* f; H' F4 j7 t
2.6.1 内核编程的主要调用源30 ! H w; k& `: b$ R
2.6.2 函数的多线程安全性30
0 X* L- w% j, l3 }8 R/ Y3 f2.6.3 代码的中断级32 l6 t& ~4 d6 v* T x
2.6.4 WDK中出现的特殊代码32 # j2 m, d- h, O0 M) A
4 D* y8 D) [: u7 N5 w" P" [4 p第3章 字符串与链表35 8 `8 z8 W. p8 w( `. @! H
* I. ]1 s' P5 y$ l3 \. P3 W3.1 字符串操作35
* h: A: ], O2 p1 }: l) N, S# I3.1.1 使用字符串结构35 ! V% a. ]5 t4 M) j8 O
3.1.2 字符串的初始化36 ) ~8 l! F- V3 Y
3.1.3 字符串的拷贝37 1 [* U8 @2 |# ]4 d
3.1.4 字符串的连接38 $ W- ] G) _* D" O ~1 j' {
3.1.5 字符串的打印38
% \# Z% l( i) ^* K$ O' z3.2 内存与链表40 $ n6 e1 b* n( |' E/ l3 O$ o! |1 D; A
3.2.1 内存的分配与释放40
& T3 @$ q4 ^, g& w- N- X, \3.2.2 使用LIST_ENTRY41
0 |( S" T8 l" W2 Y/ u* W; {$ I8 R3.2.3 使用长长整型数据43 4 Y. o- f3 G. N1 o
3.3 自旋锁44
# u! {/ j: D/ i z3.3.1 使用自旋锁44
( @ c6 e( I7 [& q- v: D- O2 x3.3.2 在双向链表中使用自旋锁45 + \8 d5 n6 c6 Z3 T* X
3.3.3 使用队列自旋锁提高性能46 - L" }; O. j: C5 F
3 `/ x- d1 X. |) f6 Q
第4章 文件、注册表、线程47 * b Z% [) R/ [: i- B$ b
# X. P: E( O; ?6 }
4.1 文件操作47
1 o- r/ v$ ]) A& |7 E4.1.1 使用OBJECT_ATTRIBUTES47 7 t& q) p m6 @; C+ x# F6 o% p& m6 @
4.1.2 打开和关闭文件48 # w2 S. C/ \/ i& |% x
4.1.3 文件读/写操作51 5 ^+ B2 ~1 r, @2 x; \6 p
4.2 注册表操作53
! A; ~( v; D; ?+ s9 w! ]. f5 C: K* [4.2.1 注册表键的打开53 8 r/ F; p/ { M: J8 q4 |0 q; u: A" s
4.2.2 注册表键值的读55
: j2 L6 h9 |' X4.2.3 注册表键值的写57
3 j7 f% A. @4 l g4.3 时间与定时器58 $ u- }3 Z7 g6 H6 F5 K
4.3.1 获得当前“滴答”数58
% A) H4 p/ _. c, `* ~' \0 n. X4.3.2 获得当前系统时间58 8 w7 b" h9 g* n* |1 j' r! |
4.3.3 使用定时器59 : r0 M% {1 p1 c$ r7 j& E
4.4 线程与事件62
1 G5 f; t+ Y1 l+ ~. n7 V4.4.1 使用系统线程62 . f( Z$ d" G: ~$ d+ W8 Z
4.4.2 在线程中睡眠63 + Y3 l; G2 }: c( U
4.4.3 使用同步事件64
G5 J* B7 p# y3 Q) n1 Z6 r+ ]
- x, o3 i8 w$ Y: E9 R8 z第5章 应用与内核通信67 , k' Q. O+ P+ F: x2 B4 C, [$ M8 R
8 f; E/ Y | V8 @ Q" v2 e! q
5.1 内核方面的编程68 7 B5 o: {. T: f7 ^
5.1.1 生成控制设备68 + i" c4 ?8 X! ]4 e6 U
5.1.2 控制设备的名字和符号链接70
& H8 D1 T$ Y. r8 y: _' c# K! [' ]5.1.3 控制设备的删除71
# j" v; N. o! s. w5.1.4 分发函数72 2 J' G& U3 g8 q" u# x8 n
5.1.5 请求的处理73 - s4 t& L R) l, F
5.2 应用方面的编程74
& y) N' d6 `! v& W; g5.2.1 基本的功能需求74
7 Y7 |( x( z+ v/ v5 r; p5.2.2 在应用程序中打开与关闭设备75 3 R) F6 b, c. U9 C' }* Q& o$ s/ U
5.2.3 设备控制请求75 . }+ H: w4 h' P. V' J j# M! x
5.2.4 内核中的对应处理77
2 h) _7 R2 Q! r$ z% S5.2.5 结合测试的效果79
" l9 w4 Z! O% P/ J9 S5.3 阻塞、等待与安全设计80 3 W" x: Y1 {3 S3 o- D
5.3.1 驱动主动通知应用80 ' @/ k* B: n, r8 }8 E1 H. w7 p5 W% r
5.3.2 通信接口的测试81
U6 U2 b- y. W% D- u/ E& a7 }5.3.3 内核中的缓冲区链表结构83 5 s. d: l) e" X/ t2 X/ _% Z- C* I
5.3.4 输入:内核中的请求处理中的安全检查84 8 d) W$ A6 k3 N3 s4 Z7 A
5.3.5 输出处理与卸载清理85
% y' k. @- I0 Y2 n8 O$ m v1 _% \2 p! t
第6章 64位和32位内核开发差异88" }, Z/ X! v( b5 k, m
# K: k* E1 b# q6 Y( X
6.1 64位系统新增机制88 ( q& S6 @# y( c$ m1 J
6.1.1 WOW64子系统88 " q2 G4 i9 r# o7 v; V
6.1.2 PatchGuard技术91 * z7 l/ e1 j/ B- }4 b2 t. p! x8 r
6.1.3 64位驱动的编译、安装与运行91
$ G [( ?' I x6 L6.2 编程差异92 7 Q( W; H( |6 i7 ^7 z! u% E4 Y
6.2.1 汇编嵌入变化92
% B. m% X8 f6 t5 L8 R4 M6.2.2 预处理与条件编译93 : k3 E9 W- C" L! \7 l3 _# @
6.2.3 数据结构调整93 8 C. g! W% P# \& p8 _& b9 k
/ {1 c! P1 [9 `) d
+ e+ J% I+ s4 y. w+ u k0 v- h开 发 篇
% Q' q3 J& Z7 G! I8 g: z
9 f6 a: b! q1 C; U m第7章 串口的过滤96
+ r* |6 u1 A6 P) I/ O& w$ B
4 c2 C$ \3 ?9 O3 X4 w5 y7.1 过滤的概念96 , u1 |+ C6 m- ?
7.1.1 设备绑定的内核API之一97
7 ?# _3 H z: w1 m" l2 J- D7.1.2 设备绑定的内核API之二98 - f% F& @) B+ u( p4 l4 z$ K
7.1.3 生成过滤设备并绑定98 ' E: d# i1 o' ^* J
7.1.4 从名字获得设备对象100
9 b; F& X+ L: e( k- ]+ R( H7.1.5 绑定所有串口101
) {# ]9 b3 q7 f$ H( E7.2 获得实际数据102 g8 J8 ]' H! {! e
7.2.1 请求的区分102
% S% e8 h, r5 }& T" {7.2.2 请求的结局103 ; @* o7 U: _) ^' ]0 z# w8 b# ~0 w
7.2.3 写请求的数据104 3 A9 O3 o' W/ |& W4 j6 O
7.3 完整的代码105 : w" `, D; J& G. A$ v% g
7.3.1 完整的分发函数105 * U* Z' g' k$ A' K. p/ u, e. \
7.3.2 如何动态卸载106 0 N! h* q( g5 Z0 w9 u2 Z- m
7.3.3 代码的编译与运行107 ! o8 T! g- U; x% }; h/ K+ O9 x
* ~5 l/ t; ~" |. i1 R' m( e3 G+ N
第8章 键盘的过滤109
3 Y/ q: } F/ G; P+ C3 A' ?- M
- y. \% M# r5 i# K: f5 x( w3 o8.1 技术原理110
3 M/ b, b, {6 Q8.1.1 预备知识110
# e% S1 G" e0 c' E$ k8.1.2 Windows中从击键到内核110 1 U. R; {- v% R* \. d" s
8.1.3 键盘硬件原理112
3 Q/ `7 X( c6 O# Z0 s6 e5 q8.2 键盘过滤的框架112
, K9 G) y) S& V; }5 l8.2.1 找到所有的键盘设备112
. l m+ M$ k: t$ M8.2.2 应用设备扩展115 4 Y" k! [! @5 ]( u+ f
8.2.3 键盘过滤模块的DriverEntry117 6 k. N4 X$ {4 x
8.2.4 键盘过滤模块的动态卸载117 : r& j! B* t7 Y3 v0 }
8.3 键盘过滤的请求处理119
. e! U/ A0 A. t+ T7 t. K8.3.1 通常的处理119
$ O$ B k* j8 ?0 |8.3.2 PNP的处理120 2 t; ]. ~" h; O3 h+ D, Z
8.3.3 读的处理121
5 A$ f% O, G& J* k" U8.3.4 读完成的处理122
, d6 I4 q* g$ {% i6 |8.4 从请求中打印出按键信息123 - M, m' k7 q# L/ B+ w9 `7 W
8.4.1 从缓冲区中获得KEYBOARD_INPUT_DATA123
1 F9 E4 N. T5 T7 P8.4.2 从KEYBOARD_INPUT_DATA中得到键124
) O6 W' _# w6 r6 H3 n8.4.3 从MakeCode到实际字符124
" v ^; u+ S- \* |: E W8.5 Hook分发函数126 9 }" N6 p; Y' V& [0 @5 S
8.5.1 获得类驱动对象126
4 h; o9 L2 k& W9 M/ H8.5.2 修改类驱动的分发函数指针127 4 e3 j4 I) Y. S- s4 {
8.5.3 类驱动之下的端口驱动128
. F% ]; D" B- [5 a3 r1 y: T8 r1 N8.5.4 端口驱动和类驱动之间的协作机制129 % ^) J7 D: f5 q# ?( n
8.5.5 找到关键的回调函数的条件129
# F! C3 y, |% S/ s3 \8.5.6 定义常数和数据结构130 ( K% G; n" u' j$ q* P C
8.5.7 打开两种键盘端口驱动寻找设备131
" l1 p/ L/ n8 b5 ^* |' _' v" f& z8.5.8 搜索在KbdClass类驱动中的地址133 $ A' ?, ^# X* q
8.6 Hook键盘中断反过滤135
+ ~. Q% a7 Y& o% D6 x8.6.1 中断:IRQ和INT136
) g; y; x3 B6 u: t3 J& o8.6.2 如何修改IDT136
2 F$ q2 D7 U- J: A# ^8.6.3 替换IDT中的跳转地址137
0 ?9 y: |$ Y+ \7 P8.6.4 QQ的PS/2反过滤措施139 2 `2 _, z; _; r5 [6 }. f; }
8.7 直接用端口操作键盘139
6 r7 J, \' y6 |/ C a6 L- m8.7.1 读取键盘数据和命令端口139
$ X! c' @ s& Y7 s5 f1 p% y8.7.2 p2cUserFilter的最终实现140 ' i. D* I' N1 @3 I2 c5 E
$ U, X; x. s* y, ?
第9章 磁盘的虚拟143 . @( @; K" R: b) V$ l g
' [2 |: U) u' v: B# T! T$ t9.1 虚拟的磁盘143 ! u& @( w# N2 d$ V$ ^
9.2 一个具体的例子143
+ p8 |& n; f" i- A' \8 A# x* ^9.3 入口函数144
, i S2 g8 w: J; a* n7 s8 n( J9.3.1 入口函数的定义144 . ?! `$ Q4 F( Y7 t0 M. w2 Q
9.3.2 Ramdisk驱动的入口函数145
2 @- r# p& d9 G8 g7 U4 I; L" K9.4 EvtDriverDeviceAdd函数146 # F8 k4 f) w* o+ w# e
9.4.1 EvtDriverDeviceAdd的定义146 ; y: n+ N( n# @6 B
9.4.2 局部变量的声明146
5 \- u$ [, i4 c4 N9.4.3 磁盘设备的创建147 ) f2 h3 o0 Y1 Z6 H3 G- Q7 {; H
9.4.4 如何处理发往设备的请求148 ; d+ t. s$ H% V
9.4.5 用户配置的初始化149
' C# x1 m1 m" a8 J% G9.4.6 链接给应用程序151
, r, g5 @8 E$ F) r1 |# E! s9.4.7 小结152 " X" f/ `7 G: ~3 W* I4 `
9.5 FAT12/16磁盘卷初始化152 . c% l8 }9 d/ L6 S% h
9.5.1 磁盘卷结构简介152 . m- c) x, G5 Z8 [$ J- g
9.5.2 Ramdisk对磁盘的初始化154 $ A' T+ H: m( S/ G& T( j! j3 h- h
9.6 驱动中的请求处理160
4 B; G x5 }9 f, x3 b C9.6.1 请求的处理160
9 w# g( p+ \, H @6 x7 T4 d1 F2 H1 }9.6.2 读/写请求160
* e1 D9 G7 ]( Z( B, ^' r9.6.3 DeviceIoControl请求162 * G) M. h B- }; S: o6 u3 R
9.7 Ramdisk的编译和安装164
& w+ w! b5 }7 [- x( r. ]1 }( s$ t9.7.1 编译164
. Y e, `9 @4 k5 I# T/ q4 X$ E0 `+ m9.7.2 安装164 & j: e( H6 K1 C% Y
9.7.3 对安装的深入探究165
$ p/ Z( R- z: G% L- w
2 N0 m. {! v- i1 ]4 d2 d: [; J第10章 磁盘的过滤167
) \2 a- V8 \0 I
5 }: S. b( ~! K10.1 磁盘过滤驱动的概念167 1 T' f0 @, ~$ X' X1 x
10.1.1 设备过滤和类过滤167
$ p1 v/ ]0 i3 A( `3 a) ~, E5 |: ~! l: M10.1.2 磁盘设备和磁盘卷设备过滤驱动167 ( d% C% G! v2 X& h: _; [* Y4 J1 T
10.1.3 注册表和磁盘卷设备过滤驱动168
+ Q* y9 J5 k2 e& ]10.2 具有还原功能的磁盘卷过滤驱动168 3 p% ^: s4 V5 ?2 [, g
10.2.1 简介168 4 N( A7 P6 Z# y: |$ k" g$ I
10.2.2 基本思想169 d2 w a5 W F2 G( k
10.3 驱动分析169 ! k9 K3 n& H% H% V- U5 R
10.3.1 DriverEntry函数169
& n* C0 [! U, H+ s' N10.3.2 AddDevice函数170 2 c( G+ }" j1 N! y& F8 ]) t* c" n
10.3.3 PnP请求的处理174 7 f8 {2 r1 E: z g
10.3.4 Power请求的处理178
5 H7 q. P @! G! w$ p10.3.5 DeviceIoControl请求的处理178
2 g9 f, E9 M6 O0 q& J v- Q10.3.6 bitmap的作用和分析182 ( e9 P0 | N1 T3 J8 t( o
10.3.7 boot驱动完成回调函数和稀疏文件187
+ J* ]3 W! L* ~" w$ D10.3.8 读/写请求的处理190
8 H" M6 K q; ?/ J' ^$ C9 \: Y1 d \
! N8 x# K. F. U2 u" L) o2 d5 X) v第11章 文件系统的过滤与监控199 9 v: k; C1 A( S& J' @5 S
. W5 E0 j9 j' C! @3 B) F/ F11.1 文件系统的设备对象200
! e: K1 g: P/ X6 L, x) ?3 `7 `11.1.1 控制设备与卷设备200 0 f0 a* K8 M6 ?4 s5 q W2 z; C
11.1.2 生成自己的一个控制设备201 : F, z, ~8 O$ T" A+ M u
11.2 文件系统的分发函数202 1 n) l- O4 d6 l$ ^. m
11.2.1 普通的分发函数202 0 X8 N7 M# i: h/ G
11.2.2 文件过滤的快速IO分发函数203 4 E. w+ @0 u1 l/ y, D* y
11.2.3 快速IO分发函数的一个实现205
6 x& e o1 `. K3 A8 ?, I5 `2 i11.2.4 快速IO分发函数逐个简介206 1 H5 |/ o1 [: Q7 Q8 p' V/ l
11.3 设备的绑定前期工作207
1 \, q/ Y, p% g11.3.1 动态地选择绑定函数207 6 c+ z" b$ r! X4 h1 U w. |
11.3.2 注册文件系统变动回调208
7 ~* b# h2 q i9 r6 Q1 `" e! \11.3.3 文件系统变动回调的一个实现209
! z0 N) E( n- K. \, i' y0 q2 R# ^11.3.4 文件系统识别器211
( ]! l4 p4 x3 j: `11.4 文件系统控制设备的绑定212 + j& m0 s* ]1 P5 g$ O
11.4.1 生成文件系统控制设备的过滤设备212 ( `3 y$ H; _2 o$ w2 |' D9 _& @
11.4.2 绑定文件系统控制设备213 / b% y, e6 P) f. j3 a1 O
11.4.3 利用文件系统控制请求215 " V0 ^1 W1 I7 H# k ?* b
11.5 文件系统卷设备的绑定217
9 P5 C5 n- x. r( O) q _# O; l11.5.1 从IRP中获得VPB指针217
9 b' Q3 L: C( c' `0 g: A0 S11.5.2 设置完成函数并等待IRP完成218
# H! Y$ u8 P8 W( ^! x- b: t6 r11.5.3 卷挂载IRP完成后的工作221
& p( I. R! A. M b4 }% ~, O11.5.4 完成函数的相应实现223 - N% r$ c; b/ x, o* m
11.5.5 绑定卷的实现224 2 m) V3 ~; J5 e! K
11.6 读/写操作的过滤226 / m. q; I( N3 {6 u) v- B
11.6.1 设置一个读处理函数226 $ l" y. }, F/ o
11.6.2 设备对象的区分处理227
/ T2 Z6 R7 U, ^1 `1 y( F+ @0 ^11.6.3 解析读请求中的文件信息228
/ s2 K. Y! Y& G8 H( z11.6.4 读请求的完成230 " c: V$ w* x; m# J+ A
11.7 其他操作的过滤234 % }# N$ V9 P6 P, s) m
11.7.1 文件对象的生存周期234 5 {( E% Q! @) U+ a7 ?9 M
11.7.2 文件的打开与关闭235 ( I8 @/ O* |& c4 M; o6 d0 v
11.7.3 文件的删除237 ; K4 i" W* X4 X' ]
11.8 路径过滤的实现238 % l% u" ^% x6 S! x1 A
11.8.1 取得文件路径的三种情况238
* b. e2 k6 C& _# {6 K% u4 i11.8.2 打开成功后获取路径238
3 B- J5 g: [* E4 s7 H11.8.3 在其他时刻获得文件路径240 / z0 Z2 V6 G% e8 J+ @2 P9 q
11.8.4 在打开请求完成之前获得路径名240 ) }' y) F! t4 i5 W \, `9 K1 {0 v
11.8.5 把短名转换为长名242
; X; _3 i+ W& g11.9 把sfilter编译成静态库243
5 v- g) E* [" `, V. q+ R11.9.1 如何方便地使用sfilter243 % R& j/ s8 o% B+ [* L2 |/ _ Q
11.9.2 初始化回调、卸载回调和绑定回调244
+ U0 h0 ^1 Q+ \2 _11.9.3 绑定与回调245
6 D0 ]1 H, \: f11.9.4 插入请求回调246 9 `# n& e" r# w8 J' @. a9 E! ]
11.9.5 如何利用sfilter.lib249 , m. i* O X5 U% I& D
# }3 d/ `% J* ]9 U4 }) }! c) x
第12章 文件系统透明加密252
! x, l P8 U9 ~) x9 r8 H( N: e4 Z
12.1 文件透明加密的应用252 3 `" p) Q3 W9 X5 H, z
12.1.1 防止企业信息泄密252 0 U' h# s+ l& c; j1 h( S. e
12.1.2 文件透明加密防止企业信息泄密253 * R% N0 [& ^ r# l* q ~1 {" X
12.1.3 文件透明加密软件的例子253
0 _$ D3 `$ A# d0 K) L9 E12.2 区分进程254 " F u t3 a9 I5 v3 B, v# }( _
12.2.1 机密进程与普通进程254
! w0 S, a! [0 {12.2.2 找到进程名字的位置255 % m1 L) p# t7 L! M* h8 b4 N' ], x& ^
12.2.3 得到当前进程的名字256 % Y1 N$ {$ }5 h" F* ?+ t
12.3 内存映射与文件缓冲257
+ }$ h# b7 p% x5 Z1 D' n12.3.1 记事本的内存映射文件257
, g, L; n& A/ V% O2 V$ C12.3.2 Windows的文件缓冲258 9 n( c, ? }3 C
12.3.3 文件缓冲:明文还是密文的选择259 7 v/ ]8 g9 t" e$ b. [7 P
12.3.4 清除文件缓冲260 * z ~! x/ ^( ]) ^
12.4 加密标识263
~$ f( n6 c# ]+ A$ J12.4.1 保存在文件外、文件头还是文件尾 263
6 o3 Y G( ], E: K12.4.2 隐藏文件头的大小 264# ~) x% @; ?" o9 S& _
12.4.3 隐藏文件头的设置偏移 266. T. T- x! u9 e2 R) _$ I
12.4.4 隐藏文件头的读/写偏移 267: G U" _3 \9 ~) _* r' {) W
12.5 文件加密表 267
- p) @2 L( C( n- J$ Z/ L: S1 y$ w* J12.5.1 何时进行加密操作 2677 [" |9 _6 k/ ^5 s- ?: {) }$ U& P
12.5.2 文件控制块与文件对象 268
) u) I# d5 R. \3 Q9 d8 {12.5.3 文件加密表的数据结构与初始化 269
; J1 c7 v2 T$ Y+ g12.5.4 文件加密表的操作:查询 270" Q. [& K3 Z0 @3 D0 x
12.5.5 文件加密表的操作:添加 271
0 D+ _* O: t" W* e/ {1 y& O ~/ s12.5.6 文件加密表的操作:删除 272
0 H0 B# T% O/ a6 u1 v$ f12.6 文件打开处理 2734 N" d/ J1 ? F. y6 ^
12.6.1 直接发送IRP进行查询与设置操作 274
, o. p! @& H, m7 ~( J$ E12.6.2 直接发送IRP进行读/写操作 276
. j% X% U% y+ n$ R* M- s" ~/ o. l12.6.3 文件的非重入打开 277
; f! l' \- C& q& F3 r9 R& V12.6.4 文件的打开预处理 280
9 T' a6 P1 }. W) a3 ^; C7 S0 X12.7 读/写加密和解密 285
9 g& Q3 ` l# M4 |6 j0 U12.7.1 在读取时进行解密 2852 |, A; S- e% f0 F# L+ `
12.7.2 分配与释放MDL 286
O0 U# e- ~0 k12.7.3 写请求加密 287 v, ?6 _: d0 i% k0 `% t; p
12.8 crypt_file的组装 289
5 R: g- t0 o& }4 Z7 e12.8.1 crypt_file的初始化 289
; v9 A6 [. g6 e. \1 }! p+ l12.8.2 crypt_file的IRP预处理 2904 u0 d( {; v, w X% {3 Q
12.8.3 crypt_file的IRP后处理 293& n4 J# q6 Y+ H
q2 Y6 p5 V% v0 g, A) W& A' D* T
第13章 文件系统微过滤驱动 297
4 [6 I) F H! I+ p7 A2 Y! x2 z" F+ o/ |6 d0 M- [% c0 g! H) a
13.1 文件系统微过滤驱动简介 2979 l) ^$ g" O+ G. T f2 ~: M9 ^
13.1.1 文件系统微过滤驱动的由来 297- A! k( n" Z1 I5 N# p- h, z
13.1.2 Minifilter的优点与不足 2980 F; V5 [- P1 V% W8 u
13.2 Minifilter的编程框架 298
5 s5 r) f: i5 X5 d1 l k( }13.2.1 微文件系统过滤的注册 299
4 r7 n/ J4 a# J2 Z) i13.2.2 微过滤器的数据结构 300
/ d) z: m/ F( W4 g13.2.3 卸载回调函数 303
8 P8 _* y$ U: w k" v4 @5 w13.2.4 预操作回调函数 3034 i ?- f {4 ^6 P8 }/ n
13.2.5 后操作回调函数 306
3 j+ k6 M8 U# D13.2.6 其他回调函数 307
@" u( t2 O- F' x13.3 Minifilter如何与应用程序通信 3090 F. H$ [' i4 @4 s
13.3.1 建立通信端口的方法 310; ~- _5 G. b' S0 U8 v
13.3.2 在用户态通过DLL使用通信端口的范例 311
* v. [/ q% p. m13.4 Minifilter的安装与加载 314$ |1 T4 {$ S+ o/ |( `
13.4.1 安装Minifilter的INF文件 314) A6 s( E% o2 J1 J5 b' A; K* `
13.4.2 启动安装完成的Minifilter 316: P' |# s7 m, R* `( l1 M: S
5 Y) ]' Q- t# g4 {! b3 O
第14章 网络传输层过滤 317
n+ L" i$ Q, c. _/ [; |9 @1 N& a
) l u, o- K u& Q" K14.1 TDI概要 317) ^( Y8 o5 p: ?9 A# w; X: ]
14.1.1 为何选择TDI 317
2 N) c" e1 e# g9 {4 B8 G3 l14.1.2 从socket到Windows内核 318
" N. @& ^) e" Q14.1.3 TDI过滤的代码例子 319$ S7 [! A$ T# M+ Z
14.2 TDI的过滤框架 319 Y" h+ p6 U9 E. `+ Q9 E6 t
14.2.1 绑定TDI的设备 319
. |( P; e& W9 B3 s/ L* S14.2.2 唯一的分发函数 320
/ K6 u+ C2 [" ?, {+ i; k- I: m/ _5 @14.2.3 过滤框架的实现 322
/ l' g5 Z' ~9 k! G0 ?0 _* g$ ?# Y14.2.4 主要过滤的请求类型 323, g& z3 |1 F Y! G# ~
14.3 生成请求:获取地址 3247 k- u' O4 J+ u$ t
14.3.1 过滤生成请求 3246 w4 H- @; p+ h: L1 ?
14.3.2 准备解析IP地址与端口 326
' T# W) H3 ^( y* J/ x14.3.3 获取生成的IP地址和端口 327
k5 S: j" u2 D2 P$ x5 T14.3.4 连接终端的生成与相关信息的保存 329 y3 R; ~6 b- A6 h& X5 H8 t8 s
14.4 控制请求 3304 B4 Q- g( _+ _: U& Q( [
14.4.1 TDI_ASSOCIATE_ADDRESS的过滤 3303 X( u3 Q/ _& a0 p" v2 F& o1 A$ Y# x
14.4.2 TDI_CONNECT的过滤 332! f8 X8 |* \; S: s1 |' n
14.4.3 其他的次功能号 333: n+ j* S- y+ d$ C: P2 i4 e0 W
14.4.4 设置事件的过滤 334* N4 p9 N k& R" T2 x) C$ m
14.4.5 TDI_EVENT_CONNECT类型的设置事件的过滤 336' s, D* {" W4 q4 X4 A
14.4.6 直接获取发送函数的过滤 337
3 R4 W) v# z7 F9 l4 D8 a7 X14.4.7 清理请求的过滤 339+ R) z. _* g N+ Y$ C% M
14.5 本书例子tdifw.lib的应用 341/ y( z1 M/ `2 l# n
14.5.1 tdifw库的回调接口 341
0 D- ^2 _, d7 n) ~# x14.5.2 tdifw库的使用例子 342
4 W& Y6 b' Z9 X# n% K7 O' F& R# U% w( N' y% B! b% X
第15章 Windows过滤平台 345# v! h% k" m R3 M
% V# U/ o; E: l1 M1 t15.1 WFP简介 345+ V1 q; b3 N* E W
15.2 WFP框架 345: T3 B6 g' L+ ?( Q. n/ Z, p
15.3 基本对象模型 347
7 z5 L" }8 I/ T9 S# n: h15.3.1 过滤引擎 347# V' O% ]# I! s7 l
15.3.2 垫片 3471 ~4 E- A1 `- S$ b& U' z6 X
15.3.3 呼出接口 347) m/ I* _2 [' r# z
15.3.4 分层 348+ j9 q4 @: S2 Y6 L3 {/ X
15.3.5 子层 349
Y! N) S4 i7 }# a# {: S15.3.6 过滤器 3508 u/ b/ W* T4 K7 N0 i% v# m
15.3.7 呼出接口回调函数 354
0 L8 {3 y, O7 p: W" m& J2 P6 U! ^15.4 WFP操作 3590 H, G% Z( h7 ^& A4 `- {
15.4.1 呼出接口的注册与卸载 3606 x7 n9 r5 A# E2 K6 j( Z- w
15.4.2 呼出接口的添加与移除 3605 `' y7 O& N8 n5 @
15.4.3 子层的添加与移除 3613 P0 c6 o j# h1 ^
15.4.4 过滤器的添加 362
3 \. T y( P% I' ~1 m# n7 ^" @( S15.5 WFP过滤例子 362
; J8 y, R4 V p$ U; Y; u9 x X5 ^- d" K4 z/ N. }2 v0 ~
第16章 NDIS协议驱动 3701 w* H" G4 R* @! Z) S, d
7 |: q9 J* F- d16.1 以太网包和网络驱动架构 370
: ~ Q% k" T# @0 A U) `16.1.1 以太网包和协议驱动 370
( F% Q" [6 n! F" f0 o% E16.1.2 NDIS网络驱动 371
0 @! D. Y( a: r; g/ E. a) n16.2 协议驱动的DriverEntry 372/ g: z! |# N" N4 ~% e0 Y& u \4 E( Q
16.2.1 生成控制设备 372
B2 U" c0 \3 k5 ]' R16.2.2 注册协议 3742 i* z& i4 l, c, k" i3 f2 e
16.3 协议与网卡的绑定 375
r5 I3 {, U: p$ F. @$ y) K16.3.1 协议与网卡的绑定概念 375
1 a' u5 F# P% V# S16.3.2 绑定回调处理的实现 376" k$ c& N+ C& L2 S& d. `0 U/ h& F
16.3.3 协议绑定网卡的API 378
6 O) C0 \: u# c0 b8 G9 t16.3.4 解决绑定竞争问题 379
3 x6 {% b$ L7 Q X16.3.5 分配接收和发送的包池与缓冲池 380; s- r2 N0 L. D, v! F# Z6 c
16.3.6 OID请求的发送和请求完成回调 3815 T6 i, m# u$ _
16.3.7 ndisprotCreateBinding的最终实现 385: H* K- }7 |3 s _
16.4 绑定的解除 390; h2 b# l* D. f6 ~$ V# V6 b
16.4.1 解除绑定使用的API 390
- Z H1 ? s/ N! @5 \3 X16.4.2 ndisprotShutdownBinding的实现 392) `) p3 p+ b% x/ W3 B- V0 G
16.5 在用户态操作协议驱动 395
% @$ b& M9 U3 X- O16.5.1 协议的收包与发包 3959 `% L9 |7 i [( I9 f# v! [
16.5.2 在用户态编程打开设备 396$ n6 ? `# B- j* E
16.5.3 用DeviceIoControl发送控制请求 397
& D' N: K" L, m7 F16.5.4 用WriteFile发送数据包 399( K: B2 F6 Q I( d% b
16.5.5 用ReadFile发送数据包 4002 b) ^+ \4 U D1 a* e7 t3 F
16.6 在内核态完成功能的实现 402# [# F1 c/ ~& q
16.6.1 请求的分发与实现 402; J8 U4 R/ @" ?6 {7 X; [) a. f! M: z
16.6.2 等待设备绑定完成与指定设备名 402
/ N. z; N* K/ E2 i16.6.3 指派设备的完成 403, n7 d I8 s) y8 R( t
16.6.4 处理读请求 406
~2 T% @: w* W" r$ n7 ?16.6.5 处理写请求 408
9 o) r6 H0 X, m& Y1 J16.7 协议驱动的接收回调 4123 S" L% J' G+ m( F. M
16.7.1 和接收包有关的回调函数 412
* {, r+ h1 u" U2 n- Q16.7.2 ReceiveHandler的实现 413
3 h0 R# v; ?8 T3 a' E16.7.3 TransferDataCompleteHandler的实现 417
* y7 E8 T1 \! U1 K16.7.4 ReceivePacketHandler的实现 4180 B, W0 n9 {" q$ e* \% O2 D- x
16.7.5 接收数据包的入队 420
+ q( c, l; `1 o. V1 K* r16.7.6 接收数据包的出队和读请求的完成 422
+ V2 Z o! O/ I. _/ K4 D0 L* {/ ?. }% }7 j/ o2 G6 u5 A d5 z
第17章 NDIS小端口驱动 427
9 B/ H! w% V6 i6 m0 a( w$ l
' b5 P0 R" g5 N" l17.1 小端口驱动的应用与概述 4278 c) ~/ u5 {& n4 R+ H8 c- a
17.1.1 小端口驱动的应用 427* ~; d+ x4 K) @, E q
17.1.2 小端口驱动示例 428, H* A7 A: d4 K! S, L8 n
17.1.3 小端口驱动的运作与编程概述 4290 F$ U g: Y4 w5 B' E, Z
17.2 小端口驱动的初始化 4293 r, w v: E# I
17.2.1 小端口驱动的DriverEntry 429
1 g/ u! z: f. K7 y17.2.2 小端口驱动的适配器结构 431 J3 S: h8 |4 J
17.2.3 配置信息的读取 4337 J# o8 `' [0 ~$ \( T: @/ e4 M% s
17.2.4 设置小端口适配器上下文 4330 e6 d# G( ]9 @
17.2.5 MPInitialize的实现 434
8 N- `7 f9 ]2 a17.2.6 MPHalt的实现 437
" j' K9 Q7 \. x/ N6 x9 d( h17.3 打开ndisprot设备 438$ h# g2 V% K1 q* x
17.3.1 IO目标 4389 g0 `: O7 t8 I* B% R
17.3.2 给IO目标发送DeviceIoControl请求 439/ p# N0 Q2 P2 H0 y! H. w( t
17.3.3 打开ndisprot接口并完成配置设备 441
/ l Z; U- _0 f9 H$ W; V17.4 使用ndisprot发送包 443
7 u8 K! U7 I+ [17.4.1 小端口驱动的发包接口 443. K2 k$ k/ d4 e1 r6 Q: L4 i
17.4.2 发送控制块(TCB) 444
. e' x3 M* j9 W4 F, t2 |, @+ R17.4.3 遍历包组并填写TCB 4460 J) Q g% `$ p
17.4.4 写请求的构建与发送 449
. {: N9 J! P. x$ R S) i17.5 使用ndisprot接收包 451
) t5 k9 \/ z8 w5 [8 L2 n* h6 Y v17.5.1 提交数据包的内核API 451. Y! j( ^ d% |9 a$ K& d) M+ y8 y
17.5.2 从接收控制块(RCB)提交包 452- }4 r9 Y5 {9 Q; @
17.5.3 对ndisprot读请求的完成函数 454, ~ n- ~; u W6 O
17.5.4 读请求的发送 456) D% p2 y2 |. d1 v) d
17.5.5 用于读包的WDF工作任务 457
" n7 u+ C1 R; m0 j+ p6 _$ U1 f17.5.6 ndisedge读工作任务的生成与入列 459
8 l2 E* e' X* X- S2 E1 ^5 M/ G3 j17.6 其他的特征回调函数的实现 461
9 d3 m, i( S# y9 d, F17.6.1 包的归还 461
7 I9 w5 f! k# }9 F0 m: U17.6.2 OID查询处理的直接完成 462' c- c/ S- y0 ]6 b
17.6.3 OID设置处理 465# D3 t" Z* E0 L- Y
+ |$ C7 n+ L3 I第18章 NDIS中间层驱动 467
* v3 m* I ~! C! f) y! O/ U; L6 y) R/ R) o% Z: ?
18.1 NDIS中间层驱动概述 467" D' U+ x9 j- S& H
18.1.1 Windows网络架构总结 4675 F$ V9 w* U* r
18.1.2 NDIS中间层驱动简介 468* h6 u0 h7 s- }$ k8 H4 S, K& _+ a
18.1.3 NDIS中间层驱动的应用 469
# N4 D4 u$ A k: [ D8 x: T7 x18.1.4 NDIS包描述符结构深究 470
" ~# r& t' t6 `. Z18.2 中间层驱动的入口与绑定 473
& Z& ^/ a; _4 S1 C5 i" W18.2.1 中间层驱动的入口函数 4735 G# I) O% G# [9 [
18.2.2 动态绑定NIC设备 474 |4 G# l8 E, z1 G2 K" M; s7 Y
18.2.3 小端口初始化(MpInitialize) 475
# c% P M1 `: d# C18.3 中间层驱动发送数据包 477
+ V2 h( h; L4 Z9 @/ I/ V5 ^18.3.1 发送数据包原理 4773 `$ j$ _. U) F \7 b0 H, V) |2 J
18.3.2 包描述符“重利用” 478
. p. i4 t! o( U# P: E" F18.3.3 包描述符“重申请” 481. k# @/ I$ S$ h7 p' J& G
18.3.4 发送数据包的异步完成 482
! l9 |- x- @7 ?0 y+ P; U8 Z18.4 中间层驱动接收数据包 484
- E0 u4 b1 c+ b5 g6 @) b18.4.1 接收数据包概述 484
; [( g1 v2 x! _* K" i% q18.4.2 用PtReceive接收数据包 485
) H$ q7 _" A& P9 Z3 K; V2 t) E18.4.3 用PtReceivePacket接收 490
% r, w+ E, J0 Z# Z4 C: |18.4.4 对包进行过滤 491' I- F ^6 V! \) l/ y/ q. N
18.5 中间层驱动程序查询和设置 494! k1 V' S3 {: Y: f- `% m
18.5.1 查询请求的处理 494
3 ]$ |7 V8 \- s/ M, V+ l$ u6 ^18.5.2 设置请求的处理 496
* X+ P! U0 x# c9 }* t0 p18.6 NDIS句柄 498. R7 D) j- M/ a' D; A
18.6.1 不可见的结构指针 498
, g' O" ]; z# Y/ M18.6.2 常见的NDIS句柄 499
" e5 p6 W7 h) h% F" M5 `18.6.3 NDIS句柄误用问题 500
' Z8 j2 B/ @! G. H18.6.4 一种解决方案 5023 ]$ o6 X+ n0 y" ]
18.7 生成普通控制设备 503
( y: \: ` P( H' F4 I$ R. Z18.7.1 在中间层驱动中添加普通设备 503
: \( p- I6 i1 Z+ b8 p7 t18.7.2 使用传统方法来生成控制设备 505
/ u/ d9 l/ A# W) G7 [8 V k$ k7 ?8 ~! d
第19章 IA-32汇编基础 511: q) `7 K1 B( t7 ?7 z2 G6 X
+ h5 S9 m1 ? m+ G! E" h
19.1 x86内存、寄存器与堆栈 511- H/ z: y" j7 _" j- X' l( ^7 R
19.1.1 _asm关键字 511
% a0 b& s8 l' \" E) F19.1.2 x86中的mov指令 512
# Z4 T( {9 D! z. U! j8 E19.1.3 x86中的寄存器与内存 512) L8 c4 S; O' C: Q. D6 K
19.1.4 赋值语句的实现 513
; ^- G- E5 D$ ~1 o; z6 k/ p19.2 x86中函数的实现 514" N! K9 x8 k3 W; F; X I: y
19.2.1 一个函数的例子 514& a* `) B( i+ G7 h9 Y
19.2.2 堆栈的介绍 515
* ~. K3 f9 l4 Z- A! O. }! u" K19.2.3 寄存器的备份和恢复 516$ T# \4 N8 p" v; M8 b8 u
19.2.4 内部变量与返回值 518& m0 k& W; P* M+ o3 I G- d% h
19.3 x86中函数的调用与返回 521! g6 Z, i' L8 g! ^
19.3.1 函数的调用指令call 5210 d5 R, D( g c5 T. ~
19.3.2 通过堆栈传递参数 521/ O/ A0 n6 @) N" }1 o* i5 F4 q
19.3.3 从函数返回 523; p% K; X2 V9 L
19.3.4 三种常见的调用协议 524
) Y- ]- b0 M ^* n; x# ]/ C% p19.4 从32位汇编到64位汇编 526
4 _" e# w c- S- J! d( ~19.4.1 Intel 64与IA-32体系架构简介 526
R9 |7 B2 v; `2 Z; ]% ]( H19.4.2 64位指令与32位指令 526) }/ m" p7 o( I, K0 z! W
19.4.3 通用寄存器 527; G6 d( _$ ?. C* B4 V* K
19.5 64位下的函数实现 528
4 Y$ i/ l; }1 u1 Y- ?# l19.5.1 函数概览 528
3 y0 t8 l; a8 e: ^19.5.2 32位参数的传递 529
& y) G6 J% Y2 Q19.5.3 64位参数与返回值 530" C' F. m+ D2 G& ]" Y& s& M u
19.5.4 栈空间的开辟与恢复 531
& R% ^# V+ S& y( g2 B% K9 f- [9 M0 ~* m& b: K1 e
第20章 IA-32体系中的内存地址 534
& ?0 }( U) O# M2 N% O$ S7 M+ d2 Z. U) k; J- A7 \
20.1 内存的虚拟地址 534
~- e s" F ~9 G20.1.1 C语言中的内存地址 534
1 M9 J& H: K5 C! H2 y7 Y20.1.2 虚拟地址的构成 535
# k+ y# C" v: Y7 _20.1.3 段的选择 536. a9 F1 y$ I5 n0 W' x
20.2 全局描述符表和段描述符 538
$ y9 u# a4 K2 T$ V J20.2.1 全局描述符表 538
! j" D" J Q, P- f20.2.2 段类型 5399 w7 t. |* D; J5 i6 F' D9 t6 b
20.2.3 段寄存器与段选择子 540& [; z- K# X' p4 u- x; t
20.2.4 64位模式下的段 541
1 n+ f) t$ m' |; U) {20.3 分段编程实践 542' G5 j! g4 X* `5 a6 i7 L+ V
20.3.1 系统表寄存器的结构 542
+ k: Q" R, g% P( O20.3.2 在汇编语言中获取全局描述表的位置 5438 P9 \" v7 ~6 _6 g
20.3.3 调试范例:sgdt指令的错误使用 545
( U% x8 o6 s3 I+ ?7 V20.3.4 在64位下获得全局描述符表 547
1 W$ [" q! Z( V/ o1 E20.4 线性地址基础 549
" X6 O3 x! k; p* K9 C& A20.4.1 分页控制机制 550
" d0 J' J5 J" S0 ~% G20.4.2 线性地址的转换 551
5 Z0 X* N+ x, R4 J# c20.4.3 混合页面大小 552
2 O; j8 r+ s7 k$ b, b; x20.4.4 32位物理地址的页目录和页表项 552
' Y) w6 B- i4 t( n6 V' r8 k20.5 各种特殊分页方式 555
! y' Q& q) j5 N# u& j20.5.1 PAE分页方式 5559 |; g8 y2 C5 h" B
20.5.2 PSE-36分页机制 558% }- L! J) z5 [2 S9 a
20.5.3 IA-32e模式下的线性地址 5590 R1 ?5 C/ h6 c$ V; {; d1 D
20.6 分页编程实践 562
, X" x4 y# v; q' u# O. [: Y20.6.1 页目录和页目录指针表的获取 562
4 D$ Q. ` l6 W3 L20.6.2 页表的获取 5640 C' S3 P; W: v! t3 i+ N
20.6.3 线性地址的结构 567
) u5 f- Z9 _' x6 h9 q |6 P
4 G* O7 ^$ x! x8 y第21章 处理器权限级别切换 5716 j5 h5 O0 W/ P. o) j) B8 W& n
$ ?% \$ ^8 g, m2 C5 o4 k9 ^21.1 Ring0和Ring3权限级别 5718 s( @) m5 q4 Z N" u$ x4 }7 p
21.2 保护模式下的分页内存保护 572* ^* ^0 R2 F4 k6 n
21.3 分页内存不可执行保护 574- m. ^) K* `$ `9 ?$ u
21.3.1 不可执行保护原理 5740 ]. I% f5 f( r& E5 [
21.3.2 不可执行保护的漏洞 575
! d, p5 `( Z7 U3 q( I21.3.3 上机实践 577
. P; H- P; H9 v# ^21.4 权限级别的切换 579* }' t; }# m. G# \* x
21.4.1 调用门及其漏洞 579( N3 w. V% K5 I' \* o1 `
21.4.2 sysenter和sysexit指令 581! R4 K8 D- j9 ^, B/ e- o
21.4.3 上机实践 5830 w- w9 ^. F q+ V
! I! [% d3 b1 ^, r
第22章 IA-32体系结构中的中断 585
! Z+ t3 L, t8 L3 D9 Z
9 `' ]3 k9 C% `+ }/ s( _% J22.1 中断基础知识 585# c: q D2 K& Y* B) O3 P X
22.1.1 中断描述符表 585
: U. |5 a! _0 ~0 B22.1.2 中断处理过程 5875 V% @! \' _9 v' r1 e A
22.1.3 64位模式下的中断处理机制 589
) R" ~ Q: u2 ]9 s9 k8 I3 E5 t22.1.4 多核下的中断 5893 m" Z* |* P. e) I1 E
22.2 Windows中断机制 593
8 K# B- \% D, [# k' |22.3 中断编程实践 596
- }. G. C5 v) {( E' s2 w! f22.3.1 IDT Hook 5967 J. H4 b/ I6 T3 z8 T
22.3.2 巧用IDT Hook实现安全防护 598
* d4 m' }7 }4 Z: ~1 B l" n2 @+ ~6 l9 I' L2 K' ?; l: T) F) N
第23章 Windows内核挂钩 601
' y4 G- ^0 m" `# O r- z. P ~# y& J/ v9 K) N
23.1 系统服务描述符表挂钩 602' ^! T' q) S, ^- Q$ E- y) w. U
23.1.1 系统服务描述符表(SSDT) 602
9 z) t% V: T5 D! ?4 ~; W2 C23.1.2 系统服务描述符表挂钩的意图 603 o5 |! X9 ?' |2 k1 F' Z
23.1.3 寻找要挂钩的函数的地址 6044 S. [$ {% D$ i0 v% s! H% x
23.1.4 函数被挂钩的过程 6057 W1 D$ G9 p8 g: |8 \/ h! e/ ^5 _
23.1.5 具体实现的代码 606 c# i1 Z* L q
23.2 函数导出表挂钩 608
" }8 j0 d4 N+ k, ?) Y( {# l23.2.1 内核函数的种类 608# N# d& @! {1 ~# D/ q( p( j
23.2.2 挂钩IoCallDriver 6106 e9 R2 r# a5 _3 _
23.2.3 对跳转地址进行修改 611. D. G$ t2 h3 _; p( d9 \" g5 ]( u" a0 I* P
23.3 Windows 7系统下IofCallDriver的跟踪 6123 a2 K8 u+ ]- s* Z8 Z: g; y
23.4 Windows 7系统下内联挂钩 615( }* p; O3 V& Z0 K9 |
23.4.1 写入跳转指令并拷贝代码 615( L6 u1 T8 [. Z2 s. t
23.4.2 实现中继函数 617
6 `% t( {& h6 X3 s' g, W7 D9 c+ [- g5 @
8 z: w" r- f) x+ z
高 级 篇. g! k& `; F& g2 f
1 D% C! C- J3 V
第24章 Windows通知与回调 620* H* @- r% R/ M0 i2 [: r: j
% S G6 ~$ l. Z ^: w
24.1 Windows的事件通知与回调 620 _% `. `( x3 E: W
24.2 常用的事件通知 620! u4 x- g A- T& b( c0 n" v1 |1 T
24.2.1 创建进程通知 621" G- J! [4 x2 e0 T! Y
24.2.2 创建线程通知 625
& N( e7 i& p. h. ]24.2.3 加载模块通知 626
% s+ w* `6 H; j3 t9 l; r24.2.4 注册表操作通知 6299 N( F% ~! O' f6 j" ]7 M6 s
24.3 Windows回调机制 636/ }5 V/ K N# t9 g2 b( s
24.3.1 回调对象 636
' p7 V$ z3 B# G; a2 c24.3.2 回调对象的创建 637
- l' l- I; D; Z( d" ]- o% f* c3 [24.3.3 回调对象的注册 637
3 r: I- @$ }& L; S0 b3 a24.3.4 回调的通告 638
p5 t, n: A4 V8 e8 `1 p6 ~( A24.4 安全的死角,回调的应用 639
) h3 o' S$ z3 d; D3 o% P
' B' q& p) E: H- l% c- z) A5 V4 `第25章 保护进程 6408 i& h3 d4 a% g4 h
1 Z5 z3 w. [& }% L" h. J- P7 y3 W
25.1 内核对象简介 640
- J( P; J2 {: U! b3 `' l25.2 内核对象的结构 641
4 D1 d7 L3 S2 g/ E3 I25.3 保护内核对象 642
& j8 m# z& A- T9 S$ e25.3.1 处理对象的打开 6432 j, H8 u' P1 a: m2 s7 [- V2 l9 g
25.3.2 处理句柄的复制 644
& L( r/ X1 U2 A) c, D1 D0 U25.3.3 处理句柄的继承 646
6 G5 M5 l: x1 v* x( y8 E' \25.4 进程的保护 652, V* G/ h- x5 s7 F& g
25.4.1 保护原理 652
9 o( H5 {2 U+ h0 A# _! {1 `25.4.2 Vista以后的进程对象保护 654
4 ?, f& b7 g+ I0 Q1 M9 A9 p' n25.4.3 进程的其他保护 655
' ~+ u/ x, P6 h# v( r1 g+ s$ }$ ~5 \' S3 T1 V
附录A 如何使用本书的源码光盘 656
$ ] z4 ^, c5 M' [3 }( n7 s. K5 v- B+ P7 X1 L. W
附录B 练习题 659- N. C" g8 f. L7 J. X" \
% j3 q9 _; J0 a d' U h* |, A+ N8 ?/ j' s# K" Y, p0 d
|
|