鱼C论坛

 找回密码
 立即注册
查看: 5167|回复: 4

[Windows] 【进阶】《windows内核安全与驱动开发》

[复制链接]
发表于 2016-11-19 17:40:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
TB1eC4MIFXXXXaOXpXXXXXXXXXX_!!0-item_pic.jpg_430x430q90.jpg
  s5 a" Q) ?" L/ u; x, X' ]
4 d+ ]: t* r3 j7 s( ?
书名:《windows内核安全与驱动开发》
0 m# {9 @% y4 M  R2 E6 o6 t6 l* K3 H作者:谭文;陈铭霖
* R- n: Q& G8 W出版社:电子工业出版社
8 ^: M- N8 T% {" U& I( Y7 c# F出版年:2015年6月1日(第1版)
2 B5 ~/ V$ N1 d+ d0 t. q8 i: n( g- ?定价:139.00元
+ ?0 X% _7 w# c- H装帧:平装; \! t  [( h  }+ l6 W" D
ISBN:9787121262159
' E& E* S. n! ]6 U% E
% L) b3 a+ G5 b3 T/ _* r购买链接:
; `5 [6 X% |9 w
) c- E& o% V- |
5 e$ t0 T4 Y# w4 _( S
亚马逊 -> 传送门
9 S, ^. f" s  J1 t9 \+ ~! H7 j2 e$ H; l. j  `8 d
当当网 -> 传送门
' Y& n4 K" s  v2 j! q5 h0 u
# E+ B; E. [$ S/ l7 ]京东 -> 传送门
! z# A) f" p; Q- K! I( C1 o( t  h7 f, L; M9 g+ y
天猫 -> 传送门+ Y) \, _5 x2 W' y6 o( A( B

0 C  C& P- ~# Z* |) t
1 X5 u$ T% Y* |; V4 M内容简介:; U% b# E" K# D6 P

, l+ g0 I, N5 S" _  E
& w% l- X9 P; C8 b$ {
本书的前身是《天书夜读——从汇编语言到Windows内核编程》和《寒江独钓——Windows内核安全编程》。与 Windows 客户端安全软件开发相关的驱动程序开发是本书的主题。书中的程序使用环境从 32 位到 64 位,从 Windows XP 到 Windows 8 都有涉及,大部分程序不经过修改即可在 Windows 10 上运行。同时本书也深入浅出地介绍了进行内核安全编程所需要的操作系统、汇编等基础知识。/ c: ^) x' [. d  Z4 s7 ?
0 u( V& K; g6 i, K8 g: I% B
本书共分三篇,基础篇囊括了驱动开发的基础知识,降低了入门的难度;开发篇介绍了在实际工作中可能遇到的各种开发需求的技术实现,包括:串口的过滤、键盘的过滤、磁盘的虚拟、磁盘的过滤、文件系统的过滤与监控、文件系统透明加密、文件系统微过滤驱动、网络传输层过滤、Windows 过滤平台、NDIS 协议驱动、NDIS 小端口驱动、NDIS 中间层驱动、IA-32 汇编基础、IA-32 体系中的内存地址、处理器权限级别切换、IA-32 体系结构中的中断和 Windows 内核挂钩;高级篇包含了汇编语言、操作系统原理、处理器体系架构相关的内容。本书是由长期从事这个行业的工程师自己写的,所以处处以实用为准。对细节的考究主要体现在对实际问题的解决,而不是知识的详尽程度上。; H- \. r  B: w' I9 h" }
7 @6 X: b! q+ Z- C/ t  X, p. R
目录:
7 d4 A5 t) R  t; x
9 f9 Q9 W6 C! U! b

0 q# r3 J/ i. I- O  B! J, b基 础 篇 1 |3 \9 E3 N- Q7 f
: H5 U/ b% `/ W
第1章 内核上机指导2 * k; U# V$ j5 f: n9 d
  [3 |! P1 ]- {
1.1 下载和使用WDK2
$ [6 l1 B5 L) f" ~8 Z1.1.1 下载并安装WDK2 ! K5 E  M# Q) f4 e/ n
1.1.2 编写第一个C文件4 , e7 M" u& R/ }& q0 I# k: }
1.1.3 编译一个工程5
5 b+ {, {& {- e+ M. O: d1 D& V$ X1.2 安装与运行6 0 K: l" p! @( R+ L+ k! h$ i' ^
1.2.1 下载一个安装工具6 % N0 Y. a5 L2 l6 F4 [
1.2.2 运行与查看输出信息7
$ H" {' f/ ^# ]3 k3 o8 W1 e+ V1.2.3 在虚拟机中运行8 7 ]* D6 ~0 M& `( i1 X. [1 p
1.3 调试内核模块9   m. W6 F4 I* \! R( @
1.3.1 下载和安装WinDbg9
1 ^" J0 M" F& w+ C& v# M1.3.2 设置Windows XP调试执行9
" b: Y, V0 g& W0 I4 _) y) q1.3.3 设置Vista调试执行10 7 w4 t% i( |2 m8 `  F
1.3.4 设置VMware的管道虚拟串口11 ' [$ {4 U# f; R; {2 }' V2 f/ f
1.3.5 设置Windows内核符号表12 : v$ w6 h# h) q5 W
1.3.6 实战调试first13
  K8 P8 x. k" {4 t, q6 g- @( F: X4 y6 N" A- ?
第2章 内核编程环境及其特殊性16 ) |, w0 p% U& m' U
% ~5 N2 ?4 H- j5 F* c! [7 \* X9 z
2.1 内核编程的环境16 " W7 u  O/ G  O9 c
2.1.1 隔离的应用程序16
& }* k( X% D; ?. L' N7 w( ]2.1.2 共享的内核空间17 ' q# J) c/ B9 p% l2 E( Y; C& i9 L
2.1.3 无处不在的内核模块18
8 x! b0 p6 G4 T4 m  M4 j! s6 t( v2.2 数据类型19 + w7 y# N3 a4 @$ d
2.2.1 基本数据类型19
. W8 g, s4 Q- v; r) X) x9 L) _9 F2.2.2 返回状态19 ' @! w1 {- A+ z- T. G- u
2.2.3 字符串20 / b& n9 s5 a! c2 i2 p" g2 a
2.3 重要的数据结构21
3 {. e9 j/ D5 _1 D' N. D4 o2.3.1 驱动对象21
" S! u4 u, k9 \$ z4 w, c2.3.2 设备对象22
4 B% E) c. N+ T  U, _8 w$ Q5 J2.3.3 请求24
9 U1 M0 w" O- ]- u3 B2.4 函数调用25 6 u0 {; g* z2 C  q% L& T
2.4.1 查阅帮助25 ; ~1 V+ I! y9 Z0 o% x6 l" M
2.4.2 帮助中有的几类函数26 : d; f7 e# b. L9 d2 C* k9 [
2.4.3 帮助中没有的函数28 , _6 |  D. w- E9 I+ K
2.5 Windows的驱动开发模型29
* E7 W" E, X) Z: |, ~/ [' I2.6 WDK编程中的特殊点30
1 R* [4 R  X# N9 Q/ P/ o2.6.1 内核编程的主要调用源30
+ }: T. z( H9 a7 x% p/ b1 m! e2.6.2 函数的多线程安全性30 + f9 v" P9 }- c; V3 i0 I
2.6.3 代码的中断级32
* e) P4 `7 I/ P0 ~7 w7 n: Z2.6.4 WDK中出现的特殊代码32   T9 F8 U" X  V: m9 q

7 M# N8 w8 Z$ T( Q1 i5 H$ ~第3章 字符串与链表35
& m6 h7 V* A6 ?1 _
: S0 J  C& o$ \' M9 b. V; R1 i3.1 字符串操作35
2 E6 f0 ^2 f7 [6 x3.1.1 使用字符串结构35 , A: C' j& E0 i5 u- _( P8 O2 [/ S  p
3.1.2 字符串的初始化36 $ d5 }" B+ P8 ~, t: u9 h$ w. K4 Z
3.1.3 字符串的拷贝37
4 T4 b& V+ C% V! d3.1.4 字符串的连接38
& |7 A" V6 C% I  b* i% H) ?1 p3.1.5 字符串的打印38 & |5 `* f9 Z9 E5 s- g
3.2 内存与链表40
# N" ?0 C) q' |: E3.2.1 内存的分配与释放40 * R# Y" ]7 e* x; `( B! g" z0 J- }! C5 W
3.2.2 使用LIST_ENTRY41
2 e' q  d* L$ p! T/ I3.2.3 使用长长整型数据43   B* z/ a/ H  X# q  P0 n: o
3.3 自旋锁44   e* H1 w" Q0 O7 M
3.3.1 使用自旋锁44
6 o. [4 B2 v2 q. G! k# n' P) w+ \3.3.2 在双向链表中使用自旋锁45
0 E- _2 b% Z0 H5 ?( M3.3.3 使用队列自旋锁提高性能46 ; j" p/ U4 F- N0 O

2 o5 X8 m5 e/ N( K% B4 H第4章 文件、注册表、线程47
2 [" n+ E. x" F# W, {" ?; ^& ?3 G
4.1 文件操作47 $ i. Z& B2 m2 {: O" F
4.1.1 使用OBJECT_ATTRIBUTES47
& C& i/ [# D( }0 k8 C' ]4.1.2 打开和关闭文件48
$ I& G" Q5 ^6 k0 }: K4.1.3 文件读/写操作51
& o! e1 H& z3 J8 I, W, ?4.2 注册表操作53 6 B0 C5 U# ]. I+ _; f4 w" D
4.2.1 注册表键的打开53
3 a2 a) v& h' _/ ]* P' x5 I4.2.2 注册表键值的读55
5 p0 U% x1 M5 a' ]- `: ?4.2.3 注册表键值的写57
  T9 S' q, E% X2 a4.3 时间与定时器58 + p# s, n. F/ F; R3 _! y- K+ m; E
4.3.1 获得当前“滴答”数58 1 C: ?8 z0 z  ?  x' V' D
4.3.2 获得当前系统时间58 4 g* i6 U& F9 f$ I, y) |0 z
4.3.3 使用定时器59
- J2 j# C/ |+ A+ v3 _4.4 线程与事件62 1 P. S) l" q/ t* I$ f
4.4.1 使用系统线程62 4 w% m4 g) B) C
4.4.2 在线程中睡眠63 1 ^5 z* S# y+ _/ u
4.4.3 使用同步事件64
- g) q& m$ C' O+ D
' y% O/ o$ `( \4 A5 q第5章 应用与内核通信67 2 [( g3 D+ C. y, ^4 a) d. T1 D
; |2 V' k7 R8 A2 I
5.1 内核方面的编程68 ! E- m$ W( ]0 f
5.1.1 生成控制设备68
4 v6 S+ L- c2 y( C/ @8 c+ `5.1.2 控制设备的名字和符号链接70 3 |  ]: c5 j0 l  C: t4 a5 Z
5.1.3 控制设备的删除71
* w. [3 d% d, u/ {5.1.4 分发函数72 & i6 R8 Q- f6 _4 c/ o+ n
5.1.5 请求的处理73
5 T# z# X* s9 o/ J" z5.2 应用方面的编程74 0 y+ q4 M7 ^# b. i& u
5.2.1 基本的功能需求74
2 f" t4 ~6 E/ W9 z5.2.2 在应用程序中打开与关闭设备75
) D3 p( `& a- w5 V& b# S/ \* w5.2.3 设备控制请求75 9 Z. V8 v9 `) v/ q* a4 \
5.2.4 内核中的对应处理77 ( C9 Y3 Q8 J1 U
5.2.5 结合测试的效果79
! n3 I; l$ b1 T; w! N1 O5.3 阻塞、等待与安全设计80
, Q; B* C) g+ i1 |5 L- J* u3 s0 ?5.3.1 驱动主动通知应用80 + K+ x& g5 t, n
5.3.2 通信接口的测试81
$ @0 w1 n" ]+ L4 l6 u! q5.3.3 内核中的缓冲区链表结构83
) M& `' E9 ]$ Y$ M0 S5.3.4 输入:内核中的请求处理中的安全检查84 1 M1 R& T* S- g3 \6 N1 r' i& Y
5.3.5 输出处理与卸载清理85
$ T, `( r  E  z9 a- f0 B3 u' |6 }  e9 A
第6章 64位和32位内核开发差异88
4 [) |' Z* x- [$ Y3 Y3 \ % l9 h8 [+ J8 G$ q, [! S0 _  K* I$ t
6.1 64位系统新增机制88
% F) R. ?9 G# C  A6.1.1 WOW64子系统88 0 d7 l) j# a  r# E
6.1.2 PatchGuard技术91
/ R. `6 G0 s7 J4 V6 I: s6.1.3 64位驱动的编译、安装与运行91 ) L, E' o2 r: w! g) ]
6.2 编程差异92 0 C  ?0 z7 c* n/ {% k- Z* {+ n% f
6.2.1 汇编嵌入变化92
# I" `( n0 U: Q; n4 ~0 h6.2.2 预处理与条件编译93 * G& V% z  d! d$ b7 D- W, s5 {* T$ R
6.2.3 数据结构调整93
* C; ]% _; w% b3 i5 X; D
$ y5 \9 G% o% J$ x: H- O$ @
) n6 s) l9 c- s3 F0 K) D" k9 j  \: }开 发 篇 1 _# W/ c* x( b: {, v2 k8 G* f
+ g/ j* R' i1 H
第7章 串口的过滤96 " Q0 N/ q" U4 d) n

