1Day

书籍

《0day安全:软件漏洞分析技术》

PDF

0day安全:软件漏洞分析技术(第二版).pdf

目录

  1. 1 漏洞利用原理(初级)
  2. 1 基础知识 2
  3. 1.1 漏洞概述 2
  4. 1.1.1 bug与漏洞 2
  5. 1.1.2 几个令人困惑的安全问题 2
  6. 1.1.3 漏洞挖掘、漏洞分析、漏洞利用 3
  7. 1.1.4 漏洞的公布与0day响应5
  8. 1.2 二进制文件概述 5
  9. 1.2.1 PE文件格式 5
  10. 1.2.2 虚拟内存 6
  11. 1.2.3 PE文件与虚拟内存之间的映射 7
  12. 1.3 必备工具 11
  13. 1.3.1 OllyDbg简介 11
  14. 1.3.2 SoftICE简介 11
  15. 1.3.3 WinDbg简介 16
  16. 1.3.4 IDA Pro简介 18
  17. 1.3.5 二进制编辑器 20
  18. 1.3.6 VMware简介 21
  19. 1.3.7 Python编程环境 28
  20. 1.4 Crack小实验 29
  21. 2 栈溢出原理与实践 38
  22. 2.1 系统栈的工作原理 38
  23. 2.1.1 内存的不同用途 38
  24. 2.1.2 栈与系统栈 39
  25. 2.1.3 函数调用时发生了什么 40
  26. 2.1.4 寄存器与函数栈帧 43
  27. 2.1.5 函数调用约定与相关指令 44
  28. 2.2 修改邻接变量 47
  29. 2.2.1 修改邻接变量的原理 47
  30. 2.2.2 突破密码验证程序 49
  31. 2.3 修改函数返回地址 53
  32. 2.3.1 返回地址与程序流程 53
  33. 2.3.2 控制程序的执行流程 57
  34. 2.4 代码植入 62
  35. 2.4.1 代码植入的原理 62
  36. 2.4.2 向进程中植入代码 62
  37. 3 开发shellcode的艺术 71
  38. 3.1 shellcode概述 71
  39. 3.1.1 shellcodeexploit 71
  40. 3.1.2 shellcode需要解决的问题 72
  41. 3.2 定位shellcode 73
  42. 3.2.1 栈帧移位与jmp esp 73
  43. 3.2.2 获取“跳板”的地址 76
  44. 3.2.3 使用“跳板”定位的exploit 78
  45. 3.3 缓冲区的组织 81
  46. 3.3.1 缓冲区的组成 81
  47. 3.3.2 抬高栈顶保护shellcode 83
  48. 3.3.3 使用其他跳转指令 83
  49. 3.3.4 不使用跳转指令 84
  50. 3.3.5 函数返回地址移位 85
  51. 3.4 开发通用的shellcode 87
  52. 3.4.1 定位API的原理 87
  53. 3.4.2 shellcode的加载与调试 88
  54. 3.4.3 动态定位API地址的shellcode 89
  55. 3.5 shellcode编码技术 98
  56. 3.5.1 为什么要对shellcode编码 98
  57. 3.5.2 会“变形”的shellcode 99
  58. 3.6 shellcode“减肥” 103
  59. 3.6.1 shellcode瘦身大法 103
  60. 3.6.2 选择恰当的hash算法 105
  61. 3.6.3 191个字节的bindshell 107
  62. 4 MetaSploit开发Exploit 119
  63. 4.1 漏洞测试平台MSF 简介 119
  64. 4.2 入侵Windows系统 121
  65. 4.2.1 漏洞简介 121
  66. 4.2.2 图形界面的漏洞测试 121
  67. 4.2.3 console界面的漏洞测试 125
  68. 4.3 利用MSF制作shellcode 126
  69. 4.4 MSF扫描“跳板” 128
  70. 4.5 Ruby语言简介 129
  71. 4.6 “傻瓜式”Exploit开发 134
  72. 4.7 MSF发布POC 140
  73. 5 堆溢出利用 144
  74. 5.1 堆的工作原理 144
  75. 5.1.1 Windows堆的历史 144
  76. 5.1.2 堆与栈的区别 145
  77. 5.1.3 堆的数据结构与管理策略 146
  78. 5.2 在堆中漫游 151
  79. 5.2.1 堆分配函数之间的调用关系 151
  80. 5.2.2 堆的调试方法 152
  81. 5.2.3 识别堆表 155
  82. 5.2.4 堆块的分配 158
  83. 5.2.5 堆块的释放 159
  84. 5.2.6 堆块的合并 159
  85. 5.2.7 快表的使用 161
  86. 5.3 堆溢出利用(上)——DWORD SHOOT 163
  87. 5.3.1 链表“拆卸”中的问题 163
  88. 5.3.2 在调试中体会“DWORD SHOOT 165
  89. 5.4 堆溢出利用(下)——代码植入 169
  90. 5.4.1 DWORD SHOOT的利用方法 169
  91. 5.4.2 狙击P.E.BRtlEnterCritical-Section()的函数指针 170
  92. 5.4.3 堆溢出利用的注意事项 175
  93. 6 形形色色的内存攻击技术 178
  94. 6.1 狙击Windows异常处理机制 178
  95. 6.1.1 S.E.H概述 178
  96. 6.1.2 在栈溢出中利用S.E.H 180
  97. 6.1.3 在堆溢出中利用S.E.H 184
  98. 6.1.4 深入挖掘Windows异常处理 187
  99. 6.1.5 其他异常处理机制的利用思路 192
  100. 6.2 off by one”的利用 196
  101. 6.3 攻击C++的虚函数 198
  102. 6.4 Heap Spray:堆与栈的协同攻击 201
  103. 7 手机里的缓冲区溢出 204
  104. 7.1 Windows Mobile简介 204
  105. 7.1.1 Windows Mobile前世今生 204
  106. 7.1.2 Windows Mobile架构概述 205
  107. 7.1.3 Windows Mobile的内存管理 209
  108. 7.2 ARM简介 212
  109. 7.2.1 ARM是什么 212
  110. 7.2.2 ARM寄存器结构 212
  111. 7.2.3 ARM汇编指令结构 215
  112. 7.2.4 ARM指令寻址方式 220
  113. 7.2.5 ARM的函数调用与返回 222
  114. 7.3 Windows Mobile上的HelloWorld 223
  115. 7.4 远程调试工具简介 227
  116. 7.4.1 远程信息查看管理套件 227
  117. 7.4.2 手机上的调试——Microsoft Visual Studio 231
  118. 7.4.3 手机上的调试——IDA 233
  119. 7.5 手机上的exploit me 237
  120. 8 其他类型的软件漏洞 243
  121. 8.1 格式化串漏洞 243
  122. 8.1.1 printf中的缺陷 243
  123. 8.1.2 printf读取内存数据 244
  124. 8.1.3 printf向内存写数据 245
  125. 8.1.4 格式化串漏洞的检测与防范 246
  126. 8.2 SQL注入攻击 247
  127. 8.2.1 SQL注入原理 247
  128. 8.2.2 攻击PHP+MySQL网站 248
  129. 8.2.3 攻击ASP+SQL Server网站 250
  130. 8.2.4 注入攻击的检测与防范 252
  131. 8.3 其他注入方式 253
  132. 8.3.1 Cookie注入,绕过马其诺防线 253
  133. 8.3.2 XPath注入,XML的阿喀琉斯之踵 254
  134. 8.4 XSS攻击 255
  135. 8.4.1 脚本能够“跨站”的原因 255
  136. 8.4.2 XSS Reflection攻击场景 256
  137. 8.4.3 Stored XSS攻击场景 258
  138. 8.4.4 攻击案例回顾:XSS蠕虫 258
  139. 8.4.5 XSS的检测与防范 259
  140. 8.5 路径回溯漏洞 260
  141. 8.5.1 路径回溯的基本原理 260
  142. 8.5.2 范式化与路径回溯 261
  143. 2 漏洞利用原理(高级)
  144. 9 Windows安全机制概述 264
  145. 10 栈中的守护天使:GS 267
  146. 10.1 GS安全编译选项的保护原理 267
  147. 10.2 利用未被保护的内存突破GS 271
  148. 10.3 覆盖虚函数突破GS 273
  149. 10.4 攻击异常处理突破GS 276
  150. 10.5 同时替换栈中和.data中的Cookie突破GS 280
  151. 11 亡羊补牢:SafeSEH 284
  152. 11.1 SafeSEH对异常处理的保护原理 284
  153. 11.2 攻击返回地址绕过SafeSEH 288
  154. 11.3 利用虚函数绕过SafeSEH 288
  155. 11.4 从堆中绕过SafeSEH 288
  156. 11.5 利用未启用SafeSEH模块绕过SafeSEH 292
  157. 11.6 利用加载模块之外的地址绕过SafeSEH 299
  158. 11.7 利用Adobe Flash Player ActiveX控件绕过SafeSEH 305
  159. 12 数据与程序的分水岭:DEP 313
  160. 12.1 DEP机制的保护原理 313
  161. 12.2 攻击未启用DEP的程序 316
  162. 12.3 利用Ret2Libc挑战DEP 317
  163. 12.3.1 Ret2Libc实战之利用ZwSetInformationProcess 318
  164. 12.3.2 Ret2Libc实战之利用VirtualProtect 330
  165. 12.3.3 Ret2Libc实战之利用VirtualAlloc 339
  166. 12.4 利用可执行内存挑战DEP 348
  167. 12.5 利用.NET挑战DEP 352
  168. 12.6 利用Java applet挑战DEP 359
  169. 13 在内存中躲猫猫:ASLR 363
  170. 13.1 内存随机化保护机制的原理 363
  171. 13.2 攻击未启用ASLR的模块 367
  172. 13.3 利用部分覆盖进行定位内存地址 372
  173. 13.4 利用Heap spray技术定位内存地址 376
  174. 13.5 利用Java applet heap spray技术定位内存地址 379
  175. 13.6 为.NET控件禁用ASLR 382
  176. 14 S.E.H终极防护:SEHOP 386
  177. 14.1 SEHOP的原理 386
  178. 14.2 攻击返回地址 388
  179. 14.3 攻击虚函数 388
  180. 14.4 利用未启用SEHOP的模块 388
  181. 14.5 伪造S.E.H链表 390
  182. 15 重重保护下的堆 396
  183. 15.1 堆保护机制的原理 396
  184. 15.2 攻击堆中存储的变量 397
  185. 15.3 利用chunk重设大小攻击堆 398
  186. 15.4 利用Lookaside表进行堆溢出 407
  187. 3 漏洞挖掘技术
  188. 16 漏洞挖掘技术简介 414
  189. 16.1 漏洞挖掘概述 414
  190. 16.2 动态测试技术 415
  191. 16.2.1 SPIKE简介 415
  192. 16.2.2 beSTORM简介 421
  193. 16.3 静态代码审计 429
  194. 17 文件类型漏洞挖掘 Smart Fuzz 431
  195. 17.1 Smart Fuzz概述 431
  196. 17.1.1 文件格式Fuzz的基本方法 431
  197. 17.1.2 Blind FuzzSmart Fuzz 432
  198. 17.2 Peach挖掘文件漏洞 433
  199. 17.2.1 Peach介绍及安装 433
  200. 17.2.2 XML介绍 434
  201. 17.2.3 定义简单的 Peach Pit 436
  202. 17.2.4 定义数据之间的依存关系 440
  203. 17.2.5 Peach Fuzz PNG文件 441
  204. 17.3 010脚本,复杂文件解析的瑞士军刀 446
  205. 17.3.1 010 Editor简介 446
  206. 17.3.2 010脚本编写入门 447
  207. 17.3.3 010脚本编写提高——PNG文件解析 449
  208. 17.3.4 深入解析,深入挖掘——PPT文件解析 452
  209. 18 FTP的漏洞挖掘 457
  210. 18.1 FTP协议简介 457
  211. 18.2 漏洞挖掘手记1DOS 457
  212. 18.3 漏洞挖掘手记2:访问权限 466
  213. 18.4 漏洞挖掘手记3:缓冲区溢出 468
  214. 18.5 漏洞挖掘手记4Fuzz DIY 472
  215. 19 E-Mail的漏洞挖掘 477
  216. 19.1 挖掘SMTP漏洞 477
  217. 19.1.1 SMTP协议简介 477
  218. 19.1.2 SMTP漏洞挖掘手记 478
  219. 19.2 挖掘POP3漏洞 480
  220. 19.2.1 POP3协议简介 480
  221. 19.2.2 POP3漏洞挖掘手记 481
  222. 19.3 挖掘IMAP4漏洞 489
  223. 19.3.1 IMAP4协议简介 489
  224. 19.3.2 IMAP4漏洞挖掘手记 490
  225. 19.4 其他E-mail漏洞 491
  226. 19.4.1 URL中的路径回溯 491
  227. 19.4.2 内存中的路径回溯 494
  228. 19.4.3 邮件中的XSS 500
  229. 20 ActiveX控件的漏洞挖掘 502
  230. 20.1 ActiveX控件简介 502
  231. 20.1.1 浏览器与ActiveX控件的关系 502
  232. 20.1.2 控件的属性 503
  233. 20.2 手工测试ActiveX控件 504
  234. 20.2.1 建立测试模板 504
  235. 20.2.2 获取控件的接口信息 505
  236. 20.3 用工具测试ActiveX控件:COMRaider 509
  237. 20.4 挖掘ActiveX漏洞 516
  238. 20.4.1 ActiveX漏洞的分类 516
  239. 20.4.2 漏洞挖掘手记1:超星阅读器溢出 517
  240. 20.4.3 漏洞挖掘手记2:目录操作权限 521
  241. 20.4.4 漏洞挖掘手记3:文件读权限 523
  242. 20.4.5 漏洞挖掘手记3:文件删除权限 525
  243. 4 操作系统内核安全
  244. 21 探索ring0 528
  245. 21.1 内核基础知识介绍 528
  246. 21.1.1 内核概述 528
  247. 21.1.2 驱动编写之Hello World 528
  248. 21.1.3 派遣例程与IRP结构 533
  249. 21.1.4 Ring3打开驱动设备 537
  250. 21.1.5 DeviceIoControl函数与IoControlCode 538
  251. 21.1.6 Ring3/Ring0的四种通信方式 539
  252. 21.2 内核调试入门 541
  253. 21.2.1 创建内核调试环境 541
  254. 21.2.2 蓝屏分析 549
  255. 21.3 内核漏洞概述 551
  256. 21.3.1 内核漏洞的分类 551
  257. 21.3.2 内核漏洞的研究过程 553
  258. 21.4 编写安全的驱动程序 555
  259. 21.4.1 输入输出检查 555
  260. 21.4.2 验证驱动的调用者 556
  261. 21.4.3 白名单机制的挑战 556
  262. 22 内核漏洞利用技术 557
  263. 22.1 利用实验之exploitme.sys 557
  264. 22.2 内核漏洞利用思路 559
  265. 22.3 内核漏洞利用方法 560
  266. 22.4 内核漏洞利用实战与编程 565
  267. 22.5 Ring0 Shellcode的编写 570
  268. 23 FUZZ驱动程序 579
  269. 23.1 内核FUZZ思路 579
  270. 23.2 内核FUZZ工具介绍 581
  271. 23.3 内核FUZZ工具DIY 583
  272. 23.3.1 Fuzz对象、Fuzz策略、Fuzz 583
  273. 23.3.2 IoControl MITM Fuzz 583
  274. 23.3.3 IoControl Driver Fuzz 585
  275. 23.3.4 MyIoControl Fuzzer界面 586
  276. 23.4 内核漏洞挖掘实战 588
  277. 23.4.1 超级巡警ASTDriver.sys本地提权漏洞 588
  278. 23.4.2 东方微点mp110013.sys本地提权漏洞 594
  279. 23.4.3 瑞星HookCont.sys驱动本地拒绝服务漏洞 601
  280. 24 内核漏洞案例分析 605
  281. 24.1 远程拒绝服务内核漏洞 605
  282. 24.2 本地拒绝服务内核漏洞 611
  283. 24.3 缓冲区溢出内核漏洞 614
  284. 24.4 任意地址写任意数据内核漏洞 619
  285. 24.5 任意地址写固定数据内核漏洞 622
  286. 5 漏洞分析案例
  287. 25 漏洞分析技术概述 628
  288. 25.1 漏洞分析的方法 628
  289. 25.2运动中寻求突破:调试技术 629
  290. 25.2.1 断点技巧 630
  291. 25.2.2 回溯思路 644
  292. 25.3 用“白眉”在PE中漫步 647
  293. 25.3.1 指令追踪技术与Paimei 647
  294. 25.3.2 Paimei的安装 648
  295. 25.3.3 使用PE Stalker 649
  296. 25.3.4 迅速定位特定功能对应的代码 652
  297. 25.4 补丁比较 654
  298. 26 RPC入侵:MS06-040 MS08-067 658
  299. 26.1 RPC漏洞 658
  300. 26.1.1 RPC漏洞简介 658
  301. 26.1.2 RPC编程简介 658
  302. 26.2 MS06-040 659
  303. 26.2.1 MS06-040简介 659
  304. 26.2.2 动态调试 660
  305. 26.2.3 静态分析 667
  306. 26.2.4 实现远程exploit 670
  307. 26.3 Windows XP环境下的MS06-040 exploit 677
  308. 26.3.1 静态分析 677
  309. 26.3.2 蠕虫样本的exploit方法 682
  310. 26.3.3 实践跨平台exploit 684
  311. 26.4 MS08-067 690
  312. 26.4.1 MS08-067简介 690
  313. 26.4.2 认识Legacy Folder 693
  314. 26.4.3 “移经”测试 694
  315. 26.4.4 “移经”风险 695
  316. 26.4.5 POC的构造 696
  317. 26.5 魔波、Conficker与蠕虫病毒 703
  318. 27 MS06-055分析:实战Heap Spray 705
  319. 27.1 MS06-055简介 705
  320. 27.1.1 矢量标记语言(VML)简介 705
  321. 27.1.2 0 day安全响应纪实 706
  322. 27.2 漏洞分析 707
  323. 27.3 漏洞利用 710
  324. 28 MS09-032分析:一个“&”引发的血案 713
  325. 28.1 MS09-032简介 713
  326. 28.2 漏洞原理及利用分析 713
  327. 29 Yahoo!Messenger 溢出漏洞 719
  328. 29.1 漏洞介绍 719
  329. 29.2 漏洞分析 719
  330. 29.3 漏洞利用 723
  331. 30 CVE-2009-0927PDF中的JS 725
  332. 30.1 CVE-2009-0927简介 725
  333. 30.2 PDF文档格式简介 725
  334. 30.3 漏洞原理及利用分析 727
  335. 31 坝之蚁穴:超长URL溢出漏洞 731
  336. 31.1 漏洞简介 731
  337. 31.3 漏洞原理及利用分析 731
  338. 32 暴风影音M3U文件解析漏洞 737
  339. 32.1 漏洞简介 737
  340. 32.2 M3U文件简介 737
  341. 32.3 漏洞原理及利用分析 738
  342. 33 LNK快捷方式文件漏洞 744
  343. 33.1 漏洞简介 744
  344. 33.2 漏洞原理及利用分析 744
  345. 附录A 已公布的内核程序漏洞列表 750
  346. 参考文献 753

