【VC++开源代码栏目提醒】:网学会员鉴于大家对VC++开源代码十分关注,论文会员在此为大家搜集整理了“C++反汇编与逆向分析技术揭秘-文前 - 编程语言”一文,供大家参考学习
C 反汇编与逆向分析 技术揭秘 钱林松 赵海旭 著文前.indd 1 2011-9-16 16:30:51 本书既是一本全面而系统地讲解反汇编与逆向分析技术的安全类专著, 又是一部深刻揭示 C 内 部工作机制的程序设计类著作。
理论与实践并重,理论部分
系统地讲解了 C 的各种语法特性和元素的 逆向分析方法和流程,重在授人以渔 ;实践部分通过几个经典的案例
演示了逆向分析技术的具体实施步 骤和方法。
全书共分为三大部分 :第一部分主要介绍了
VC6.0、OllyDBG 和反汇编静态分析工具的使用,以 及反汇编引擎的工作原理 ;第二部分以 C/C 语法为导向, 以
VC6.0 为例, 深入解析了每个 C/C 知识点的汇编表现形式,包括基本数据类型、表达式、流程控制语句、函数、变量、数组、指针、结构 体、类、构造函数、析构函数、虚函数、继承和多重继承、异常处理等,这部分内容重在修炼“内功” , 不仅讲解了调试和识别各种 C/C 语句的方法,而且还深入剖析了各知识点的底层机制 ; 第三部分是逆 向分析技术的实际应用,通过对 PEiD、 熊猫烧香”病毒、OllyDBG 调试器等的逆向分析将理论和实践 “ 很好地融合在了一起。
本书适合所有软件安全领域的工作者、想了解 C 内部机制的中高级程序员,以及对 Windows 底 层原理感兴趣的技术人员阅读。
封底无防伪标均为盗版
版权所有,侵权必究 本书法律顾问 北京市展达律师事务所 图书在版编目(CIP)数据 C 反汇编与逆向分析技术揭秘 / 钱林松,赵海旭著 .—北京 :机械工业出版社,2011.9 ISBN 978-7-111-35633-2 Ⅰ . C… Ⅱ . ①钱… ②赵… Ⅲ . C 语言 - 程序设计 Ⅳ . TP312 中国版本图书馆 CIP 数据核字(2011)第 162655 号 机械工业出版社(北京市西城区百万庄大街 22 号 邮政编码 100037) 责任编辑 :姜 影 印刷 2011 年 10 月第 1 版第 1 次印刷 186mm×240mm 26.5 印张 标准书号 :ISBN 978-7-111-35633-2 定价 :69.00 元 凡购本书,如有缺页、倒页、脱页,由本社发行部调换 客服热线 : 010)88378991 ; ( 88361066 购书热线 : 010)68326294 ; ( 88379649 ;68995259 投稿热线 : 010)88379604 ( 读者信箱 : hzjsjhzbook.com文前.indd 2 2011-9-16 16:30:52 前 言 为什么写这本书 “时下的 IDE 很多都是极其优秀的,拜其所赐,职场上的程序员多出十几倍,但是又有多 少能理解程序内部的机制呢?” ① —侯捷 随着软件技术的发展及其在各个领域的广泛应用, 对软件进行逆向工程, 然后通过阅读 其反汇编
代码来推断其数据结构、 体系结构和程序设计思路的需求越来越多。
逆向工程技术 能帮助我们很好地研究和学习先进的软件技术, 特别是当我们非常想知道某个软件的某些功 能究竟是如何实现的,而手头又没有合适的资料的时候。
我国的软件产业落后于西方, 甚至在某些方面落后于邻国的印度和日本。
如果我们能够 利用逆向技术去研究国外的一些一流软件的
设计思想和实现方法, 那么我国的软件技术将会 得到极大的提升。
目前, 国内关于逆向分析技术的资料实在是少之又少, 大中专院校的计算 机相关专业对此项技术也尚未有足够的重视。
有很多人认为研究程序的内部原理会破坏 “ 黑盒子 ” 封装性, 但是如果我们只是在别人 搭建好的平台上做开发 , 那么始终只能使用别人提供的各种未
开源的 SDK, 会一直被别人 的技术牵制着 。
如果我们能够充分掌握逆向分析的方法, 就可以洞悉各种 SDK 的实现原理, ① 著名技术专家和IT教育工作者,尤其精通C和MFC,计算机图书作家、译者和书评人。
文前.indd 3 2011-9-16 16:30:52 IV 学习各种一流软件所采用的先进技术 , 取长补短 , 为我所用 。
若能如此, 实为我国软件产业 之幸 。
我当初学习逆向技术时完全靠自学 , 且不说这方面的书籍 , 就连相关的
文档和资料也 都极度匮乏 。
在这种条件下 , 虽然在很努力地钻研 , 但
学习进度却非常缓慢 , 花费几天几 夜完成对一个软件的关键算法的分析是常有的事 。
如果当初有一本全面讲解反汇编与逆向 分析技术的书供参考 , 我当年不仅能节省很多时间和精力 , 而且还能少走很多弯路 。
因为 有这段经历 , 我斗胆争先 , 决定将自己多年来在反汇编与逆向分析技术领域的一些经验和 心得整理出来与大家分享 , 希望更多的开发人员在掌握这些技术后能更好地将其应用到软 件开发的实践中 , 从而提高我国
软件行业的整体水平 。
由于个人能力有限 , 书中的疏漏在 所难免 , 还请各位同行和读者多多批评和指正 。
本书适合的读者 首先,无论大家从事哪个行业,在开始阅读本书之前,都需要具备以下几个方面的基础知识 : 数据结构的基础知识,如栈结构存取元素的特点等。
汇编的基础知识,如寻址方式和指令的使用等。
C/C 语言的基础知识,如指针、虚函数和继承的概念等。
熟悉 Microsoft Visual C 6.0 的常用功能,如观察某变量的地址、单步跟踪等。
具备了上面这些基础知识,就能根据自己的实际需求来学习本书的内容。
如果你是一位软件研发人员,你将通过本书更深入地了解 C 语法的实现机制,对产品 知其然更知其所以然,能够在熟练阅读反汇编
代码后,使调试技术也有质的提升。
如果你是一位反病毒分析或者电子证据司法取证分析人员, 通过逆向恶意软件样本, 可 以进行取证分析处理, 例如, 可以归纳开发者的编写习惯, 推定开发者的编程水平, 甚至可 以进一步判定某病毒样本是否与其他某些病毒为同一作者所为。
如果你是高等院校
计算机相关专业的教师或学生(本科或本科以上) 软件逆向分析技术 , 可以给你带来崭新的职业空间, 使你有足够的技术竞争力面对软件研发行业。
同时, 信息安 全行业也会是你新的求职方向。
本书内容及特色 在本书的内容结构上,笔者结合自己的学习经历和对 C 反汇编与逆向分析技术的了解 进行了较为周详的设计,将全书划分为三个部分。
第一部分 准备工作(第 1 章) 在软件开发过程中,
程序员会使用一些调试工具, 以便高效地找出软件中存在的错误。
文前.indd 4 2011-9-16 16:30:52 V 在逆向分析领域, 分析者也要利用相关的工具来分析软件行为和验证分析结果。
本书第一部 分简单介绍了几款
常用的逆向分析辅助工具和软件。
第二部分 C 反汇编揭秘(第 213 章) 如果要评估一位软件开发者的能力, 一是看设计能力, 二是看调试水平。
一般来说, 大 师级的程序员对软件逆向分析技术的理解都很深入, 他们在编写高级语言
代码的同时, 心里 还会浮现出对应的汇编
代码, 他们在写程序时就已经非常了解最终产品的真正模样, 达到人 机合一的境界, 所以在调试 Bug 的时候游刃有余。
逆向分析技术重在
代码的调试和分析, 如 果你本来就是一个不错的程序员, 学习这部分内容就是对你“ 内功 ” 的锻炼, 这部分内容可 以帮助你彻底掌握 C/C 的各种特性的底层机制,不仅能做到知其然,而且还能知其所以然。
这个部分以 C/C 语法为导向,以
VC 6.0 为例,解析每个 C/C 知识点的汇编表现形式, 通过整理其反汇编
代码来梳理其流程和脉络。
这部分内容重在讲方法,授人以渔,不重剑招, 但重剑意。
如果大家照此“精修” 可达到看反汇编
代码如同看武侠小说的境界。
, 第三部分 逆向分析技术应用(第 1417 章) 这是本书的最后一部分, 以理论与实践相结合的方式, 通过对具体程序的分析来加深 大家对前面所学理论知识的理解, 从而快速积累实战经验。
第 14 章分析了 PE 文件分析工 具 PEiD 的工作原理 ;第 15 章对“ 熊猫烧香 ” 病毒进行了逆向分析 ;第 16 章分析了调试器 OllyDBG 的工作原理 ;第 17 章讲解了反汇编
代码的重建与预编译。
通过对这部分内容的学 习,大家可以通过实际应用领略逆向分析技术的魔力。
如何阅读本书 逆向分析技术具有很强的综合性和实践性, 要掌握这项技术需要耐心和毅力。
建议大家 从最简单的程序入手, 按照本书安排的顺序逐章阅读, 在学习的过程中逐步提高难度, 一边 看书, 一边积极思考和总结。
对于一些理论知识, 如果你兴趣不大, 在初学阶段可以跳过, 待以后需要提高时再回过头来阅读,可以暂时跳过的知识我都在书中做了说明。
随着时间的积累, 你会逐渐形成一套属于自己的分析
代码的风格和习惯。
这样一来, 任 何软件在你眼中都没有了神秘感。
联系作者 本书的讨论和勘误建立在看雪安全论坛(http://
bbs.pediy.com/)的图书项目版块中,我们 会在这里发布本书的勘误和其他对大家有用的增值服务。
大家也可以在这里发表对本书的意 见和建议, 更重要的是, 大家还能在这里结交到一些志同道合的朋友。
同时, 也欢迎大家直文前.indd 5 2011-9-16 16:30:52 VI 接通过 QQ(159262378) 或 E-mail(ollydbgfoxmail.com) 联系我, 由于平时上网较少, 如 果回复不及时,还请谅解。
致谢 在本书写作的过程中, 我得到过很多从事逆向分析技术的同行的指点和帮助, 在此表示 感谢,其中一部分包括段钢、姚辉、彭国军、雷建云、林子深、印豪、单海波、王清、谭文、 邵坚磊、 田阗、 方志强、 岳磊、 余坦兮、 李长坤、 曹剑锐、 胥国银、 胡晓春、 吕明坤、 张慧 等(排名不分先后)还有很多朋友在我写作本书的过程中给予了帮助,这里一并表示感谢。
特别感谢本书的策划编辑杨福川和责任编辑姜影, 他们花费了许多时间和精力来校正本 书中的各类错误。
正是他们的敬业和努力,才使得本书能在保证质量的前提下顺利出版。
钱林松 2011.7 于武汉 文前.indd 6 2011-9-16 16:30:52 目 录 前言 第一部分 准备
工作 第 1 章 熟悉工作环境和相关工具 / 2 1.1 调试工具 Microsoft Visual C 6.0 和 OllyDBG / 2 1.2 反汇编静态分析工具 IDA / 5 1.3 反汇编引擎的工作原理 / 11 1.4 本章小结 / 16 第二部分 C 反汇编揭秘 第 2 章 基本数据类型的表现形式 / 18 2.1 整数类型 / 18 2.1.1 无符号整数 / 18 2.1.2 有符号整数 / 18文前.indd 7 2011-9-16 16:30:53 VIII 2.2 浮点数类型 / 20 2.2.1 浮点数的编码方式 / 21 2.2.2 基本的浮点数指令 / 23 2.3 字符和字符串 / 26 2.3.1 字符的编码 / 27 2.3.2 字符串的存储方式 / 28 2.4 布尔类型 / 29 2.5 地址 、指针和引用 / 29 2.5.1 指针和地址的区别 / 30 2.5.2 各类型指针的工作方式 / 31 2.5.3 引用 / 34 2.6 常量 / 35 2.6.1 常量的定义 / 36 2.6.2 dene 和 const 的区别 / 37 2.7 本章小结 / 38 第 3 章 认识启动函数, 找到用户入口 / 40 3.1 程序的真正入口 / 40 3.2 了解
VC 6.0 的启动函数 / 40 3.3 main 函数的识别 / 44 3.4 本章小结 / 46 第 4 章 观察各种表达式的求值过程 / 47 4.1 算术运算和赋值 / 47 4.1.1 各种算术运算的工作形式 / 47 4.1.2 算术结果溢出 / 82 4.1.3 自增和自减 / 83 4.2 关系运算和逻辑运算 / 85 4.2.1 关系运算和条件跳转的对应 / 85 4.2.2 表达式短路 / 86 4.2.3 条件表达式 / 88 4.3 位运算 / 92 4.4 编译器使用的优化技巧 / 94文前.indd 8 2011-9-16 16:30:53 IX 4.4.1 流水线优化规则 / 97 4.4.2 分支优化规则 / 101 4.4.3 高速缓存(cache)优化规则 / 101 4.5 一次算法逆向之旅 / 102 4.6 本章小结 / 109 第 5 章 流程控制语句的识别 / 110 5.1 if 语句 / 110 5.2 if…else …语句 / 112 5.3 用 if 构成的多分支流程 / 115 5.4 switch 的真相 / 119 5.5 难以构成跳转表的 switch / 128 5.6 降低判定树的高度 / 133 5.7 do/while/for 的比较 / 137 5.8 编译器对循环结构的优化 / 143 5.9 本章小结 / 148 第 6 章 函数的工作原理 / 149 6.1 栈帧的形成和关闭 / 149 6.2 各种调用方式的考察 / 152 6.3 使用 ebp 或 esp 寻址 / 155 6.4 函数的参数 / 158 6.5 函数的返回值 / 160 6.6 回顾 / 163 6.7 本章小结 / 165 第 7 章 变量在内存中的位置和访问方式 / 166 7.1 全局变量和局部变量的区别 / 166 7.2 局部静态变量的工作方式 / 169 7.3 堆变量 / 173 7.4 本章小结 / 177文前.indd 9 2011-9-16 16:30:53 X 第 8 章 数组和指针的寻址 / 178 8.1 数组在函数内 / 178 8.2 数组作为参数 / 181 8.3 数组作为返回值 / 185 8.4 下标寻址和指针寻址 / 189 8.5 多维数组 / 193 8.6 存放指针类型数据的数组 / 199 8.7 指向数组的指针变量 / 201 8.8 函数指针 / 204 8.9 本章小结 / 206 第 9 章 结构体和类 / 207 9.1 对象的内存布局 / 207 9.2 this 指针 / 212 9.3 静态数据成员 / 217 9.4 对象作为函数参数 / 220 9.5 对象作为返回值 / 227 9.6 本章小结 / 232 第 10 章 关于构造函数和析构函数 / 233 10.1 构造函数的出现时机 / 233 10.2 每个对象都有默认的构造函数吗 / 243 10.3 析构函数的出现时机 / 245 10.4 本章小结 / 254 第 11 章 关于虚函数 / 256 11.1 虚函数的机制 / 256 11.2 虚函数的识别 / 261 11.3 本章小结 / 268文前.indd 10 2011-9-16 16:30:53 XI 第 12 章 从内存角度看继承和多重继承 / 269 12.1 识别类和类之间的关系 / 270 12.2 多重继承 / 292 12.3 虚基类 / 298 12.4 菱形继承 / 299 12.5 本章小结 / 307 第 13 章 异常处理 / 30.