7 d! B4 j7 `) q( o7.1 过滤的概念96
. r- a) @5 }( N4 d7.1.1 设备绑定的内核API之一97 / q8 T8 X' E1 m: u, l
7.1.2 设备绑定的内核API之二98
! m- j) N$ g! s" o9 F& m7.1.3 生成过滤设备并绑定98
: Q* o; y( Y) o  S. ?$ Z: l# Y7.1.4 从名字获得设备对象100 ) c/ y8 v+ y* A2 l! ^
7.1.5 绑定所有串口101
# U7 ?( x1 R# J7 Q. S2 W7.2 获得实际数据102 , i. [8 p/ L" L8 G2 [& o! O
7.2.1 请求的区分102
2 p$ z: G5 m" \7.2.2 请求的结局103 3 D$ h* ~  w+ K8 n% C1 j( v, r( p0 m* C
7.2.3 写请求的数据104
/ u9 H1 }3 ~5 _  k2 l$ W/ ?7.3 完整的代码105
2 ?" @2 W( H8 T, h9 K( i7.3.1 完整的分发函数105 8 S! N2 K/ y% a/ O
7.3.2 如何动态卸载106 6 S/ m& p$ b7 K6 A* `! v
7.3.3 代码的编译与运行107 4 ?" Z  w' O1 j% v
5 D+ u/ p6 F0 j) X" _
第8章 键盘的过滤109
/ `6 g3 x$ i  a# M+ ?: z/ W
- j6 _: h8 \+ A8.1 技术原理110
3 R* X) N, @7 z! C7 G+ `' j( _8.1.1 预备知识110
+ A$ Q2 o5 A# d3 U8.1.2 Windows中从击键到内核110
  }, w5 U" E" W5 e8.1.3 键盘硬件原理112