jas502n/0day-security-software-vulnerability-analysis-technology

资料包中资料仅用于学习目的,任何组织、个人、机构不可以任何形式利用资料包中的资料进行商业盈利目的的活动。 资料包中的部分资料和实验代码有可能引起某些安全软件的报警,书籍作者,出版社,看雪论坛对这些使用这些资料造成的后果概不负责,请您在充分了解这些资料用途的基础上慎用。 任何组织、个人、机构不得利用本书及相关资料进行任何形式的非法活动。

《漏洞战争:软件漏洞分析精要》

系统地讲解软件漏洞分析与利用所需的各类工具、理论技术和实战方法,主要涉及Windows 和Android 系统平台。 《漏洞战争:软件漏洞分析精要》根据不同的软件漏洞类型划分,比如堆栈溢出、沙盒逃逸、类型混淆、UAF、内核漏洞等,同时又针对当前流行的移动安全,加入Android 平台上的漏洞分析与利用。 以精心挑选的经典漏洞为例,以分享漏洞的分析技巧和工具为主,对这些漏洞的成因、利用及修复方法进行详细讲解,旨在”授之以渔”。 《漏洞战争:软件漏洞分析精要》最大的特点是以各种类型的经典漏洞作为实战讲解,摒弃空头理论,几乎是”一本用调试器写出来的书”。

