|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
# m' ?+ R5 B4 f; @7 e& t8 a8 M
: H" B! I5 \' p: k! i书名:《windows内核安全与驱动开发》
3 c2 @) g5 U+ H4 z0 w作者:谭文;陈铭霖
0 A+ i' o: N0 s* s: z出版社:电子工业出版社( |, L! O! K4 ]9 y) Q
出版年:2015年6月1日(第1版)5 V+ e4 q) O# a* J p
定价:139.00元" g$ D5 x5 B! _$ o0 }
装帧:平装
9 b$ z- Q) ]4 i0 {; l5 fISBN:9787121262159
; Y- m' _* k" K# a: V- ]( M
3 C b f6 O J, D7 ^购买链接:$ t% s5 l' z7 g8 W% n* _, p5 A4 X
B- q5 |& p: s
! S: F1 ^9 Z$ \% {7 i' C. Q5 ]6 O亚马逊 -> 传送门
% ?+ D9 J0 j; s) e& c/ c/ f
' j4 v: {+ Q* n& [% j, H当当网 -> 传送门
3 [2 A+ H u, c, F7 f
3 Z8 U; t' y1 r& C京东 -> 传送门
# t: }2 t; b8 f$ Y2 o
5 \- T( ?; r( t; V8 }天猫 -> 传送门
0 u4 }$ a9 F0 |0 }% u2 A. y+ t
( S& t: N6 [( \0 K- o; n
" |! j |; W- D6 K, ~内容简介:
* E5 H0 Y2 t4 D5 m; {: r' b2 u/ ?$ d% _) g4 L# Q1 W8 Y: a, Z
1 G9 v+ }& K& v2 C本书的前身是《天书夜读——从汇编语言到Windows内核编程》和《寒江独钓——Windows内核安全编程》。与 Windows 客户端安全软件开发相关的驱动程序开发是本书的主题。书中的程序使用环境从 32 位到 64 位,从 Windows XP 到 Windows 8 都有涉及,大部分程序不经过修改即可在 Windows 10 上运行。同时本书也深入浅出地介绍了进行内核安全编程所需要的操作系统、汇编等基础知识。
3 q& b( e9 @( m- C6 _& i; L
0 J6 W6 k& |) C( M6 p/ X本书共分三篇,基础篇囊括了驱动开发的基础知识,降低了入门的难度;开发篇介绍了在实际工作中可能遇到的各种开发需求的技术实现,包括:串口的过滤、键盘的过滤、磁盘的虚拟、磁盘的过滤、文件系统的过滤与监控、文件系统透明加密、文件系统微过滤驱动、网络传输层过滤、Windows 过滤平台、NDIS 协议驱动、NDIS 小端口驱动、NDIS 中间层驱动、IA-32 汇编基础、IA-32 体系中的内存地址、处理器权限级别切换、IA-32 体系结构中的中断和 Windows 内核挂钩;高级篇包含了汇编语言、操作系统原理、处理器体系架构相关的内容。本书是由长期从事这个行业的工程师自己写的,所以处处以实用为准。对细节的考究主要体现在对实际问题的解决,而不是知识的详尽程度上。9 A: W+ K( t5 g! h7 Z" \3 n; K
$ K3 T7 P7 v, ?! _' v8 K+ d) p目录:
! ^' c+ @: D7 C4 ?
& {. U1 }& y' b4 \
W! {# M3 @1 p0 D. t( A7 o基 础 篇 4 ?. f5 A+ z" G5 n- g/ ^0 g% s
9 e* c( j" u- G8 h U! `6 l
第1章 内核上机指导2 " ^6 ^9 k$ k$ _
: M+ d ?4 U! y6 g+ a0 W
1.1 下载和使用WDK2
! j6 I6 y4 K- k- v: h5 `- n* f1.1.1 下载并安装WDK2
; k/ G! R: x, \1.1.2 编写第一个C文件4
4 V( c% c" ~9 P1 |1 M1.1.3 编译一个工程5 # E" [) b6 ?* ~& u' X& P( ^
1.2 安装与运行6
. x! \) |% G+ d* B- C6 Y1.2.1 下载一个安装工具6 . j2 ~& F' _) ^+ U
1.2.2 运行与查看输出信息7 2 `9 Q, m1 y9 p' N3 V' P
1.2.3 在虚拟机中运行8 ) c6 r9 c" @5 k- h* n
1.3 调试内核模块9 ) S2 `$ Y; u( P6 G% B* |8 S+ r
1.3.1 下载和安装WinDbg9 ; d6 u3 m+ L6 V
1.3.2 设置Windows XP调试执行9 4 ]' Y3 ~ M# O- E9 W& O
1.3.3 设置Vista调试执行10
" v% |8 ~' s. m5 y" q5 f1.3.4 设置VMware的管道虚拟串口11 & H, Q B& f$ [# t& M: A
1.3.5 设置Windows内核符号表12 - ^6 L8 F% [ |; Y- d; v6 ?
1.3.6 实战调试first13 ( A; ^, Y/ [& r! d4 }
. v9 y0 H8 R2 Y8 f9 O
第2章 内核编程环境及其特殊性16
% F, g7 _$ @7 d3 L( r7 o6 \1 R
7 x4 @( V- X: c" T1 }1 J8 c# S2.1 内核编程的环境16
' z, D- ~" Z$ x( x* q" P2.1.1 隔离的应用程序16
) {0 r7 R- C( G" _* Q2.1.2 共享的内核空间17
& v0 C, h$ ^; W2.1.3 无处不在的内核模块18
0 D E4 L4 M6 _' \ y4 a3 y4 k: s2.2 数据类型19
( p& A: m% |* U* l: p3 O/ z2.2.1 基本数据类型19
% Q8 b0 _: {; l% \& m2.2.2 返回状态19
$ V! j" ]. S( z0 H2.2.3 字符串20
, O2 t* C2 y0 Q$ T8 J1 i! b2.3 重要的数据结构21 ' k; G3 L; K& d8 V1 W# b2 R: D
2.3.1 驱动对象21
3 G+ H7 D/ w- ? q2.3.2 设备对象22 ; V3 ~/ S6 S3 i
2.3.3 请求24
5 R& ], u8 b" [# m& B8 O2.4 函数调用25 ' Q% T; @* { G% o2 k% K( y
2.4.1 查阅帮助25 ) L. Z+ o2 `* ~
2.4.2 帮助中有的几类函数26
9 ~, R6 J2 m% Y2.4.3 帮助中没有的函数28 . _" H( Z: V+ f! N1 ^( v
2.5 Windows的驱动开发模型29 / H5 N) _# D8 E
2.6 WDK编程中的特殊点30
$ D2 W/ V$ B% j9 I3 f$ a. D2.6.1 内核编程的主要调用源30 ( D1 }- d: b( o G. O. u
2.6.2 函数的多线程安全性30
6 K s7 S0 ^; I. I% [2.6.3 代码的中断级32 : V/ o! g8 X/ [$ M& |8 o8 O6 c
2.6.4 WDK中出现的特殊代码32
* O1 R* x8 D. S1 B3 u/ y% v
- W' r/ Q8 b2 [4 { C% M6 d第3章 字符串与链表35
! R8 g; W& S7 X+ @0 s) K3 h1 `4 j' C+ C8 P' i8 I' H& O
3.1 字符串操作35 ! c ^" S- U/ _$ t; D. Z
3.1.1 使用字符串结构35
( J* U. o/ A$ |# s" B3.1.2 字符串的初始化36
7 ]5 S6 D7 H% a3.1.3 字符串的拷贝37
& t. `( Y b W( ~& T# V2 Y3.1.4 字符串的连接38 , O# x, Z3 w6 Z- l1 ]' M
3.1.5 字符串的打印38 . j1 O2 d+ a& z3 ~* S
3.2 内存与链表40
\/ _. S+ Y4 T6 d1 N0 }3.2.1 内存的分配与释放40
6 ^1 }. f2 o" \. v& h. g0 H3.2.2 使用LIST_ENTRY41 - B) v" x1 k7 \# p6 B3 ]( S* l- _
3.2.3 使用长长整型数据43
8 a/ p$ M! h; D3.3 自旋锁44 3 J! l8 J+ m* u% T/ ]$ ^$ c
3.3.1 使用自旋锁44 7 ~1 W+ X1 a$ u) y) K" ~2 f. M& q
3.3.2 在双向链表中使用自旋锁45 , d$ c6 H8 d! z, ^) r( I
3.3.3 使用队列自旋锁提高性能46 5 l# V+ v$ e: r; u
6 s6 v. f! X8 E) x( D4 L- |
第4章 文件、注册表、线程47
% j2 F: c! O+ l: x5 Z* O5 y, _; W
4.1 文件操作47 : E/ K" X/ L5 o* z3 f' W
4.1.1 使用OBJECT_ATTRIBUTES47
( C7 n) ^9 L3 P4.1.2 打开和关闭文件48 * b$ U+ H1 y& D Z6 h
4.1.3 文件读/写操作51
6 h) G% X1 N6 l$ U! D7 z4.2 注册表操作53
8 Q* L( B, b" y S9 Q( C" r: T4.2.1 注册表键的打开53
. E. g+ Y3 S' _2 R" q+ W" g4.2.2 注册表键值的读55 & C, Z. N" E+ B4 w) `8 `3 g; w$ w b
4.2.3 注册表键值的写57
) |% e V {; s9 X; c1 H0 b# Z4.3 时间与定时器58 & p7 E0 E- `6 Q, C
4.3.1 获得当前“滴答”数58 2 @5 N$ c, o0 A
4.3.2 获得当前系统时间58 ( V0 N+ k" Q: I& [7 L( K. u
4.3.3 使用定时器59
4 l: n4 E* {3 d( O& E4.4 线程与事件62 4 z& f" E% k. x8 l {
4.4.1 使用系统线程62 / r8 ~9 M3 q9 w1 f9 x
4.4.2 在线程中睡眠63 : _. x8 } j8 N0 F: n' j
4.4.3 使用同步事件64 ; [$ j6 _5 E% j4 z6 a) j i
! x, e5 K+ {2 d% Q0 Q第5章 应用与内核通信67
' n8 |5 \4 s9 n. D, v( L3 y+ g) r+ P. r) Q: \
5.1 内核方面的编程68 / _+ v. g. p; V( j5 k$ C7 u8 N
5.1.1 生成控制设备68 ' P' \/ b: i, `3 `
5.1.2 控制设备的名字和符号链接70 4 Y1 [8 f; T6 P8 W& k
5.1.3 控制设备的删除71
0 @ z: H# u: P! t7 [2 I5.1.4 分发函数72 / E$ B4 Z7 k- H
5.1.5 请求的处理73 " A. x1 v3 Z1 F$ O0 M
5.2 应用方面的编程74 3 P+ D( A" R4 x/ r
5.2.1 基本的功能需求74 0 e: e* V, x3 w9 Q' c2 Q7 c
5.2.2 在应用程序中打开与关闭设备75
( F/ `4 I9 C7 A0 E% I7 u9 w" E: o- ~5.2.3 设备控制请求75
2 `- M$ ^$ K: U: N! J5.2.4 内核中的对应处理77 1 q5 v- ?4 T% g% M; n+ C
5.2.5 结合测试的效果79
6 S( {4 N3 Q( e- o( V ?* c- Q& n1 S5.3 阻塞、等待与安全设计80 5 {- B' g" e6 d e
5.3.1 驱动主动通知应用80
& [- Z4 `4 z: ^* D5.3.2 通信接口的测试81 ' x" n( q3 ~, I9 \ P+ V' [# {
5.3.3 内核中的缓冲区链表结构83 6 C1 S* D" n0 n3 h+ t- Y4 h
5.3.4 输入:内核中的请求处理中的安全检查84
9 A0 G2 Y+ F0 ?5 e5 b5.3.5 输出处理与卸载清理85
# |, P( Y& h, I1 n& l/ u* u1 S5 M6 i# Q* B: B/ U0 Q2 L
第6章 64位和32位内核开发差异88
; Y% r( d [9 Y8 V$ g% F
# N w3 O6 R5 v9 m4 M" z6.1 64位系统新增机制88
! c1 K& I/ `0 f U+ z/ h6.1.1 WOW64子系统88
- d6 K7 \! W4 m% y6.1.2 PatchGuard技术91
7 j# [) h$ z3 G4 n8 T6.1.3 64位驱动的编译、安装与运行91 ( H+ o7 p1 D8 y0 x' m
6.2 编程差异92 7 R7 i8 D% Y/ w% |
6.2.1 汇编嵌入变化92 . i0 J- \; {9 v
6.2.2 预处理与条件编译93 K5 y3 P: s& ]
6.2.3 数据结构调整93
4 \) w- R% P: V/ e9 t2 f% \# T" w& N& `- @. t0 w
1 I. V" z( V/ R2 N; e1 g$ M开 发 篇 + ^# ^) d1 z* S# f& i; v9 t# K( {
' x* s8 p: h6 W* `1 h/ `9 Z; ]$ F% d' `第7章 串口的过滤96
/ m: a# {* `- ^9 W: ?) {
6 W, a5 |) D: i! p- d7.1 过滤的概念96 ) W2 I( O" \- z3 p. e
7.1.1 设备绑定的内核API之一97 ; z8 h3 x; m4 x9 h( r8 ]
7.1.2 设备绑定的内核API之二98
* H; r4 n8 m/ S0 b5 l% G0 R7.1.3 生成过滤设备并绑定98
- p# J: Y/ ?0 ]4 _7.1.4 从名字获得设备对象100 ! B! [! _5 b' G1 {
7.1.5 绑定所有串口101
) ` T8 w: v' L7.2 获得实际数据102 0 P: w' Z) C6 _1 m4 @; l
7.2.1 请求的区分102 : j) Y; |- d8 e: V1 c5 _5 ?
7.2.2 请求的结局103 9 S" K8 {7 n& X! k* \ Z
7.2.3 写请求的数据104
! U7 q. m! M J# `9 E; f; x0 w8 ~7.3 完整的代码105
1 k) v w4 }5 Y7.3.1 完整的分发函数105 ' L/ ^" K, E: C6 u7 ]) T
7.3.2 如何动态卸载106 0 i0 v$ J1 a! T c0 m" i! L) [
7.3.3 代码的编译与运行107
5 h0 e2 _: |! A, L+ u; ]1 t7 \3 T+ o& H; ?1 H5 o
第8章 键盘的过滤109 4 `3 M. O& {5 G0 P, t; d2 s: l
3 ]- Q; H: V' [" b$ V7 p
8.1 技术原理110
) u$ m- c" I3 A/ R9 M0 _8.1.1 预备知识110 . u6 W6 \; Q, u5 O7 f3 O p" s
8.1.2 Windows中从击键到内核110
. ~$ G. I. E0 g' | O5 u8.1.3 键盘硬件原理112 + u ~2 N! a' e* i/ i9 q
8.2 键盘过滤的框架112
8 X9 e |( Q: [: j2 w/ h% t9 z8.2.1 找到所有的键盘设备112
3 [1 r0 y( H4 u8.2.2 应用设备扩展115
+ H- | w& R5 [) C, p5 _/ h, i8.2.3 键盘过滤模块的DriverEntry117 : M' u/ d6 c9 g) z" w3 W5 P
8.2.4 键盘过滤模块的动态卸载117
/ `& f+ Q4 @) a0 O& v6 O% [+ c, o8.3 键盘过滤的请求处理119 ' U% H6 G& Z9 F1 g% L2 s: W
8.3.1 通常的处理119 4 m G* S c& l$ X8 ~$ ?
8.3.2 PNP的处理120
2 `+ b {. E$ Z H8.3.3 读的处理121 + N8 ?. z# X% [7 V; Y# c5 t
8.3.4 读完成的处理122 6 m l6 Z5 x5 r- v/ M; {
8.4 从请求中打印出按键信息123 + Q. B. ^$ {0 u. ?! }
8.4.1 从缓冲区中获得KEYBOARD_INPUT_DATA123
4 U. U0 x L. r8.4.2 从KEYBOARD_INPUT_DATA中得到键124 7 d6 z/ _0 I' B# n: e, X
8.4.3 从MakeCode到实际字符124
" l4 p: Q; F* }- x0 b3 S8.5 Hook分发函数126 0 Z5 W6 `6 {4 _' ?* |! X9 j
8.5.1 获得类驱动对象126
- P$ \- ?; j3 ^) k6 o( E; r- T8.5.2 修改类驱动的分发函数指针127 + H8 `3 S, q. W2 H( V7 h
8.5.3 类驱动之下的端口驱动128 ) C4 p: ]$ `) p m+ ]+ \' ?
8.5.4 端口驱动和类驱动之间的协作机制129 8 {- w* O1 ]3 Y. g- D$ q
8.5.5 找到关键的回调函数的条件129
# {/ D" k& {8 \) _8.5.6 定义常数和数据结构130 ) x: p( [3 R9 v
8.5.7 打开两种键盘端口驱动寻找设备131
5 |3 _4 K% S: E' A9 O8.5.8 搜索在KbdClass类驱动中的地址133
3 ]7 p& H5 k# T# I5 P5 A# F) l8.6 Hook键盘中断反过滤135 1 U5 t+ ]4 |- R p7 m+ _8 f
8.6.1 中断:IRQ和INT136
\4 j+ \0 n* t4 a7 t1 B8.6.2 如何修改IDT136 ' X2 r' V( ^" F2 f, m1 I# V
8.6.3 替换IDT中的跳转地址137
3 `) ?7 q0 r# e: M8.6.4 QQ的PS/2反过滤措施139 - q# y0 u( a5 ?& x6 K4 r( \8 R
8.7 直接用端口操作键盘139 + N7 C6 R( Z% F( |
8.7.1 读取键盘数据和命令端口139
+ P3 h! B6 V9 K8 c8.7.2 p2cUserFilter的最终实现140 6 h S+ l; y5 o- n5 A' Q6 E
* q* B$ f$ Y* f) v第9章 磁盘的虚拟143
3 { R# l8 U) @2 p7 y% W% ^7 |2 O* Y) D, J$ s; Q
9.1 虚拟的磁盘143 5 K* l7 n) r! h8 m H( _/ @9 k# q3 w
9.2 一个具体的例子143
8 N: y6 ^( b" P1 v$ ?* V9.3 入口函数144 8 z0 y. T L+ l! ?
9.3.1 入口函数的定义144 ( e& r! C0 N8 M% E: _2 j
9.3.2 Ramdisk驱动的入口函数145 - F6 p; m& D: }9 M: e0 ]' Z+ u) \
9.4 EvtDriverDeviceAdd函数146
7 a- N# B0 @7 Z+ G, [9.4.1 EvtDriverDeviceAdd的定义146
& J9 T, Z& X" w9.4.2 局部变量的声明146 ) Z9 U; Q* J! J) O0 ~
9.4.3 磁盘设备的创建147 $ M- W8 }9 G% x5 |
9.4.4 如何处理发往设备的请求148 & O+ _7 q% O* i9 q. E: ~; Q/ \& x
9.4.5 用户配置的初始化149
. `: \! |. i& w2 K$ a8 T; `4 R! t9.4.6 链接给应用程序151 ' G9 C- I4 h* T0 P9 X8 P' P0 ?
9.4.7 小结152 4 p1 n* O( P3 k8 O, b
9.5 FAT12/16磁盘卷初始化152
% H: y+ K5 y$ U6 l, g! v5 l9.5.1 磁盘卷结构简介152
" C. f; x% N: ~; k# L7 O9.5.2 Ramdisk对磁盘的初始化154 - g! S: g( S X# K
9.6 驱动中的请求处理160
; s) Q" E8 X8 r% O: E. V) b' f9.6.1 请求的处理160
* |* t4 R* ?/ W: K, g) Q7 i9.6.2 读/写请求160 * P8 |4 A1 D; }7 a( _
9.6.3 DeviceIoControl请求162 6 [( T5 n4 H7 u4 t6 C* Y0 a% A
9.7 Ramdisk的编译和安装164
* g8 y8 }7 B ?* i" R1 }( _' \9.7.1 编译164 - p- H1 {& u, m6 w0 E$ m) a1 }
9.7.2 安装164
; P L _# s2 Q9.7.3 对安装的深入探究165 , T( v) H p: s* E" M
1 j( k* k$ d, q: a3 H: l- a第10章 磁盘的过滤167
% z1 o& }, i2 U6 f: ~. \; n. J$ W2 m K; x) L
10.1 磁盘过滤驱动的概念167 , {9 C' f5 a% E8 K7 Q
10.1.1 设备过滤和类过滤167 # u0 O$ d* @* N- W5 k' c* x4 d
10.1.2 磁盘设备和磁盘卷设备过滤驱动167
; X* A# }* c O# {10.1.3 注册表和磁盘卷设备过滤驱动168 : V. W& K. \" k
10.2 具有还原功能的磁盘卷过滤驱动168
: C. h# T. |" Y! e/ I( ^" R( m10.2.1 简介168 ; y" G* Q' S" o9 k/ M: ?. j: M c7 \
10.2.2 基本思想169
5 f( f8 _2 f w10.3 驱动分析169
0 [9 f# m3 Z+ |) T! n' G( _10.3.1 DriverEntry函数169 0 b! S5 L+ F) L" {! R1 o' z ~; n
10.3.2 AddDevice函数170 % Y- G) x+ h5 E, I8 M+ W
10.3.3 PnP请求的处理174
" B9 |8 B2 F3 Q0 d1 z5 l10.3.4 Power请求的处理178 ! A5 r* v% y3 C9 U5 e- A) j
10.3.5 DeviceIoControl请求的处理178
; _' v) K3 ^: |, P7 ~10.3.6 bitmap的作用和分析182
) i2 k. w4 `4 C) u$ u1 K/ h10.3.7 boot驱动完成回调函数和稀疏文件187
- x1 r' N+ D6 `+ Y10.3.8 读/写请求的处理190
- _7 p8 X6 O8 B+ R8 q- T
3 r; I" i8 v0 T+ s O第11章 文件系统的过滤与监控199
f: P2 G% H2 J3 n! V4 l8 E% {+ a g* Y% X5 J
11.1 文件系统的设备对象200 - s# {* p& U& J8 t
11.1.1 控制设备与卷设备200 9 t+ O4 k) i6 N3 b8 t9 @, d
11.1.2 生成自己的一个控制设备201 % b9 X. l! E! n9 k
11.2 文件系统的分发函数202 % h- E$ Z. V5 G( t7 z2 q4 e
11.2.1 普通的分发函数202
/ d; J4 y7 D+ X9 L6 w" A11.2.2 文件过滤的快速IO分发函数203 * y$ c+ _! z, o( F' a
11.2.3 快速IO分发函数的一个实现205 ) r7 y- I6 G* ]6 `7 R+ m$ q
11.2.4 快速IO分发函数逐个简介206 7 ~& Z# g+ x+ t0 z {5 w n+ h
11.3 设备的绑定前期工作207 % L: U. H7 |% O, w
11.3.1 动态地选择绑定函数207
( {) s4 {" C& w- ~5 R11.3.2 注册文件系统变动回调208 ) i$ v5 B5 H+ i) h
11.3.3 文件系统变动回调的一个实现209
1 a& b0 i! j/ F' _11.3.4 文件系统识别器211 7 O3 G7 x' n( L- u' c/ r
11.4 文件系统控制设备的绑定212 0 K" ] `& E. j# D" e
11.4.1 生成文件系统控制设备的过滤设备212
9 _; N9 [; J, _( V$ d$ X- |3 a11.4.2 绑定文件系统控制设备213 0 k- G6 \) u& L- _/ Y
11.4.3 利用文件系统控制请求215
7 {5 e8 `8 v) y) p11.5 文件系统卷设备的绑定217
5 G: T) C0 {* b8 w c11.5.1 从IRP中获得VPB指针217 * d, Y2 L+ w* O2 ~5 S) v# A
11.5.2 设置完成函数并等待IRP完成218 0 w1 |" P( a$ T
11.5.3 卷挂载IRP完成后的工作221 % c" @2 n5 @/ E/ D( p- S2 N3 k. U
11.5.4 完成函数的相应实现223 & {- L' v2 J$ x% }: |2 c
11.5.5 绑定卷的实现224 4 Q" u O# u3 B$ Z
11.6 读/写操作的过滤226 u N4 y2 T! J0 b
11.6.1 设置一个读处理函数226 " I! E2 l" d5 K. P
11.6.2 设备对象的区分处理227
0 M7 k+ q3 W# H11.6.3 解析读请求中的文件信息228 4 C2 l7 E) v" H" L9 Y
11.6.4 读请求的完成230 0 D' E* W5 j6 l1 w2 J5 v; X
11.7 其他操作的过滤234 6 _0 B: ]- b q# r0 ?
11.7.1 文件对象的生存周期234 7 d& ?5 i3 f& w0 H$ d0 I
11.7.2 文件的打开与关闭235
/ g3 K: o! X% R' J11.7.3 文件的删除237
& h2 D9 q! A, G1 u11.8 路径过滤的实现238 $ @; z# q& J# C/ R; D7 d* I
11.8.1 取得文件路径的三种情况238
+ u; H, E. H4 A; G3 r( a% a7 D. k% k11.8.2 打开成功后获取路径238
1 \1 v9 V$ n9 I+ D0 R11.8.3 在其他时刻获得文件路径240
/ h N: F( f3 N! K( K1 n, a11.8.4 在打开请求完成之前获得路径名240 ! P" a7 k4 U. `. |1 L
11.8.5 把短名转换为长名242 9 F" y! K* W# r6 B1 I& O, N
11.9 把sfilter编译成静态库243
4 o2 t* M4 ^. W$ j11.9.1 如何方便地使用sfilter243
+ `3 o4 N( K2 s: Z: @1 F6 K# ^' S3 u11.9.2 初始化回调、卸载回调和绑定回调244
3 a8 x: R1 Q' m11.9.3 绑定与回调245 1 a1 C0 X2 I/ t) b2 U# w
11.9.4 插入请求回调246 3 F2 n2 a+ \# }4 K+ N, T
11.9.5 如何利用sfilter.lib249
5 A* J n, J' ^# E
/ A% U& F. W, b$ t2 N* N第12章 文件系统透明加密252 2 A% ]8 W0 N) H2 ]6 n N- y
+ F3 T0 |7 |( c
12.1 文件透明加密的应用252
. U: `+ ^8 c/ \2 X! t12.1.1 防止企业信息泄密252
, I m( B! k. {& s! ]12.1.2 文件透明加密防止企业信息泄密253
! N9 T/ h4 w1 H$ i. y0 ~- Q' |) p7 G; `4 d12.1.3 文件透明加密软件的例子253
: b: K% _) G) m12.2 区分进程254 ! ~% d6 E9 X- D' l
12.2.1 机密进程与普通进程254
7 q1 y# }4 L1 A12.2.2 找到进程名字的位置255
5 ?7 S' ?4 ]6 n5 m' f2 d b, @12.2.3 得到当前进程的名字256 7 _5 a! {+ k0 ~6 c9 M2 Q- s
12.3 内存映射与文件缓冲257 - j5 M4 ^# p% V& j7 N9 D0 w
12.3.1 记事本的内存映射文件257 + v V$ e3 ~3 D4 {8 n
12.3.2 Windows的文件缓冲258
, b) R; D. Q1 x* z/ g9 O1 x12.3.3 文件缓冲:明文还是密文的选择259 & u5 d& i% _8 Q9 H
12.3.4 清除文件缓冲260 4 ~* t5 u, J. H5 r) D d% a3 X$ |- `
12.4 加密标识263& q. L" F/ Y# G: j- N1 u G
12.4.1 保存在文件外、文件头还是文件尾 263/ Z8 c# k+ j: Z6 R: j4 B, g% o4 Q
12.4.2 隐藏文件头的大小 264
S3 z3 u; e g% c% v" B12.4.3 隐藏文件头的设置偏移 266
7 D) C5 L6 `; `" X: I% d12.4.4 隐藏文件头的读/写偏移 267; D" g# P+ | U
12.5 文件加密表 2676 d+ v* V% F& a8 o# e! x$ @
12.5.1 何时进行加密操作 267, g4 N. U" @. i: d- Y( z$ ~
12.5.2 文件控制块与文件对象 268* e; b5 W: d; r& O! h5 e
12.5.3 文件加密表的数据结构与初始化 269
, T$ F) j" o( O8 M12.5.4 文件加密表的操作:查询 270
: ?. T- o" i. F4 D12.5.5 文件加密表的操作:添加 271
, i8 M" {; r) _12.5.6 文件加密表的操作:删除 272
K5 \0 [8 s0 d E2 I12.6 文件打开处理 273
! b; O; S/ y3 N% J12.6.1 直接发送IRP进行查询与设置操作 274' ~+ y8 S. [- U7 O, ~+ v5 T! J; B
12.6.2 直接发送IRP进行读/写操作 276
. v6 N3 O4 m, A7 h12.6.3 文件的非重入打开 277
9 v/ ^) i/ ~) ^4 N% E7 |* ~/ E w+ {12.6.4 文件的打开预处理 280+ S8 k* m" D* Q! x
12.7 读/写加密和解密 285
$ n* U% X, V& B( q- |12.7.1 在读取时进行解密 285* x' m! R; S- l% `# D0 A
12.7.2 分配与释放MDL 286" ]! R# A7 e; \" |2 s
12.7.3 写请求加密 287
& m& {% H+ b+ X# f" @" S6 Q12.8 crypt_file的组装 2898 B2 J4 G( f! w6 I1 m2 I
12.8.1 crypt_file的初始化 2896 l* O3 K" z$ o2 v- u) D
12.8.2 crypt_file的IRP预处理 290( l D; `% f$ V
12.8.3 crypt_file的IRP后处理 293
$ x! D4 p, k( C+ y# e. ^
: _" X2 l2 l3 |3 w. t: Z2 y第13章 文件系统微过滤驱动 297
- _ s' r0 S4 w8 ]1 T( t5 v" \2 Z! m4 Z8 n$ e
13.1 文件系统微过滤驱动简介 297% A, p% o7 h4 @! N
13.1.1 文件系统微过滤驱动的由来 297+ R s4 k) m# {; Y
13.1.2 Minifilter的优点与不足 298
0 j7 [4 R& Z( s( T, n8 x2 y13.2 Minifilter的编程框架 2988 r% b( Q; Z/ O: y
13.2.1 微文件系统过滤的注册 299
! [; I8 F# a) t, a( @13.2.2 微过滤器的数据结构 3006 q5 |" [. l" _" V7 K
13.2.3 卸载回调函数 3038 c. e& ~& m# h- L# J& d+ `
13.2.4 预操作回调函数 303
% F9 a) P2 r7 u1 N5 j% L% t13.2.5 后操作回调函数 306
. g9 v$ }3 { I. [/ x4 X U% d13.2.6 其他回调函数 307
7 l9 ~1 @- a* D9 h0 p3 h13.3 Minifilter如何与应用程序通信 309" x ?' j! ~. o. N; D2 W9 J7 O
13.3.1 建立通信端口的方法 310
! n, j% a+ z) D! x/ r$ Q9 J13.3.2 在用户态通过DLL使用通信端口的范例 311" ]1 e9 v" O. ~6 ?8 g
13.4 Minifilter的安装与加载 314! t( @4 _9 Z1 a: k) w
13.4.1 安装Minifilter的INF文件 314
y1 m) w5 [" _1 I2 P! }+ _13.4.2 启动安装完成的Minifilter 316
! K7 Y5 j& P A- ?( h; k* {
$ ]# z& V2 ^. W第14章 网络传输层过滤 317
2 F i* O% D# R0 G7 Y
. d2 Q# T: R9 c, E14.1 TDI概要 317
( g- a9 G; S9 R( p( @: ]) |14.1.1 为何选择TDI 3170 s% U, t( K* k; V3 V Z
14.1.2 从socket到Windows内核 318
9 ~1 d3 R1 n- H' ~6 w14.1.3 TDI过滤的代码例子 319
0 Q n$ y) E K7 |0 ~14.2 TDI的过滤框架 319. T) S0 H% n" g
14.2.1 绑定TDI的设备 319+ w! T( j' p5 p: h% M0 e1 _8 w. i
14.2.2 唯一的分发函数 3202 G( O4 x" ]8 b- l6 l+ ?' ^" X+ G
14.2.3 过滤框架的实现 322
# [$ l9 j4 n. e5 w& a14.2.4 主要过滤的请求类型 323; u& j" ^$ |/ x6 ]4 e# y5 v
14.3 生成请求:获取地址 324& v( R d6 \+ n. o# S3 n. U9 n
14.3.1 过滤生成请求 3243 L5 G O8 Q/ T- c1 u
14.3.2 准备解析IP地址与端口 326: s2 E6 g. l5 j% @$ t( D
14.3.3 获取生成的IP地址和端口 327" f+ f( `& R8 D, l2 v! Y1 b
14.3.4 连接终端的生成与相关信息的保存 329
* K5 d- T D5 b6 ?. t14.4 控制请求 330) t" x7 M* a$ ~( t1 T
14.4.1 TDI_ASSOCIATE_ADDRESS的过滤 330' F& o) k2 s; [, c* w& x9 e8 A
14.4.2 TDI_CONNECT的过滤 332) l* a) @/ h m b8 ]7 U! P
14.4.3 其他的次功能号 333
# D" Y! O! A0 B14.4.4 设置事件的过滤 334
6 J/ T' c0 j( @7 F9 C& o! ^14.4.5 TDI_EVENT_CONNECT类型的设置事件的过滤 336
& J. h; g0 \! ]; P14.4.6 直接获取发送函数的过滤 3378 b& c/ K9 W. ?8 ?# u, j
14.4.7 清理请求的过滤 339! s4 N5 N% m% b
14.5 本书例子tdifw.lib的应用 341
+ S2 C) ?6 }: ~. {7 `14.5.1 tdifw库的回调接口 341
! f' [- Z& x. a' z- y( q- c$ X14.5.2 tdifw库的使用例子 342
- ^: E9 N2 E1 G, p. u+ `% ]0 t+ q7 p- f4 `1 }: G
第15章 Windows过滤平台 345
9 l7 A6 T4 O8 u
0 H+ a+ D' \% {+ t: \6 \15.1 WFP简介 345
5 O/ l5 J% L+ _! H, q15.2 WFP框架 345
+ N; f( V! E7 x6 r+ v15.3 基本对象模型 347
* e$ _1 q c/ Q w+ f+ Z9 ^# p# ~3 z15.3.1 过滤引擎 347- n0 d, y& }0 C$ h, J' Q6 D7 ]
15.3.2 垫片 347 k3 ?- V5 Z1 e
15.3.3 呼出接口 347; Q d& b" {" d! K" q- l+ E2 {6 v( W+ U
15.3.4 分层 348# s5 ~3 Q8 }& n- x1 x
15.3.5 子层 349" H; [3 r q0 z* ?: R
15.3.6 过滤器 3502 V# p4 L' f+ @; O( G1 J
15.3.7 呼出接口回调函数 354
1 a/ z c/ C7 `- |5 U15.4 WFP操作 359* t2 y. D7 {: [, q, ?
15.4.1 呼出接口的注册与卸载 360
: ?0 L V4 k& g1 l9 h15.4.2 呼出接口的添加与移除 360+ R# [0 _: O( I- S
15.4.3 子层的添加与移除 3611 I, n6 N- [' ^* Y; D& t4 _- \
15.4.4 过滤器的添加 3621 T" W2 }% ~" i
15.5 WFP过滤例子 362
+ e+ {# U* J& m3 o9 T* z; x! ]( a
第16章 NDIS协议驱动 370
9 b5 q0 p8 B# I+ v+ U W. ]9 i
: S3 [5 J( ^% s( s+ z) v& l3 E' R6 x% ]16.1 以太网包和网络驱动架构 370
: U3 d" B/ ^* ?0 n8 j16.1.1 以太网包和协议驱动 370
. s6 Y5 ?, B1 ^8 {" m16.1.2 NDIS网络驱动 371
9 |! H# v/ J+ w4 S( `16.2 协议驱动的DriverEntry 372
) \5 b7 P9 A8 i }7 a% j/ X16.2.1 生成控制设备 372
+ |( g5 \: s5 e5 W- \; @: I16.2.2 注册协议 374
, K2 h' Y k6 ?3 ^8 t+ m16.3 协议与网卡的绑定 375: {3 N' S0 j' }& m6 L7 T( U8 Z* c
16.3.1 协议与网卡的绑定概念 375. Q$ r) p6 d+ F- x- o4 U
16.3.2 绑定回调处理的实现 376: Q. u9 t0 W5 B1 V3 H
16.3.3 协议绑定网卡的API 3780 h2 {' z( {, P }' M$ A
16.3.4 解决绑定竞争问题 379
& h# ?$ V# H4 F" n3 Y16.3.5 分配接收和发送的包池与缓冲池 380
?5 g" c/ ?7 P5 l0 `9 p16.3.6 OID请求的发送和请求完成回调 381
2 M2 H' G+ c9 d" C9 t16.3.7 ndisprotCreateBinding的最终实现 385
7 ~3 u) I" \% [. Y, m; I# I16.4 绑定的解除 390$ q9 ~2 r6 W9 Y6 M' C- C# E
16.4.1 解除绑定使用的API 390
/ W" `- G+ I: P, M16.4.2 ndisprotShutdownBinding的实现 392. A6 e _; F8 z, j2 m) I& _
16.5 在用户态操作协议驱动 3950 s3 O9 u$ d1 y+ U7 P) l# Z
16.5.1 协议的收包与发包 395
$ n6 f+ R" i' P' o16.5.2 在用户态编程打开设备 396' b1 A E( n7 e9 E, s" s
16.5.3 用DeviceIoControl发送控制请求 397
6 \6 f; O: E% T( X0 R6 V: v* `* N0 Z: K16.5.4 用WriteFile发送数据包 399
& p' ~9 x, U. R5 R* B6 O* W16.5.5 用ReadFile发送数据包 4006 b! V7 i# c7 m; u
16.6 在内核态完成功能的实现 402
4 F) e: C( i# z$ Z& r16.6.1 请求的分发与实现 402" p$ n) Q( J* s. G3 p/ A5 x2 _
16.6.2 等待设备绑定完成与指定设备名 402
# v* G$ D( B% b. M( ~: s16.6.3 指派设备的完成 403
" Y; @. j" w) @+ j/ ^+ `9 K2 x$ ^16.6.4 处理读请求 406! l" ~& A1 w$ l1 m1 E
16.6.5 处理写请求 4085 s6 n0 ^; I* c5 H- t2 _
16.7 协议驱动的接收回调 412
* a G& b( w7 P% j; U3 X16.7.1 和接收包有关的回调函数 412
6 c5 \$ M4 ~# s* ^5 p16.7.2 ReceiveHandler的实现 413: L; s4 M( R1 D' u1 i! n a2 N
16.7.3 TransferDataCompleteHandler的实现 417
" @) p# r* O" X3 y) b16.7.4 ReceivePacketHandler的实现 418
7 k2 f: ?% w' D0 `% h* u$ C% ~16.7.5 接收数据包的入队 420
% m) D( {+ r% r2 Q0 l; Q16.7.6 接收数据包的出队和读请求的完成 422& ^0 N8 m' K. b
! w: o+ M, A2 e/ A% z3 u: ]第17章 NDIS小端口驱动 427
' O+ C s- A% c2 j2 M$ S ^0 a) ~) r- u9 |
17.1 小端口驱动的应用与概述 427
7 S2 O- S2 I+ B$ Y# [( z17.1.1 小端口驱动的应用 4274 A/ F0 J( N- |- }- ]
17.1.2 小端口驱动示例 4280 L; Q/ u5 M7 e: s$ A
17.1.3 小端口驱动的运作与编程概述 429
7 R1 i( U( F3 D0 \/ K# c2 V17.2 小端口驱动的初始化 4290 q4 R& S. P* x D
17.2.1 小端口驱动的DriverEntry 429/ h; T- l5 X9 f/ b
17.2.2 小端口驱动的适配器结构 431
' j/ n& `5 U7 F7 f0 Z- z17.2.3 配置信息的读取 4335 R+ W" O. T( l& ~( b& `# c" Y
17.2.4 设置小端口适配器上下文 433
: P! v( d3 b8 f( _% V1 t17.2.5 MPInitialize的实现 434
F! {1 R% d5 T# s" Z17.2.6 MPHalt的实现 437+ i% Q: f% N& ^7 @# X _ L- f
17.3 打开ndisprot设备 438
+ v3 t) U" I7 M4 x) j6 i' _17.3.1 IO目标 438; m6 @9 v) A- C9 H0 |3 ?
17.3.2 给IO目标发送DeviceIoControl请求 439! h, T3 O) d; Q; ?+ z
17.3.3 打开ndisprot接口并完成配置设备 441, u4 x2 L- Q1 Y: o( ]2 w" j6 Z @
17.4 使用ndisprot发送包 443* ^6 T$ p3 m/ H" |
17.4.1 小端口驱动的发包接口 443
& { g1 ]5 ~: I( i7 M: [6 W17.4.2 发送控制块(TCB) 444/ c, T4 v% Q; k$ Z/ `
17.4.3 遍历包组并填写TCB 446/ u J- s/ i$ A
17.4.4 写请求的构建与发送 449+ A, X4 s1 i6 u7 O4 x9 F2 `4 k+ d
17.5 使用ndisprot接收包 4510 e$ C4 W; C: b% A1 h* w/ {
17.5.1 提交数据包的内核API 451
6 ?+ U/ G/ A3 T* ]. r, X17.5.2 从接收控制块(RCB)提交包 452+ N. X* C' C8 q0 y
17.5.3 对ndisprot读请求的完成函数 454( @ Z% z B& E3 K; I% |% o
17.5.4 读请求的发送 456& [0 V8 w- G {' l2 F
17.5.5 用于读包的WDF工作任务 457( Y1 i' _; ]' z% u" |; g( V
17.5.6 ndisedge读工作任务的生成与入列 459
1 ?2 U: Z: S6 E& f u' }" ^17.6 其他的特征回调函数的实现 461- R+ {- R! z( |
17.6.1 包的归还 461. {2 @ j3 n% x( c
17.6.2 OID查询处理的直接完成 462
) ?( ? Z0 _+ o1 V3 O3 ]4 }17.6.3 OID设置处理 465
7 n4 t' w+ `* \/ ?2 ?
* v3 o6 {# L0 ]' k- [第18章 NDIS中间层驱动 467* r1 b; f" N8 V- l
$ j1 E2 I& L K. W# T' e# ]9 C, M
18.1 NDIS中间层驱动概述 467
% l# P8 E. ?5 i5 X( _- H* l18.1.1 Windows网络架构总结 4672 j/ s! Y7 S9 u: G; @& t; J
18.1.2 NDIS中间层驱动简介 468
3 @7 U, r4 B7 x, v" P& b8 U: S18.1.3 NDIS中间层驱动的应用 469
g; w" E- i& Z' J18.1.4 NDIS包描述符结构深究 470
: n0 P% t% J8 C L: ~" G9 j- G18.2 中间层驱动的入口与绑定 473' x: A( D3 ^5 S8 x: y
18.2.1 中间层驱动的入口函数 473
& N9 W3 |# \, z18.2.2 动态绑定NIC设备 474
. B# T) X, q. _# z18.2.3 小端口初始化(MpInitialize) 475& A" {5 N+ q+ _9 g+ P2 f
18.3 中间层驱动发送数据包 477' n# S8 a! G+ n* U
18.3.1 发送数据包原理 4773 ^, K$ w! A2 P$ c7 Q9 W7 E, Y
18.3.2 包描述符“重利用” 4784 K# ^# c. r1 J
18.3.3 包描述符“重申请” 481
, C* `, c- S0 e; I18.3.4 发送数据包的异步完成 4820 n+ n& ~1 Y$ ^9 k6 f! X( k! D7 d
18.4 中间层驱动接收数据包 484# z0 T5 l1 S8 F, K
18.4.1 接收数据包概述 484
! @* [$ x; P, K" l- I18.4.2 用PtReceive接收数据包 4859 S) T3 z3 R B! `7 d/ Z# H* D
18.4.3 用PtReceivePacket接收 490
( N) a4 ^/ M& R# J. t18.4.4 对包进行过滤 491# S7 @( c9 _; [# `8 }1 A
18.5 中间层驱动程序查询和设置 494( G, w t) b# s' p6 v
18.5.1 查询请求的处理 494
) H/ s ^! A& Q18.5.2 设置请求的处理 496
( k. k( \* {) U; w' U& S" W5 L) q18.6 NDIS句柄 498
& E3 x/ y" a% [8 o: [3 L18.6.1 不可见的结构指针 498$ c/ a5 j: \& T$ q5 K/ ?! E7 Z
18.6.2 常见的NDIS句柄 499
r& K$ z8 L3 F T18.6.3 NDIS句柄误用问题 5000 Q1 P* Q' w' ] _3 E
18.6.4 一种解决方案 5020 |- y c! Z; k$ O# h3 H
18.7 生成普通控制设备 503
! b/ ^1 j& x0 L3 y( K# d! s18.7.1 在中间层驱动中添加普通设备 503, |5 L% x5 V/ Y5 V( Z5 _
18.7.2 使用传统方法来生成控制设备 5053 q( A% E! X( l" m* @/ {! e
0 t) o$ A9 v+ d0 d- C
第19章 IA-32汇编基础 511
* c9 W0 |8 i: q8 [6 _* j% G, D+ x K! k% @
19.1 x86内存、寄存器与堆栈 511/ Z- b* E. C. V- \! p1 Q
19.1.1 _asm关键字 511( h i0 H; }4 }! l% L3 A% K. w
19.1.2 x86中的mov指令 512
+ F7 ^' U) m, V z# }19.1.3 x86中的寄存器与内存 512, R) k+ K0 p6 j4 M4 R& C k
19.1.4 赋值语句的实现 5130 B% {' v8 `2 Q, Q
19.2 x86中函数的实现 514
) C, W. E+ r- p! z+ L, d; S( \19.2.1 一个函数的例子 5146 r7 S" X6 {! J
19.2.2 堆栈的介绍 515
s2 B& U+ \' }- r$ Z* f19.2.3 寄存器的备份和恢复 516
' `2 V" H3 j. a& u# a6 d% r19.2.4 内部变量与返回值 518
/ M) Y2 U1 n- D% W1 Q19.3 x86中函数的调用与返回 521
3 I z& n* M4 B19.3.1 函数的调用指令call 521' W3 i- w( T* M
19.3.2 通过堆栈传递参数 521! r5 H& R% T" i. V
19.3.3 从函数返回 523
# d( f5 y' B1 n8 z6 e! N5 T19.3.4 三种常见的调用协议 524
0 m" e$ h8 `# R19.4 从32位汇编到64位汇编 5260 H. z/ |- l% X6 K2 ^: ]
19.4.1 Intel 64与IA-32体系架构简介 5264 T( A7 J1 ?# g8 o
19.4.2 64位指令与32位指令 526& |1 c$ O+ c/ U2 k* N
19.4.3 通用寄存器 527
/ T) O- T! X( ?: n19.5 64位下的函数实现 528
8 h; `* Z( j( e7 w2 \( c+ |19.5.1 函数概览 5289 t1 C' Z9 @* T g5 w
19.5.2 32位参数的传递 529
1 z& a* I& m1 T- M- l0 [19.5.3 64位参数与返回值 530
( h9 P ~9 F( I7 x3 J+ C* L19.5.4 栈空间的开辟与恢复 531- S$ P) @1 S2 k5 R
5 m9 a) E* J# Y- m
第20章 IA-32体系中的内存地址 534* B" A5 F3 }! ^
9 J2 M( N: }9 M/ s
20.1 内存的虚拟地址 534! }# h+ W) B! W \ |; y8 L
20.1.1 C语言中的内存地址 534# |1 `. R0 l2 o$ ^" F
20.1.2 虚拟地址的构成 535
1 |. @ b, z& B1 {, k5 x20.1.3 段的选择 536" C! c4 R6 X: Q4 ?, b
20.2 全局描述符表和段描述符 538
, q- j. Y1 s7 v6 A20.2.1 全局描述符表 538, h$ N( k+ o) V' F0 C; s+ q9 @$ Y
20.2.2 段类型 539
: Q, I8 C Q% Y* T5 ^20.2.3 段寄存器与段选择子 540
5 c+ U) h& D1 |7 O6 s ~20.2.4 64位模式下的段 541
2 ] `4 b W- X/ c. V& j e+ {20.3 分段编程实践 542
" A% d. A8 r, T$ @5 E. R9 W' R20.3.1 系统表寄存器的结构 542
, x. ^8 g) Y5 j! n0 ?$ ]5 a1 U. q20.3.2 在汇编语言中获取全局描述表的位置 543
( L! Y- O; Z: G2 A5 \; m1 z: K20.3.3 调试范例:sgdt指令的错误使用 545
3 C( N7 m# q( y1 u5 t20.3.4 在64位下获得全局描述符表 5476 i, n @- m- T7 A9 E; @
20.4 线性地址基础 549
, x. S- x- f% R8 b& D20.4.1 分页控制机制 550
& u$ g, H6 u5 v; H" |# X9 \6 \* z6 J' N20.4.2 线性地址的转换 551' R% \. h( Z, f" D4 f8 {" b
20.4.3 混合页面大小 552' K f/ W8 A& {9 {) A+ a
20.4.4 32位物理地址的页目录和页表项 552% [4 p2 d1 H3 l! B+ R1 y3 ~
20.5 各种特殊分页方式 555. V- B* Y2 Q0 K
20.5.1 PAE分页方式 555
4 n5 ]5 d- a' N20.5.2 PSE-36分页机制 558, _% t* }5 R; J) u
20.5.3 IA-32e模式下的线性地址 559
7 E; T6 c- A0 A/ b20.6 分页编程实践 5629 P- D4 f1 o& a+ I- Z
20.6.1 页目录和页目录指针表的获取 562
/ n7 [; |, `! R3 P* P3 o20.6.2 页表的获取 564
# X1 @2 f& c" q+ L. w2 ]20.6.3 线性地址的结构 567
& M: r; a& ~( P, H( L e, Q4 A; L
: m- a% P w0 T' [" }第21章 处理器权限级别切换 571; W0 z5 k8 S, `9 ?# Y, \
% p, d$ B+ L. u, o% b) G, Z. o
21.1 Ring0和Ring3权限级别 571
1 Y6 p! ?8 \ g1 J5 J8 o. }% G21.2 保护模式下的分页内存保护 572/ Y8 }: S, {8 \" C" S% t9 }# f
21.3 分页内存不可执行保护 574! v4 e- @: v; u; J% y- m
21.3.1 不可执行保护原理 574
$ A1 @" L+ @0 l: U21.3.2 不可执行保护的漏洞 575
4 p1 d1 }* Q: N- O/ Y7 L21.3.3 上机实践 5778 Q3 T) @0 p" y& e/ I( w% |9 |
21.4 权限级别的切换 579
3 u' G- t& A) M2 S21.4.1 调用门及其漏洞 579+ }2 y0 Q8 ?2 {# A- v. G. Y
21.4.2 sysenter和sysexit指令 581
+ f }. [( g) Y" M21.4.3 上机实践 583) a9 X. N: [' o& Y
7 L& G! c! j M
第22章 IA-32体系结构中的中断 585! s8 p; `$ w8 _8 G% ?
0 }/ e3 t6 W/ u% E* e( g
22.1 中断基础知识 585
, F, v' z0 o5 g22.1.1 中断描述符表 5857 U8 n5 [( X" S$ Z- b+ C
22.1.2 中断处理过程 587
3 Z" k3 `! a+ N8 K0 ^5 q22.1.3 64位模式下的中断处理机制 589' ~, X! u. N B6 H
22.1.4 多核下的中断 589& ?, M; A5 C$ V( x
22.2 Windows中断机制 593
' h+ Y" @; ^; G' m- a- L22.3 中断编程实践 596
4 d( V8 c% l. a1 R' n, g; f; {22.3.1 IDT Hook 596: x& M! a9 X1 t# ?. U
22.3.2 巧用IDT Hook实现安全防护 5980 y7 B% h2 w% X& S& ]
; }6 R% d$ y+ \6 ?# o2 q% L1 B) z9 \
第23章 Windows内核挂钩 601, w& w% x0 H3 O8 t6 K" D
, t2 b$ S3 O3 d' R9 X
23.1 系统服务描述符表挂钩 602
1 m% d; m2 Z1 O' D4 W23.1.1 系统服务描述符表(SSDT) 6021 i$ w D$ _! g6 _0 n0 L* d
23.1.2 系统服务描述符表挂钩的意图 603+ p7 I/ B# D7 O
23.1.3 寻找要挂钩的函数的地址 604
( u* @' S; ?2 H1 @! q23.1.4 函数被挂钩的过程 605$ \- o3 U/ l" }% I& M
23.1.5 具体实现的代码 6066 r% \9 L, h0 K5 e( U* ~* l
23.2 函数导出表挂钩 608
5 f9 W9 B) C5 G# x7 b23.2.1 内核函数的种类 608
: O4 ?' b# O. M" {1 e8 Z4 Y6 z23.2.2 挂钩IoCallDriver 610/ ]) T0 L2 B. g( G* y
23.2.3 对跳转地址进行修改 611/ H3 r N4 ], u" `0 v3 A
23.3 Windows 7系统下IofCallDriver的跟踪 612
' [' F* f$ H* C+ F23.4 Windows 7系统下内联挂钩 615
2 j* m' G! v3 I% E5 P23.4.1 写入跳转指令并拷贝代码 6158 z$ l. T' g) q) B; \6 f3 }3 \' O
23.4.2 实现中继函数 617) Y C: Z, @( `% v
! x8 Y& A) N- V3 l. C" [
3 c$ ]. k1 B# a5 u: F
高 级 篇
7 G) T+ `4 f/ n0 }% A/ i; |3 Q' D; m q: ~+ j$ \7 k
第24章 Windows通知与回调 620
3 N; e1 u3 U6 {# p# y8 s; N" a
24.1 Windows的事件通知与回调 620
2 I. ?, j% M3 ^6 p) ^( ]8 \8 `24.2 常用的事件通知 620; l# R0 Q2 ~) d: F5 x- V1 `" u& i4 ^
24.2.1 创建进程通知 621
+ t+ }9 K$ E* W, C24.2.2 创建线程通知 625
" [# n' K9 k" R- T- {. T ~24.2.3 加载模块通知 626% ?1 |( b0 x3 I) C5 Q' B; S9 v# n
24.2.4 注册表操作通知 629
. U5 e' E' o' T8 j5 v24.3 Windows回调机制 6368 h8 ^2 `' m( Z6 X: V* u3 w
24.3.1 回调对象 636
* l* f& W' |) G" i% P24.3.2 回调对象的创建 637' l* M& {$ J' Q; z9 o8 i
24.3.3 回调对象的注册 637
4 P, U( e2 ^7 q) a3 ^24.3.4 回调的通告 6382 d, B0 k: J2 N8 Q
24.4 安全的死角,回调的应用 639
$ i M* P" _6 z5 I: d. l2 g4 m: l) ^$ A: E" z
第25章 保护进程 640+ l' I% H* Q$ i* F' R, f
_7 b9 s) \, ^; U+ k; e25.1 内核对象简介 640- {) h) N ~0 I5 X, w% P
25.2 内核对象的结构 641
, B2 G+ m6 S3 M25.3 保护内核对象 642
D0 j% n' T, v4 r; d' O25.3.1 处理对象的打开 643
9 Z2 [% k! H/ h: @) ~& g* ^25.3.2 处理句柄的复制 6444 @. `* a; [" V1 x2 R' z
25.3.3 处理句柄的继承 646% u; l \1 u$ b. `$ y [$ D8 K
25.4 进程的保护 652
- f7 i4 t. t3 Y% w25.4.1 保护原理 652
! B1 {% B- e& [/ z25.4.2 Vista以后的进程对象保护 654
' J5 H' w4 d; W- J7 z; S; U25.4.3 进程的其他保护 655! d" l0 h9 `5 b8 ~, H
/ j A' U: ~6 Y附录A 如何使用本书的源码光盘 656* X1 ]1 v& I. O" @' m
8 V) k- F; n1 z, P8 q8 c& V
附录B 练习题 659
1 k7 F2 o5 P/ O, C
2 T" k" \. Q% b6 R+ J! ^6 j- d+ r
( p- y- ~7 a7 C' a I% Z5 ` |
|