; t; j% t1 m6 c8.2 键盘过滤的框架112 8 F  Z& H+ S. z/ k
8.2.1 找到所有的键盘设备112
- f) I" j: v# Z  p8.2.2 应用设备扩展115 ' e6 a6 I& X5 S7 p
8.2.3 键盘过滤模块的DriverEntry117   _, v& W# A" O  y- ]  x
8.2.4 键盘过滤模块的动态卸载117 - ]/ C, o) N7 {" k
8.3 键盘过滤的请求处理119
; N; l+ l; v% L8 G, ]8.3.1 通常的处理119
' p% S$ B  Z$ E0 C8.3.2 PNP的处理120 : M& A7 j" G& N, |3 v7 I
8.3.3 读的处理121
4 N- z8 a/ h' ]) b; j0 r" ^* t, h' p8.3.4 读完成的处理122
* C' c8 ?+ \( k5 w8.4 从请求中打印出按键信息123
+ C* N1 h3 X. k- J8.4.1 从缓冲区中获得KEYBOARD_INPUT_DATA123 " _3 q+ b9 ?+ l: z8 ?3 G. `
8.4.2 从KEYBOARD_INPUT_DATA中得到键124
1 n0 z$ k2 W6 x. |6 b8.4.3 从MakeCode到实际字符124
& T& V1 K3 e2 _8.5 Hook分发函数126
4 ?/ V' j6 d  B$ V; |# Q1 g8.5.1 获得类驱动对象126 $ H" @$ z* K6 @) j- p* `3 N
8.5.2 修改类驱动的分发函数指针127
8 o; t- {" {. g3 U! n8.5.3 类驱动之下的端口驱动128 6 H7 J5 N; q7 S% Z  w
8.5.4 端口驱动和类驱动之间的协作机制129 # V6 t6 }- e4 U5 x) l' {9 p' T% t
8.5.5 找到关键的回调函数的条件129 7 ~# O$ e: H6 G) @/ @
8.5.6 定义常数和数据结构130 - I! N; L# v/ Y; {: x
8.5.7 打开两种键盘端口驱动寻找设备131 9 }: J% V$ }, g  i
8.5.8 搜索在KbdClass类驱动中的地址133
; o; |2 U) F. r8 N$ A8.6 Hook键盘中断反过滤135
( }& I# f4 X4 x/ o- U8.6.1 中断:IRQ和INT136
! X. S% S7 S$ C% g0 X) N' C9 W* H( K8.6.2 如何修改IDT136
( ^2 Z% [( V& `) ^: D8.6.3 替换IDT中的跳转地址137
: r3 c$ h+ h; H9 h% K( l9 V1 m8.6.4 QQ的PS/2反过滤措施139
' P% q, Q7 v6 k. v1 M' s8.7 直接用端口操作键盘139 5 ?8 R6 c! \+ t7 a
8.7.1 读取键盘数据和命令端口139 0 e) b# l  u8 k7 e0 @2 E& P$ ?/ ]
8.7.2 p2cUserFilter的最终实现140
9 t# u" Y1 n7 E- ]3 v
8 T5 f& p. e4 h+ t% a: R" @第9章 磁盘的虚拟143 ( B" |# x7 b# H+ i% |# y  v% T
5 U( l* S7 z6 [. u; O0 y: B7 |  \
9.1 虚拟的磁盘143
+ }  f2 T" C7 _' L4 i7 O9.2 一个具体的例子143
% v2 S! ?% J2 Z  z3 A9.3 入口函数144
( V: @3 r& E+ J* C7 c% _9.3.1 入口函数的定义144 6 @2 k# J5 v0 h4 n" I, Z3 _$ R
9.3.2 Ramdisk驱动的入口函数145
9 T5 f: h  K3 O6 S2 e9.4 EvtDriverDeviceAdd函数146 % e( n, l2 v& ~- w
9.4.1 EvtDriverDeviceAdd的定义146
$ x! A0 H, f  h8 b9.4.2 局部变量的声明146 6 _! T9 M1 K/ Y3 H5 M
9.4.3 磁盘设备的创建147 . ?  }! y% F! D9 z% g- ]' j
9.4.4 如何处理发往设备的请求148 * ^4 f0 f3 T6 f
9.4.5 用户配置的初始化149   f' z* |! ~. {' }
9.4.6 链接给应用程序151
! \6 ^! k" u, t" C: w7 M: J" U, d9.4.7 小结152 , U2 w/ A8 b* r" M' ^- r
9.5 FAT12/16磁盘卷初始化152
. d, U6 o3 Z6 m3 e# r: T2 Y% `, Y7 P9.5.1 磁盘卷结构简介152
& L' |4 l. n# M+ F  ?9 f+ {% x. V9.5.2 Ramdisk对磁盘的初始化154
7 a. G, _, _8 q8 b. @& w/ i9.6 驱动中的请求处理160 $ a8 E1 l" H- E, K2 X  B
9.6.1 请求的处理160 8 j5 \: u" j0 D8 w% K  h
9.6.2 读/写请求160 ! ^2 Y' t$ ~) P* c# K. I7 [0 @& ^
9.6.3 DeviceIoControl请求162 5 s1 _0 H; i( M' w" A/ s
9.7 Ramdisk的编译和安装164 3 l; l# Y. _% _, J, y
9.7.1 编译164
, ]& h5 t/ `0 l9.7.2 安装164 ( ?! g) ?8 F" g6 h: `. e  w. f
9.7.3 对安装的深入探究165
' H; S8 p6 R: k, X4 p1 X+ R% T* g$ Z8 s; P( L  g- V/ E% N2 v
第10章 磁盘的过滤167 & `7 j; o) u4 C3 y. G
9 B. E& U2 \% y! x$ I# Q/ N6 g
10.1 磁盘过滤驱动的概念167
! s/ u7 [" h; b10.1.1 设备过滤和类过滤167 * k% O. w9 q# }9 |5 w1 w* v9 h
10.1.2 磁盘设备和磁盘卷设备过滤驱动167
% ~; x$ r: b' x: q% c1 [: p10.1.3 注册表和磁盘卷设备过滤驱动168 6 K: ]4 m$ o9 u  L/ x9 M
10.2 具有还原功能的磁盘卷过滤驱动168 + X% z; K  n  u$ D8 t% I3 U
10.2.1 简介168
, O3 p) r6 I6 S. M' @  Z9 |" ^10.2.2 基本思想169 ' o% ^0 A9 i( b2 I
10.3 驱动分析169
( A  r0 ^! j# T7 H  ]- n10.3.1 DriverEntry函数169 ! M! F: t. Z4 }" j* g) w5 \
10.3.2 AddDevice函数170 * R( }; N  i& n; ?% s/ h" b
10.3.3 PnP请求的处理174 " ]/ v! [2 X+ e5 F# F5 V
10.3.4 Power请求的处理178
& O/ b  t' U" i6 ?' ]10.3.5 DeviceIoControl请求的处理178 " V' K5 @6 n! a7 C0 _: h
10.3.6 bitmap的作用和分析182
1 j  C, M  B, A, b5 p/ m) d8 o, P10.3.7 boot驱动完成回调函数和稀疏文件187
' K0 H7 z  O; S# n4 \+ I10.3.8 读/写请求的处理190 % _, E3 t" {8 H" ^; Q

" }, s( m- n* N' |7 l  e0 K第11章 文件系统的过滤与监控199 , ~+ ~- M) R: r' l( c1 x

$ Z/ ~6 h# T& h, w9 l6 J" E2 j11.1 文件系统的设备对象200
( [/ D5 V# @# }  h11.1.1 控制设备与卷设备200
" i9 t2 L; d, S2 W8 f11.1.2 生成自己的一个控制设备201 0 x2 w. l3 T9 u
11.2 文件系统的分发函数202
$ V/ Q& e+ T3 |9 I& U* e6 ?4 O8 p: O11.2.1 普通的分发函数202
: G0 b; \* a) f2 @* K; [+ _11.2.2 文件过滤的快速IO分发函数203
' Q- D2 j5 V, n3 h11.2.3 快速IO分发函数的一个实现205 ! R  q; W; j! t4 T, v
11.2.4 快速IO分发函数逐个简介206 $ O8 X9 P( w) g/ n8 \
11.3 设备的绑定前期工作207 2 k9 k, x. S' i8 R0 l7 M
11.3.1 动态地选择绑定函数207 - l1 ]  G  z# R0 ^4 X
11.3.2 注册文件系统变动回调208
: e" }( k% R: P6 \) q11.3.3 文件系统变动回调的一个实现209 . Y% _% ^0 m7 M" q
11.3.4 文件系统识别器211
: w3 ~: r5 {& T+ z  y11.4 文件系统控制设备的绑定212
) ~$ i7 I2 i% r2 N  {( \11.4.1 生成文件系统控制设备的过滤设备212
( U- T, p0 f  Q/ k11.4.2 绑定文件系统控制设备213 7 g8 B% L- \+ x1 l' v% e( U
11.4.3 利用文件系统控制请求215 $ W) T2 m) {  m% ~
11.5 文件系统卷设备的绑定217 1 i( o" f/ G& N( s; Q( T
11.5.1 从IRP中获得VPB指针217
0 k5 k( Q4 d1 r5 {: K$ H11.5.2 设置完成函数并等待IRP完成218   g- V2 {4 Z) G. @  S
11.5.3 卷挂载IRP完成后的工作221
9 N$ u, c, A" H& k, K& \11.5.4 完成函数的相应实现223
6 v: n' u! x" W% {# S5 ]11.5.5 绑定卷的实现224
# X" Z5 s/ B5 r; k11.6 读/写操作的过滤226 / p9 N4 M) J* e) {
11.6.1 设置一个读处理函数226 * @  V, N5 ?& n8 |( ^1 K, O
11.6.2 设备对象的区分处理227
+ ~, m2 d. ~8 j/ @9 I# f, J11.6.3 解析读请求中的文件信息228
4 t1 d/ N* r  @, z# {11.6.4 读请求的完成230 % F! B, O4 G, c, \. u& @& t4 V. ^
11.7 其他操作的过滤234 # i3 e( `9 Z, W/ X+ a
11.7.1 文件对象的生存周期234
6 H+ C, y& A0 h% D5 v+ r1 Q: e11.7.2 文件的打开与关闭235
4 O; r3 G4 A/ {: m! R$ I11.7.3 文件的删除237
8 d+ l: y0 ~* L11.8 路径过滤的实现238 # H% r. h; B* h' j
11.8.1 取得文件路径的三种情况238 ; W! R) }( b) ^2 H, N
11.8.2 打开成功后获取路径238 : s6 ]6 t4 G( l& p8 k+ l; A& F: M8 l
11.8.3 在其他时刻获得文件路径240
' j6 O5 e! B! c2 k. T11.8.4 在打开请求完成之前获得路径名240 . M* _3 u& u9 Q, N1 s6 B' \
11.8.5 把短名转换为长名242 ' a/ `* E7 C& Y  K
11.9 把sfilter编译成静态库243
/ t! F3 H' ?* O" v- x9 [: e% j11.9.1 如何方便地使用sfilter243
! h0 ^6 _% Q0 T; }/ a11.9.2 初始化回调、卸载回调和绑定回调244 3 P. g. j7 c# l7 r/ n+ K+ \
11.9.3 绑定与回调245
3 m1 }  ^" k7 a! p. I" l7 Z11.9.4 插入请求回调246 : C4 `1 _* v; y8 F% ?6 K
11.9.5 如何利用sfilter.lib249 " F4 A& @7 {+ ]+ w9 x

/ J- _* v9 J  ^( g* f0 G9 c- A1 P第12章 文件系统透明加密252
5 E% y/ k; |( D3 N1 Y4 s9 d
5 Z! G; s+ J/ g, D  P+ d12.1 文件透明加密的应用252   z9 b% j' y! S4 p$ m% R3 k9 K
12.1.1 防止企业信息泄密252 $ ]/ G) x- r6 ?2 \, C7 W( t* b
12.1.2 文件透明加密防止企业信息泄密253 3 k1 U% h  Z" S% o( S0 S5 z$ O7 h
12.1.3 文件透明加密软件的例子253
/ Y: @0 J# d3 }# V12.2 区分进程254 " r& f, F3 l- s5 x9 n3 r
12.2.1 机密进程与普通进程254 1 x" i- U& G5 b' P/ d) n3 p
12.2.2 找到进程名字的位置255
; `# h. @" r( W, b5 M12.2.3 得到当前进程的名字256
' c9 |" W+ B! e1 H1 b12.3 内存映射与文件缓冲257
$ N2 f# M& {5 A/ ~0 H12.3.1 记事本的内存映射文件257 3 ?- t: X+ E# U: c% V& L$ Z
12.3.2 Windows的文件缓冲258
5 ?0 C) y3 d8 {& O$ g- p/ R; Y& U& ?12.3.3 文件缓冲:明文还是密文的选择259 5 H; N) T8 f$ c6 s; h" V( d
12.3.4 清除文件缓冲260 % n' u; F; Q% {6 x: ]' u
12.4 加密标识263
* U% H/ P: s0 M3 k8 U8 g/ f- Z- A12.4.1 保存在文件外、文件头还是文件尾 263
- i; e+ g/ R5 E* f5 c' o- [4 h12.4.2 隐藏文件头的大小 264
7 d6 E: Q* T+ j- f8 V* W  G12.4.3 隐藏文件头的设置偏移 2665 k) F: _+ L3 u8 x/ U
12.4.4 隐藏文件头的读/写偏移 267
6 [! y  Y- Z/ H( `& q. W1 o" }12.5 文件加密表 267
3 A# d: V/ S  O: g12.5.1 何时进行加密操作 267" I# z1 {* _5 N
12.5.2 文件控制块与文件对象 268
$ }' j- H( c& \12.5.3 文件加密表的数据结构与初始化 269& _, a& A: t- |1 Q. r" G
12.5.4 文件加密表的操作:查询 270& T, \# V. h/ N- @
12.5.5 文件加密表的操作:添加 271
% e# l# M- u3 m' v- n; y12.5.6 文件加密表的操作:删除 272+ S/ R0 c, v7 n. m
12.6 文件打开处理 2735 i- a8 k% o; ?0 P9 {
12.6.1 直接发送IRP进行查询与设置操作 2749 p9 ^2 N! Y6 T
12.6.2 直接发送IRP进行读/写操作 276) R: h. p$ B4 K
12.6.3 文件的非重入打开 277
8 g. e6 P% l1 G. f5 J9 p2 g3 Z3 T12.6.4 文件的打开预处理 280& X/ V7 p6 G0 @8 F6 a
12.7 读/写加密和解密 285
2 S' n9 Z' R; r/ ^/ |* b12.7.1 在读取时进行解密 285
4 D8 C! G% m4 R5 G12.7.2 分配与释放MDL 286: @4 J* [1 |( t& ~& s! h) j' }4 K
12.7.3 写请求加密 287
+ f( M; @6 R; ]; `5 W; e1 O12.8 crypt_file的组装 289
8 ^7 {. s" b3 M5 Q+ ?( w3 L12.8.1 crypt_file的初始化 289
+ S: x" y; x3 s8 @$ b5 i. `8 F12.8.2 crypt_file的IRP预处理 290
) m' ~0 y. c( ?0 j6 I: S12.8.3 crypt_file的IRP后处理 293' a$ d! e5 @3 \! h

) E8 c; X6 U0 S' F第13章 文件系统微过滤驱动 2978 q/ d/ `6 Y7 H/ u

+ R& z- r7 s9 |. q+ G13.1 文件系统微过滤驱动简介 297
: w5 J: h: I/ X2 V8 A1 t6 e13.1.1 文件系统微过滤驱动的由来 297
2 o$ o3 B- ^  i+ c+ f, Z3 ]; T13.1.2 Minifilter的优点与不足 298
( {. u2 v% V0 o$ P) J+ D( n6 F7 ~13.2 Minifilter的编程框架 298
. H. R  F# O  C13.2.1 微文件系统过滤的注册 299
) M4 A' K) Z& u4 _13.2.2 微过滤器的数据结构 3002 @7 v1 n/ y8 \* e
13.2.3 卸载回调函数 303
" g# }4 g% T4 z% W( f13.2.4 预操作回调函数 303
" }8 \: n! O5 w2 L13.2.5 后操作回调函数 306* z/ C% K: {  r3 d
13.2.6 其他回调函数 307
# H, F" m+ q, x, o13.3 Minifilter如何与应用程序通信 309
5 S2 b" f" w# U$ W8 l: H$ Q0 h13.3.1 建立通信端口的方法 310
  S+ v$ L, [+ U+ |7 S13.3.2 在用户态通过DLL使用通信端口的范例 311
. H" k4 t: U6 N3 s3 J13.4 Minifilter的安装与加载 3146 ]' u" ~. G: g! y  p, V9 D
13.4.1 安装Minifilter的INF文件 3146 o2 o. g) i  i, E& W+ ?
13.4.2 启动安装完成的Minifilter 316
( B- o8 `! Y/ q9 o3 X' u& F+ k+ t+ o0 p1 T' h
第14章 网络传输层过滤 317+ g* f- g$ y. ]5 V0 O" P% K& K9 r3 }
7 S7 C, a& Q( x; a7 N
14.1 TDI概要 317) L/ Y0 g" }6 C4 X+ B! w. I
14.1.1 为何选择TDI 3179 Y3 k1 M, A1 `6 ^8 ]) Q! B1 x
14.1.2 从socket到Windows内核 318$ \$ x; B6 h: V
14.1.3 TDI过滤的代码例子 319
9 Z3 b( P8 F+ N0 G$ P: j" I, v14.2 TDI的过滤框架 319
' k4 a2 }$ Q6 ?, Q/ v3 v' f14.2.1 绑定TDI的设备 319
' O& O8 C9 t5 z4 v) k5 S14.2.2 唯一的分发函数 320
$ \/ n/ Q5 n4 G4 E2 c14.2.3 过滤框架的实现 322
2 q" S- t& ]) ]7 r5 ^. d14.2.4 主要过滤的请求类型 323
3 k, B7 Q) ^4 Z; U$ p% x$ x( q0 X14.3 生成请求:获取地址 324
' U$ p; `& \- h" z# f14.3.1 过滤生成请求 324
+ n* X' p+ D) f. u14.3.2 准备解析IP地址与端口 326: h5 l3 I4 w) \* K4 H7 p
14.3.3 获取生成的IP地址和端口 3273 C2 R. w9 V/ x: n
14.3.4 连接终端的生成与相关信息的保存 3298 K; A  X! n/ C8 C: t- m% C
14.4 控制请求 330
: B! w3 N2 J8 |14.4.1 TDI_ASSOCIATE_ADDRESS的过滤 330
, Q9 ~- z  O; T4 i) k' H14.4.2 TDI_CONNECT的过滤 3326 S1 f9 o2 f8 T; F9 N* t
14.4.3 其他的次功能号 333
) B" e/ n2 N  R" w) [3 I" P14.4.4 设置事件的过滤 3340 b4 x' e" Z9 A" F2 z, \# q
14.4.5 TDI_EVENT_CONNECT类型的设置事件的过滤 336. }* T6 d5 E6 n4 q/ ]1 I1 E. I
14.4.6 直接获取发送函数的过滤 337! V/ F0 m) N& |$ ]4 `. n7 _
14.4.7 清理请求的过滤 339/ b& ?+ H- J8 A- A$ ]% o' F0 e
14.5 本书例子tdifw.lib的应用 341
) A' k% D& V/ M14.5.1 tdifw库的回调接口 3413 H7 H* z; ~8 S- h  p' m" G
14.5.2 tdifw库的使用例子 342
4 I; z2 _* p3 t6 q4 S  A7 C
. \6 I, @. D# ^9 u1 D: f第15章 Windows过滤平台 345
: g0 S( ?9 {9 j7 }! C2 y  l6 N7 i& g
15.1 WFP简介 345$ q4 h1 O! v' D+ }6 t' [) \4 K
15.2 WFP框架 345: \7 H0 ~* `3 x9 u
15.3 基本对象模型 347
6 M: p6 o8 X. v0 \15.3.1 过滤引擎 347
9 u0 E& E( X8 B( t; o$ N5 e5 |5 [% g15.3.2 垫片 347, \( N( S! y* c& L: h2 Q) R
15.3.3 呼出接口 3479 ~. }, r, K; I  J( H) W
15.3.4 分层 348
$ k9 [% E, `5 d5 Q" I7 `& G15.3.5 子层 3492 C- ^4 J, N' G: a
15.3.6 过滤器 3505 i1 I6 g1 J( z1 t) F" x
15.3.7 呼出接口回调函数 354* R* c! A6 O, x+ l) ?4 b0 d
15.4 WFP操作 359- K- y% m, k" h8 t; a& J
15.4.1 呼出接口的注册与卸载 3608 b' C/ s, f+ y4 @+ p, [# D4 _& R
15.4.2 呼出接口的添加与移除 360
" X2 B2 S5 }  d; t2 w15.4.3 子层的添加与移除 361
# j  E: m6 ]8 {8 j( u15.4.4 过滤器的添加 362
* Q1 a: r1 m# o; Q% T, O15.5 WFP过滤例子 362
( M) T9 P$ _1 e0 w, {; m3 T) s) g8 [! u% J! `- N7 `! Z
第16章 NDIS协议驱动 370
% ~$ w  N1 ?# z- w8 ?) r$ Q, B% i& O: c
1 h: X6 O/ ~7 D16.1 以太网包和网络驱动架构 3705 V. n* i3 v; m7 S* W
16.1.1 以太网包和协议驱动 370
$ C. E2 }2 @2 l7 i9 G5 e  M16.1.2 NDIS网络驱动 371
6 Q, |( s/ ]7 p! }16.2 协议驱动的DriverEntry 372
4 K  k+ @/ n% R3 t4 b% X4 H16.2.1 生成控制设备 372
* k7 l3 J, a( h3 F; b  J% }6 l16.2.2 注册协议 374" O0 W) S; K( g' n" I
16.3 协议与网卡的绑定 375( s6 j2 e1 }& b; H  b5 k- G
16.3.1 协议与网卡的绑定概念 375
3 |, B1 s. c3 f+ w+ M& H  O16.3.2 绑定回调处理的实现 376/ ?/ L  n2 Q' I  J4 v# j
16.3.3 协议绑定网卡的API 378. W5 v8 j. S! \5 x  ^! W0 k
16.3.4 解决绑定竞争问题 379
, l( ]( X. g9 r+ ]16.3.5 分配接收和发送的包池与缓冲池 380* K; `5 k0 P/ `& T
16.3.6 OID请求的发送和请求完成回调 3814 s3 X: W% S) J  @7 s2 R! K9 b
16.3.7 ndisprotCreateBinding的最终实现 385: [* i; Z) |4 `' v4 e% B: c
16.4 绑定的解除 390; r( O3 d4 c( v# Y: J7 z
16.4.1 解除绑定使用的API 3909 X3 J9 R$ P* r* e4 P" Y- P
16.4.2 ndisprotShutdownBinding的实现 3924 y" n+ L; P: J* C9 e' \" z, e; d1 d
16.5 在用户态操作协议驱动 3952 m6 R- @( e4 K) I- f
16.5.1 协议的收包与发包 395
. n0 j, Z$ b7 H" q: B: Q) D16.5.2 在用户态编程打开设备 396- o: ]6 ?2 f7 u' E
16.5.3 用DeviceIoControl发送控制请求 397
. W7 z) p: g6 E" \# w16.5.4 用WriteFile发送数据包 399
+ j) M  {3 T) @, c& x$ F8 j16.5.5 用ReadFile发送数据包 400  P2 m/ Q" T# h2 h+ E! [* Z9 t  M
16.6 在内核态完成功能的实现 402. V9 _! c' n: ]8 d
16.6.1 请求的分发与实现 4029 t( |/ Z8 w; f1 L! c: c
16.6.2 等待设备绑定完成与指定设备名 4021 F8 ^) B/ x+ o) E" U; X
16.6.3 指派设备的完成 403
  V( C% A: z! ?1 g8 I16.6.4 处理读请求 4064 U0 y: G5 O" q# d1 d* E
16.6.5 处理写请求 408
/ }3 k2 s) N6 m+ E, c8 E9 A16.7 协议驱动的接收回调 4121 |$ L! V6 J- y3 {" m$ \$ t/ Y
16.7.1 和接收包有关的回调函数 4124 v7 S- B5 @& x. n" c% y
16.7.2 ReceiveHandler的实现 413
; O" z; g, l$ ?& [16.7.3 TransferDataCompleteHandler的实现 417( i  }, u0 C% A( c# @: V
16.7.4 ReceivePacketHandler的实现 418
* O, Y7 z! u* ~$ U7 b16.7.5 接收数据包的入队 420
& L, Z* b7 C) i  z1 ?( N* H) a! H16.7.6 接收数据包的出队和读请求的完成 4228 |8 Y9 l7 f+ t1 j# d  u
3 `. j2 d; {7 @+ W$ X
第17章 NDIS小端口驱动 427+ I; G; u8 l  a0 C6 x: |
5 e1 L* L* f' x( Y$ q
17.1 小端口驱动的应用与概述 427
6 @- z" P! U. _$ I5 l: }0 j* c: G17.1.1 小端口驱动的应用 427
- l/ X- T& l: _3 A, q  M- _( ]% e3 r17.1.2 小端口驱动示例 428" j9 K3 k" W6 j  Y9 p
17.1.3 小端口驱动的运作与编程概述 429
7 t- R  r9 k- R* b0 F3 Q17.2 小端口驱动的初始化 4291 u; L2 V3 G0 |  z) i% `4 F
17.2.1 小端口驱动的DriverEntry 429( q1 W1 }1 U) n0 ?) r+ Q
17.2.2 小端口驱动的适配器结构 431& @3 u6 t- X8 Q3 \
17.2.3 配置信息的读取 433* P7 v& W1 L* v# w2 G% G! W
17.2.4 设置小端口适配器上下文 433  ?7 M9 ]+ V9 H) a/ p  c$ W
17.2.5 MPInitialize的实现 434
1 }  Z2 B, B3 c  M; h* {6 Z17.2.6 MPHalt的实现 437' W( D2 ?( y& ^1 T  x, m* w
17.3 打开ndisprot设备 438
  e7 {+ g4 T7 t% ^. b% O17.3.1 IO目标 4385 y+ l& f% A  R1 s; W5 j0 x* w2 T
17.3.2 给IO目标发送DeviceIoControl请求 439. x2 o  T& p- F( f$ ~7 o+ |
17.3.3 打开ndisprot接口并完成配置设备 441
/ O2 S+ I! K& K; {0 _  n2 H17.4 使用ndisprot发送包 443; l8 a/ X( O* c
17.4.1 小端口驱动的发包接口 443
! z" F0 P7 U1 H- k1 w17.4.2 发送控制块(TCB) 4440 f+ h( c) m, Q, U1 l
17.4.3 遍历包组并填写TCB 446; e' s! p& e' F0 e* g+ g) K' J
17.4.4 写请求的构建与发送 449
5 V* D) c* @, N: F$ Y17.5 使用ndisprot接收包 4511 ^( q( E9 N7 s1 G: j& C9 \
17.5.1 提交数据包的内核API 451  s. j+ C: r1 e' p' l8 ~
17.5.2 从接收控制块(RCB)提交包 452
  a* B% \* X. f17.5.3 对ndisprot读请求的完成函数 454
8 P' [& R+ Z% |+ m# V: Z17.5.4 读请求的发送 456
0 R0 w1 W* `5 X$ y. M, S  h17.5.5 用于读包的WDF工作任务 457
+ x0 K8 P; l2 n- `% _0 h' T# A17.5.6 ndisedge读工作任务的生成与入列 4594 A& F& x" \! r2 [7 Z
17.6 其他的特征回调函数的实现 461
, a5 f/ T( [# `/ }* N3 m# M17.6.1 包的归还 461. d1 h3 _3 c& P& F0 r
17.6.2 OID查询处理的直接完成 462
3 M  E. e8 ]9 T17.6.3 OID设置处理 465
/ b' l% Z* A' Y% \! m
* V3 c2 c5 E2 M+ u! _4 w第18章 NDIS中间层驱动 467
7 p; ^1 x) }1 h% @( }9 F0 {) }7 _& P% d+ C; c
18.1 NDIS中间层驱动概述 467
7 b. g1 ]8 E8 B  N- p. P, [  Z2 x18.1.1 Windows网络架构总结 467% z2 e5 C4 ^4 u' A) }
18.1.2 NDIS中间层驱动简介 468
8 K) d+ U4 n; N18.1.3 NDIS中间层驱动的应用 469
* w7 Q. U; u( R4 `( H18.1.4 NDIS包描述符结构深究 470
" C( |- X! {; o0 W4 L/ R18.2 中间层驱动的入口与绑定 4734 R* e6 G" G6 Z2 f4 i4 O
18.2.1 中间层驱动的入口函数 4732 k5 ^7 d( s/ L& z* O) {( V, V, L- E
18.2.2 动态绑定NIC设备 474/ v+ f* E" N3 P' ]
18.2.3 小端口初始化(MpInitialize) 475: |' k$ t' t2 f7 a( m1 A; H8 g8 f
18.3 中间层驱动发送数据包 477; G& |  V8 C6 j" d0 [
18.3.1 发送数据包原理 477
* R5 I! R+ h$ S$ c18.3.2 包描述符“重利用” 4782 V% l+ q7 s+ I' r2 h, g
18.3.3 包描述符“重申请” 4810 Z6 K; |- ~6 B3 |1 K: Q. R
18.3.4 发送数据包的异步完成 482
" B  Q6 P  C8 z/ K- _( S( u18.4 中间层驱动接收数据包 484
, _* A- p' X2 O, o7 t0 t' {; t18.4.1 接收数据包概述 484- q9 n' E; c# e2 h$ z* v& l) P! B
18.4.2 用PtReceive接收数据包 485
. d. e8 u" I8 l: s$ v18.4.3 用PtReceivePacket接收 490
/ |: Q- L( y) G' `" U( Q. p  A% n18.4.4 对包进行过滤 491
* F0 T4 B# f* @4 r( U- E18.5 中间层驱动程序查询和设置 4941 ~! d$ U3 k  v7 m0 a
18.5.1 查询请求的处理 494( }# I9 c; }% a& P' S
18.5.2 设置请求的处理 496
; P8 t1 S1 X% N. h8 r# S- e4 q18.6 NDIS句柄 498% u) }# n- G( J! }. _
18.6.1 不可见的结构指针 498% f( ^6 z3 w, [/ L9 f6 A6 _* q
18.6.2 常见的NDIS句柄 499
) {% W8 Q+ \+ r* U  b3 W9 J: l/ V7 P7 c18.6.3 NDIS句柄误用问题 500
& X8 @9 A; P, t18.6.4 一种解决方案 502
, ]% _" w8 b; Q. i18.7 生成普通控制设备 5032 f; t% c3 H# C. y% Z( l! S
18.7.1 在中间层驱动中添加普通设备 5033 I" v$ S3 v' C6 [3 L% h
18.7.2 使用传统方法来生成控制设备 505# l9 O6 f* Q, V7 q" C3 t- {# `

' C, t) m  F3 l/ ]: }2 o第19章 IA-32汇编基础 511
+ e' c1 L" u; D1 }+ j, |1 q- J
  r! k: v; j, e( }3 b  ~19.1 x86内存、寄存器与堆栈 5113 g5 A5 [0 {1 ]; ~. l' r# I
19.1.1 _asm关键字 511
. m; U" ?* g3 x. L+ A. j19.1.2 x86中的mov指令 512
. j2 |. j% [0 I3 B! P  Q- ^19.1.3 x86中的寄存器与内存 512
! j" |: v( V- @( Z4 @8 b19.1.4 赋值语句的实现 513
1 H0 Q% M. u0 l2 D19.2 x86中函数的实现 514
; Z6 j: T- D2 A# n! j$ n/ |3 J19.2.1 一个函数的例子 514
8 X3 S9 t/ ?& n" T( t. Z19.2.2 堆栈的介绍 515( k0 |5 p2 n; A2 s% x4 K
19.2.3 寄存器的备份和恢复 516! @" z9 f; R" ~
19.2.4 内部变量与返回值 5184 {( W. \, Q/ e& s
19.3 x86中函数的调用与返回 521
- p) t; D7 `  t7 ?19.3.1 函数的调用指令call 521; }( M/ ^0 c' q3 E: C7 C
19.3.2 通过堆栈传递参数 521
# i  t, h* q6 M/ I8 n19.3.3 从函数返回 523! \: @1 b/ Y+ c* H$ X) C# y
19.3.4 三种常见的调用协议 524
. Q5 |+ @! o0 c* J4 v; v19.4 从32位汇编到64位汇编 526$ K3 j. h% x: h: m9 i0 x% I9 w" Q
19.4.1 Intel 64与IA-32体系架构简介 5266 {& @) Z  L! ?/ s- s% n
19.4.2 64位指令与32位指令 526, T3 p) u5 X$ ~. L' t1 m* n; U
19.4.3 通用寄存器 527
" f5 b8 d( |3 I19.5 64位下的函数实现 5281 v2 C! A) G3 _5 }- ~8 W
19.5.1 函数概览 528. o. Y* T. K5 N) j1 L9 n0 M
19.5.2 32位参数的传递 529
* n* b; T0 j4 f* [1 m& X3 U19.5.3 64位参数与返回值 530( Q6 o) Z6 _3 Q2 U& k2 i
19.5.4 栈空间的开辟与恢复 5312 H+ c3 {% k7 N2 ^+ [$ ?

$ Y3 y  L$ P% R0 _4 m' e( Q+ C第20章 IA-32体系中的内存地址 534* v3 d. S2 X( m0 ]2 g: Q/ b2 u
5 \/ ^% S2 \: T
20.1 内存的虚拟地址 534
, N, i" o) \9 t' O20.1.1 C语言中的内存地址 5345 }! t" B% z5 ]7 N9 z2 l+ z% t
20.1.2 虚拟地址的构成 5351 L7 f+ @' Y! n( m  y5 i" E# B! S" t! w: u
20.1.3 段的选择 536/ n/ ?& k9 D7 e
20.2 全局描述符表和段描述符 5388 M, @! K" C' o4 y, d7 G
20.2.1 全局描述符表 538
- y! |/ U) r/ a) o5 Z. l20.2.2 段类型 539
" p* E/ b/ n. u8 O" _2 G) C% o20.2.3 段寄存器与段选择子 540$ K* `+ ~3 ]3 \, u4 E/ p8 G# x
20.2.4 64位模式下的段 541
( r: ~" p9 G& [  v& B# ^: e( |1 U20.3 分段编程实践 542
% H% f3 X/ q; H20.3.1 系统表寄存器的结构 542
5 v  v! O& ]! e) _, G/ y! s20.3.2 在汇编语言中获取全局描述表的位置 543
9 Y7 M, H* r& n8 s4 {! L6 b20.3.3 调试范例:sgdt指令的错误使用 545
$ g1 c! C4 u' f, i* {7 J; ]20.3.4 在64位下获得全局描述符表 5470 A4 S% V2 y2 l: ]0 J+ Y
20.4 线性地址基础 549  X" \( N+ z2 }: [9 ~6 c
20.4.1 分页控制机制 550
, {, _6 ?6 e& j3 R0 e" S20.4.2 线性地址的转换 551
4 w, x" m" d+ T+ T20.4.3 混合页面大小 5528 L: E- p- _5 Q) Y" |
20.4.4 32位物理地址的页目录和页表项 552
" y1 w4 Y8 A" n/ H4 O4 O* N. {# _20.5 各种特殊分页方式 555
4 }  P# w( U$ h% B/ u" E6 N! ]20.5.1 PAE分页方式 555
& s  V% u& ^% b9 J; V4 ?20.5.2 PSE-36分页机制 558# P9 X& b0 ?, v. B) H3 Z# b
20.5.3 IA-32e模式下的线性地址 559
  z2 J( X% D' ]& R' m6 }; D% [. k20.6 分页编程实践 562
; i3 W5 w! c: p' k+ G* a' U6 y20.6.1 页目录和页目录指针表的获取 562
) w- j. F& W6 u% k20.6.2 页表的获取 564$ s6 g' x% q- {  u
20.6.3 线性地址的结构 567
4 A: V4 z8 ?/ k+ f4 y  |3 v
* y! e5 d  t5 ~; p* z- _) q第21章 处理器权限级别切换 571) ]& `( A5 W5 ~; r# Q

% I* ^) C. B4 R% }* \21.1 Ring0和Ring3权限级别 5715 n& I" y0 P& c- ?
21.2 保护模式下的分页内存保护 572
* R( A. `  {8 ]( x% O8 _* k21.3 分页内存不可执行保护 574
; m4 q  _+ l! x8 f" M  F& M7 M% T& t21.3.1 不可执行保护原理 574* M2 C" b/ K7 `4 k% L$ N: ?" ]
21.3.2 不可执行保护的漏洞 575
6 r6 s, \) ]; R' L1 m' E% S7 T21.3.3 上机实践 577" r: O' ?* Y" G
21.4 权限级别的切换 579
+ |$ w  V: K' j: T9 J21.4.1 调用门及其漏洞 5797 H: n0 q: R3 B1 p4 E! Y+ u; \
21.4.2 sysenter和sysexit指令 5814 f3 i! q/ }- M2 M* {! r- ?* K
21.4.3 上机实践 583# ^4 d8 ^6 w  z3 }; D

- C# y' L7 M: o) r4 U$ r( f2 `第22章 IA-32体系结构中的中断 5855 D; [8 `) X+ M4 q& m& a

/ U/ |" C/ v* ~* t& Y/ u# I1 J, Y3 v22.1 中断基础知识 585
7 l1 u3 Z9 _9 E( c7 e22.1.1 中断描述符表 585
+ j7 U8 L8 Z( F, X9 s9 {8 }22.1.2 中断处理过程 587
7 c7 s8 c/ A+ n% Y- ]/ F. S  o22.1.3 64位模式下的中断处理机制 589
. T$ ^/ U, x+ ~  d- P$ A22.1.4 多核下的中断 589
9 A# X8 K) r7 K$ m22.2 Windows中断机制 593
. C  j0 z# w" K- J% `( e22.3 中断编程实践 596
; ^8 t* C5 `/ M# K+ Q22.3.1 IDT Hook 5963 C4 x5 u3 s& h4 E
22.3.2 巧用IDT Hook实现安全防护 598
" N9 F& L+ O* N' `! w
& H. {6 u9 X6 O, T, M第23章 Windows内核挂钩 601  G+ C+ J: s5 k- h" ~4 g

9 D" Y7 p3 a  `5 V: ~9 ?5 T23.1 系统服务描述符表挂钩 602# N( q+ D4 N+ ^7 z
23.1.1 系统服务描述符表(SSDT) 602( O0 R3 j* Y/ r0 N! H, ^. `
23.1.2 系统服务描述符表挂钩的意图 603/ S! g) _6 K! B0 l1 R& \' Z5 `
23.1.3 寻找要挂钩的函数的地址 604/ T  I  n5 @" P  z; j; B# C
23.1.4 函数被挂钩的过程 605
+ k, b% u/ h) o/ {; p$ [23.1.5 具体实现的代码 606. Z. H6 G- g. @
23.2 函数导出表挂钩 608
7 ^$ b0 _9 S) N$ u23.2.1 内核函数的种类 608
! k' C5 N2 b7 \9 h* D7 |23.2.2 挂钩IoCallDriver 610
# N; F- s" I7 I0 i' v2 Q4 q  |23.2.3 对跳转地址进行修改 611
9 I1 |4 U! E7 G- W% n23.3 Windows 7系统下IofCallDriver的跟踪 612
  t4 F, q8 f9 G2 z23.4 Windows 7系统下内联挂钩 615. x% n* u# b9 z" t0 [1 H+ m+ n4 z
23.4.1 写入跳转指令并拷贝代码 615+ Y4 q# I" o5 R- E1 q3 k' L- X
23.4.2 实现中继函数 6173 j' h# e1 v$ ^$ g% G5 N

( J& I- p0 M$ P5 p- @. b+ c
/ X/ Q/ l5 V5 |9 w高 级 篇
0 i6 \( h& r7 O2 y# Z+ U) n0 k- F& A' p- G$ J+ D1 d
第24章 Windows通知与回调 620. B( b4 i2 H* z2 T3 J9 v
) O  y/ P+ ~4 t! l5 t! ?" F$ y9 U, s
24.1 Windows的事件通知与回调 620
0 s, t. s: W' w" ~" v24.2 常用的事件通知 620
# @  i+ l. Q) e( ^' P' d24.2.1 创建进程通知 621
& W2 W' B3 o* ~% M. u* ~24.2.2 创建线程通知 625
* l+ e0 \* j  h+ e" ?; c5 D8 q24.2.3 加载模块通知 626
- x" b( h" h4 C7 T8 F; S$ u24.2.4 注册表操作通知 629
% W0 K$ s  \) G6 t24.3 Windows回调机制 636
  |% y% U. f* k24.3.1 回调对象 636
( Z5 K! l; x2 Y- Y3 ]2 ^; |24.3.2 回调对象的创建 637" N" T: q, \3 h: ?" a# l1 O
24.3.3 回调对象的注册 637& J7 K& F: m, C' j: |7 g7 h) k
24.3.4 回调的通告 638( Q0 B1 S% ?, k
24.4 安全的死角,回调的应用 639
6 Z4 L7 s( t8 l. o6 @' S- r; H2 Q4 a* Z6 X- f, }
第25章 保护进程 640
, u* M$ {1 W+ Q3 N
6 h6 x2 y  u( D+ \25.1 内核对象简介 640
1 O" [! R( l# `1 n+ \3 ~25.2 内核对象的结构 6418 m/ `* E! t) {8 q' x) c
25.3 保护内核对象 642# Q7 @2 _& y' V; F0 e
25.3.1 处理对象的打开 643
8 P2 J2 Z- Z- C0 ?) t25.3.2 处理句柄的复制 644
2 m- T* Y$ M8 b, e, e- w; u4 G25.3.3 处理句柄的继承 6468 v6 @$ _+ [& `. X+ y
25.4 进程的保护 652: k) H0 O% e/ ]  J- O
25.4.1 保护原理 652
# _; |5 g& X1 x' t& D25.4.2 Vista以后的进程对象保护 654+ J0 u1 @& ]2 m( Q- P+ i. `& f
25.4.3 进程的其他保护 655, G1 L% D- Z( E
9 ~# X) @. W/ Y  Z0 w$ G( H
附录A 如何使用本书的源码光盘 656, |4 e" C  P9 b
5 n4 |) U8 V# D- K5 R  h
附录B 练习题 6597 y* u. ~$ _- t
5 M) R* ^" w5 G0 X& @' ^
4 |$ ?, q" s  F% o6 o9 c
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-25 11:01:33 | 显示全部楼层
会驱动的都是大神啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-27 22:34:32 | 显示全部楼层
哦,这个,额,不知道他讲的操作系统的内核指的是什么,这个,很好,我很想学
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-24 16:33:16 | 显示全部楼层
推荐 windows内核编程本身参考资料就很少 网络驱动等开发应用更是可怜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-18 14:54:42 | 显示全部楼层
都不能下载的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-5 17:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表