PDF

漏洞战争:软件漏洞分析精要.pdf

基础篇(第1章)

主要介绍一些软件漏洞相关的基本概念,以及常用工具及漏洞分析方法,最后向读者推荐一些相关的学习站点和书籍,方便读者做进一步地学习和交流。

实战篇(第2~11章)

是本书最主要的部分,根据不同的漏洞类型挑选不同的经典案例,用不同的漏洞分析技巧,向读者介绍比较高效的分析方法,剖析各种常见的软件漏洞类型、原理、利用和修复的实战技术。同时,紧跟当前热门的移动互联网安全问题,增加了Android平台的漏洞分析,以保持内容与时俱进。

展望篇(第12章)

对未来的软件漏洞发展趋势做出预判,相信未来的主要战场会更集中在移动终端、云计算平台、物联网三大方向上,并对现有的这些方向的漏洞案例进行简要介绍。

riusksk/vul_war

《漏洞战争:软件漏洞分析精要》配套资料 包括漏洞程序、样本、学习资料等等,由于多次上传目录失败,因此只好上传压缩包。

文章

Migraine殇

Mips架构下漏洞分析入门

Mips架构下二进制漏洞入门笔记,最后调试TP-LINK路由器的一个栈溢出漏洞作为练习。

v8 engine exploit零基础入门

