`
hzbook
  • 浏览: 260265 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++反汇编与逆向分析技术揭秘

 
阅读更多


《C++反汇编与逆向分析技术揭秘》前言

为什么写这本书

“时下的IDE很多都是极其优秀的,拜其所赐,职场上的程序员多出十几倍,但是又有多少能理解程序内部的机制呢?”——侯捷

随着软件技术的发展及其在各个领域的广泛应用,对软件进行逆向工程,然后通过阅读其反汇编代码来推断其数据结构、体系结构和程序设计思路的需求越来越多。逆向工程技术能帮助我们很好地研究和学习先进的软件技术,特别是当我们非常想知道某个软件的某些功能究竟是如何实现的,而手头又没有合适的资料的时候。

我国的软件产业落后于西方,甚至在某些方面落后于邻国的印度和日本。如果我们能够利用逆向技术去研究国外的一些一流软件的设计思想和实现方法,那么我国的软件技术将会得到极大的提升。目前,国内关于逆向分析技术的资料实在是少之又少,大中专院校的计算机相关专业对此项技术也尚未有足够的重视。

有很多人认为研究程序的内部原理会破坏“黑盒子”封装性,但是如果我们只是在别人搭建好的平台上做开发,那么始终只能使用别人提供的各种未开源的SDK,会一直被别人的技术牵制着。如果我们能够充分掌握逆向分析的方法,就可以洞悉各种SDK的实现原理,学习各种一流软件所采用的先进技术,取长补短,为我所用。若能如此,实为我国软件产业之幸。

我当初学习逆向技术时完全靠自学,且不说这方面的书籍,就连相关的文档和资料也都极度匮乏。在这种条件下,虽然在很努力地钻研,但学习进度却非常缓慢,花费几天几夜完成对一个软件的关键算法的分析是常有的事。如果当初有一本全面讲解反汇编与逆向分析技术的书供参考,我当年不仅能节省很多时间和精力,而且还能少走很多弯路。因为有这段经历,我斗胆争先,决定将自己多年来在反汇编与逆向分析技术领域的一些经验和心得整理出来与大家分享,希望更多的开发人员在掌握这些技术后能更好地将其应用到软件开发的实践中,从而提高我国软件行业的整体水平。由于个人能力有限,书中的疏漏在所难免,还请各位同行和读者多多批评和指正。

本书适合的读者

首先,无论大家从事哪个行业,在开始阅读本书之前,都需要具备以下几个方面的基础知识:

  • 数据结构的基础知识,如栈结构存取元素的特点等。
  • 汇编的基础知识,如寻址方式和指令的使用等。
  • C/C++语言的基础知识,如指针、虚函数和继承的概念等。
  • 熟悉Microsoft Visual C++ 6.0的常用功能,如观察某变量的地址、单步跟踪等。

具备了上面这些基础知识,就能根据自己的实际需求来学习本书的内容。

如果你是一位软件研发人员,你将通过本书更深入地了解C++语法的实现机制,对产品知其然更知其所以然,能够在熟练阅读反汇编代码后,使调试技术也有质的提升。

如果你是一位反病毒分析或者电子证据司法取证分析人员,通过逆向恶意软件样本,可以进行取证分析处理,例如,可以归纳开发者的编写习惯,推定开发者的编程水平,甚至可以进一步判定某病毒样本是否与其他某些病毒为同一作者所为。

如果你是高等院校计算机相关专业的教师或学生(本科或本科以上),软件逆向分析技术可以给你带来崭新的职业空间,使你有足够的技术竞争力面对软件研发行业。同时,信息安全行业也会是你新的求职方向。

本书内容及特色

在本书的内容结构上,笔者结合自己的学习经历和对C++反汇编与逆向分析技术的了解进行了较为周详的设计,将全书划分为三个部分。

第一部分 准备工作(第1章)

在软件开发过程中,程序员会使用一些调试工具,以便高效地找出软件中存在的错误。在逆向分析领域,分析者也要利用相关的工具来分析软件行为和验证分析结果。本书第一部分简单介绍了几款常用的逆向分析辅助工具和软件。

第二部分 C++反汇编揭秘(第2~13章)

如果要评估一位软件开发者的能力,一是看设计能力,二是看调试水平。一般来说,大师级的程序员对软件逆向分析技术的理解都很深入,他们在编写高级语言代码的同时,心里还会浮现出对应的汇编代码,他们在写程序时就已经非常了解最终产品的真正模样,达到人机合一的境界,所以在调试Bug的时候游刃有余。逆向分析技术重在代码的调试和分析,如果你本来就是一个不错的程序员,学习这部分内容就是对你“内功”的锻炼,这部分内容可以帮助你彻底掌握C/C++的各种特性的底层机制,不仅能做到知其然,而且还能知其所以然。这个部分以C/C++语法为导向,以VC++ 6.0为例,解析每个C/C++知识点的汇编表现形式,通过整理其反汇编代码来梳理其流程和脉络。这部分内容重在讲方法,授人以渔,不重剑招,但重剑意。如果大家照此“精修”,可达到看反汇编代码如同看武侠小说的境界。

第三部分 逆向分析技术应用(第14~17章)

这是本书的最后一部分,以理论与实践相结合的方式,通过对具体程序的分析来加深大家对前面所学理论知识的理解,从而快速积累实战经验。第14章分析了PE文件分析工具PEiD的工作原理;第15章对“熊猫烧香”病毒进行了逆向分析;第16章分析了调试器OllyDBG的工作原理;第17章讲解了反汇编代码的重建与预编译。通过对这部分内容的学习,大家可以通过实际应用领略逆向分析技术的魔力。

如何阅读本书

逆向分析技术具有很强的综合性和实践性,要掌握这项技术需要耐心和毅力。建议大家从最简单的程序入手,按照本书安排的顺序逐章阅读,在学习的过程中逐步提高难度,一边看书,一边积极思考和总结。对于一些理论知识,如果你兴趣不大,在初学阶段可以跳过,待以后需要提高时再回过头来阅读,可以暂时跳过的知识我都在书中做了说明。

随着时间的积累,你会逐渐形成一套属于自己的分析代码的风格和习惯。这样一来,任何软件在你眼中都没有了神秘感。

联系作者

本书的讨论和勘误建立在看雪安全论坛(http://bbs.pediy.com/)的图书项目版块中,我们会在这里发布本书的勘误和其他对大家有用的增值服务。大家也可以在这里发表对本书的意见和建议,更重要的是,大家还能在这里结交到一些志同道合的朋友。同时,也欢迎大家直接通过QQ(159262378)或E-mail(ollydbg@foxmail.com)联系我,由于平时上网较少,如果回复不及时,还请谅解。

致谢

在本书写作的过程中,我得到过很多从事逆向分析技术的同行的指点和帮助,在此表示感谢,其中一部分包括段钢、姚辉、彭国军、雷建云、林子深、印豪、单海波、王清、谭文、邵坚磊、田阗、方志强、岳磊、余坦兮、李长坤、曹剑锐、胥国银、胡晓春、吕明坤、张慧等(排名不分先后)还有很多朋友在我写作本书的过程中给予了帮助,这里一并表示感谢。

特别感谢本书的策划编辑杨福川和责任编辑姜影,他们花费了许多时间和精力来校正本书中的各类错误。正是他们的敬业和努力,才使得本书能在保证质量的前提下顺利出版。

钱林松

2011.7于武汉

【作者简介】
钱林松,资深安全技术专家、软件开发工程师和架构师,从事计算机安全和软件开发工作12年,实践经验极其丰富。尤其精通软件逆向分析技术,对C/C++技术和Windows的底层机制也有非常深入的研究。武汉科锐软件技术有限公司创始人,教学经验丰富,多年来,为国内计算机安全领域培养和输送了大量的人才。活跃于看雪论坛,有较高的知名度和影响力。

【目录】
前言
第一部分 准备工作
第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
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 #define和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
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
第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 对象作为函数参数 / 219
9.5 对象作为返回值 / 226
9.6 本章小结 / 231
第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
第12章 从内存角度看继承和多重继承 / 269
12.1 识别类和类之间的关系 / 270
12.2 多重继承 / 292
12.3 虚基类 / 298
12.4 菱形继承 / 299
12.5 本章小结 / 307
第13章 异常处理 / 308
13.1 异常处理的相关知识 / 308
13.2 异常类型为基本数据类型的处理流程 / 314
13.3 异常类型为对象的处理流程 / 323
13.4 识别异常处理 / 329
13.5 本章小结 / 341
第三部分 逆向分析技术应用
第14章 PEiD的工作原理分析 / 344
14.1 开发环境的识别 / 344
14.2 开发环境的伪造 / 353
14.3 本章小结 / 356
第15章 “熊猫烧香”病毒逆向分析 / 357
15.1 调试环境配置 / 357
15.2 病毒程序初步分析 / 358
15.3 “熊猫烧香”的启动过程分析 / 360
15.4 “熊猫烧香”的自我保护分析 / 366
15.5 “熊猫烧香”的感染过程分析 / 369
15.6 本章小结 / 379
第16章 调试器OllyDBG的工作原理分析 / 380
16.1 INT3断点 / 380
16.2 内存断点 / 385
16.3 硬件断点 / 390
16.4 异常处理机制 / 396
16.5 加载调试程序 / 402
16.6 本章小结 / 406
第17章 反汇编代码的重建与编译 / 407
17.1 重建反汇编代码 / 407
17.2 编译重建后的反汇编代码 / 410
17.3 本章小结 / 411
参考文献 / 412
分享到:
评论

相关推荐

    C++反汇编与逆向分析技术揭秘源码.zip

    优质项目,资源经过严格测试可直接运行成功且功能...1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。积分/付费仅作为资源整理辛苦费用。

    c++反汇编教程!经典!

    c++反汇编中文教程,国外大牛非常经典之作,教你如何用IDA逆向C++。

    c++反汇编 内存结构

    c++反汇编 c++反汇编的好教程c++反汇编 c++反汇编的好教程c++反汇编 c++反汇编的好教程

    C++逆向学习

    C++逆向学习比较好的入门资料 版权归作者所有

    C++反汇编视频教程(代码+课件+视频全套价值300元的付费教程)

    这是一套基础课程,着重讲解反汇编代码与 C/C++ 语法的对应关系,抓住最核心的知识点。 学员对象 课程面向的学员需要具备 C++ 基础知识,汇编语言则不必很熟练,了解一些常用指令即可。如果您想从事逆向工程和软件...

    逆向C++编程,反汇编技术

    ### 逆向C++编程与反汇编技术详解 #### I. 引言与必要性 随着技术的发展,越来越多的应用程序和恶意软件采用C++语言编写。因此,掌握C++程序的逆向工程技术变得尤为重要。逆向工程师们长期以来依赖汇编语言和C语言...

    逆向C++ (Reverse C++)[中文版]

    这些年来,逆向工程分析人员一直是凭借着汇编和C 的知识对大多数软件进行逆向工程的,但是,现在随着越来越多的应用程序和恶意软件转而使用C++语言进行开发,深入理解C++面向对象方式开发的软件的反汇编技术就显得...

    Visual C++开源反汇编引擎

    Visual C++开源反汇编引擎 供会VC++及反汇编的同学研究!

    IDA逆向与反汇编教程

    IDA(Interactive Disassembler Pro)是一款强大的反汇编器和逆向工程工具,广泛用于软件安全分析、漏洞挖掘以及程序理解。本教程旨在系统地介绍IDA的使用技巧和逆向工程的基本概念。以下是对每个压缩包子文件内容的...

    C++写的反汇编引擎源码

    在IT领域,反汇编引擎是一种至关重要的工具,它能够将机器语言代码转换回可读的汇编语言,这对于软件分析、逆向工程以及漏洞研究等工作具有重要意义。本主题聚焦于一个由C++编写的高级反汇编引擎源码,其性能与商业...

    优秀游戏程序员学习资料推荐

    此外,针对游戏程序员的专业资料还包括一些辅助性的书籍和网站,比如推荐的《汇编语言》、《C++反汇编与逆向分析技术揭秘》、《操作系统概念》(《Operating System Concepts》)、《自己动手写操作系统》、《数据...

    ARM反汇编器C++源代码 值得一看

    2. **二进制分析**: 反汇编器首先需要读取二进制文件,理解其结构,如头信息、节区、重定位信息等。这需要对ELF(Executable and Linkable Format)或PE(Portable Executable)等文件格式有深入理解。 3. **指令...

    c++反汇编资料

    c++反汇编书与代码,非常有用的一本书,可以参考。

    反汇编引擎ade

    在软件开发、逆向工程、漏洞分析以及恶意软件研究等场景中,反汇编引擎扮演着至关重要的角色。本文将深入探讨反汇编引擎的概念、工作原理以及其在实际应用中的重要性。 首先,我们需要理解什么是反汇编。反汇编是将...

    MCU反汇编工具.rar

    反汇编工具是嵌入式开发领域中的重要辅助软件,主要用于将机器语言代码转换为人类可读的汇编语言,这对于程序调试、逆向工程和软件分析具有重大价值。本文将以"MCU反汇编工具"为例,探讨其在STM32、51、ZVR、PIC和...

    2.逆向与反汇编工具.rar

    2.逆向与反汇编工具---------第2课 A.分类工具 B.摘要工具 C.深度检测工具 ndisasm distorm 第二部分 IDA的基本用法 1.IDA入门-------第3课 A.启动IDA B.IDA桌面简介 C.IDA的一些提示与技巧 1.IDA数据显示...

    51反汇编软件

    《51反汇编软件:揭秘单片机程序的秘密》 在计算机科学的世界里,"51反汇编软件"是一把重要的钥匙,它解锁了单片机程序的内部运作机制,为那些致力于开发和调试单片机系统的工程师们提供了宝贵的工具。反汇编,...

    反汇编引擎

    1. 软件逆向工程:当需要理解已编译程序的工作原理时,如调试、安全分析或代码优化,反汇编器能够帮助开发者查看底层机器指令。 2. 安全研究:在网络安全中,反汇编引擎用于分析恶意软件的行为,找出潜在的漏洞和...

    MIPS反汇编器(修正版)

    如果它是源代码,我们可以期待看到用C++、Python、Java或其他编程语言实现的MIPS反汇编算法。源代码可能会包含解析二进制流的函数,识别和转换指令的逻辑,以及生成汇编代码的输出模块。如果是执行文件,它应该能...

    STM8S反汇编器

    反汇编器在软件开发中扮演着重要角色,尤其是在调试、逆向工程和优化代码时。 STM8S反汇编器的工作原理是解析STM8的二进制程序,并将其翻译成等效的汇编指令。汇编语言是一种低级编程语言,与机器语言紧密相关,每...

Global site tag (gtag.js) - Google Analytics