本文将教会读者,如何从一个零基础漏洞新手,学会从chromium的commit中获取diff和poc,最后写出一个v8的exploit。

浏览器漏洞:从数组越界到任意地址读写

暂时不讨论堆利用本身,会分别讨论两个浏览器漏洞,利用漏洞实现了OOB之后,如何在开启ASLR的情况下完成地址泄漏,帮助读者完成Exploit的最后一公里。

一步步学写Windows下的Shellcode

网络上编写shellcode的教程大多是关于Linux的,加之顺带学习PE文件结构,所以打算写一篇关于Windows 下shellcode的编写,为要编写Shellcdoe的读者提供一些参考。

Windows下漏洞利用——S.E.H深入分析

本文将从最基础的SEH覆盖,到SafeSEH保护机制的绕过,再到最后绕过SafeSEH结合DEP等保护机制,对SEH的利用进行由浅入深的的研究。

在PWN题中绕过lea esp以及关于Ret2dl的一些补充

本文会根据做题的调试过程进行解析,介绍其中如何利用lea esp控制栈帧,以及如何调试一个伪造的重定向结构。

高级ROP:Ret2dl_resolve技术详解

一道简单的pwn题引出的一种构造非常复杂ROP技巧—ret2dl_resolve。本文将从原理的角度,解析ELF文件以及其延迟绑定的原理,深入解析这一种技术。

One_gadget和UAF结合利用堆溢出漏洞研究

通过一道简单的ROP题目理解One_gadget的工作原理,之后利用其提供的ROP链实现堆的UAF漏洞。堆溢出作为CTF的pwn一大题型,非常值得研究。

IE漏洞学习笔记(三):CVE-2013-3893漏洞案例分析

该漏洞是的原理是,IE下的mshtml动态连接库将TreeNode对象从Dom树释放后,又重新调用对象的任意代码执行。该漏洞覆盖的IE版本从IE6到IE11,是一个典型的浏览器UAF漏洞,最后使用精准堆喷射完成利用。

IE漏洞学习笔记(二):UAF释放后重用

UAF漏洞全称为use after free,即释放后重用。漏洞产生的原因,在于内存在被释放后,但是指向指针并没有被删除,又被程序调用。比较常见的类型是C++对象,利用UAF修改C++的虚函数表导致的任意代码执行。

IE漏洞学习笔记(一)Heap Spray

HeapSpray这个技术是IE漏洞利用中非常重要的一点,能够绕过很多利用一般技术很难绕过的保护机制(DEP/ASLR),虽然这并不是一种漏洞利用手法,但是这种手法确实值得我们去研究和掌握。

How2Heap堆利用学习笔记(四)

通过前三篇文章的学习,我们了解了堆利用的基本概念和技术。本篇文章,我们将要了解堆利用中的House技术以及与off by one结合后的利用手法。

How2Heap堆利用学习笔记(三):Unsafe_unlink

How2Heap堆利用学习笔记(二)

这次将介绍如何利用malloc中的consolidate机制来实现double free。本文会涉及一些源代码,如有解释错误,恳请各位大神指正。

How2Heap堆利用学习笔记(一)

对Linux下堆利用的学习记录,学习顺序大体是按照shellphish团队的how2heap的流程,尽量每个方面都调试的详尽一些,并结合案例进行分析。