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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++反汇编与逆向分析技术揭秘的目录相关的知识,希望对你有一定的参考价值。

参考技术A

前言
第一部分 准备工作
第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++函数的逆向。

本篇是(五),对待c风格的函数符号调用的翻译,通过导入c风格符号的函数原型来参考分析。

上一篇在介绍对待 c++风格的函数符号调用的情况,提到了c风格的函数符号没有太多的原型信息可供参考,但是它唯一不被重载,参数约定使用标准的约定,所以用古老(老土)的办法就好了。就是导入c风格符号的函数原型(主要是符号名和参数序列)。

有外部的是参考信息,就可以对函数调用配用相应的寄存器和存储单元。我并不想让机器去试图臆意猜测一个不知道原型的函数参数序列,因为过犹不及,而且不严谨,机器猜测误导坑更加大。试想一下,一个c风格的函数,你可以单从函数被调用前的准备参数的工作流就能分辨出是foo(double, int)还是foo(int, double)吗?我是不能做到这种超人的程序了,我必须要通过外部信息来指导机器进行分析工作。

下面贴上机器逆向出来的代码:

CA::Transaction::add_root
{
    // 0 pushq %rbp
    // 1    rbp = rsp;
    // 4 pushq %r14
    // 6 pushq %rbx
    // 7    rbx = rsi;
    // 10    r14 = rdi;
    // 13    rdi = & CA::Transaction::roots_lock;
    // 20 call
    OSSpinLockLock(CA::Transaction::roots_lock);
    // 25    rdi = CA::Transaction::roots;
    // 32 testq %rdi, %rdi
    // 35
    if (!) { // 32 (0 != rdi)
             // 37    edi = 0;
             // 39    esi = 0;
             // 41    edx = 0;
             // 43    ecx = 0;
             // 45    r8d = 0;
             // 48    r9d = 0;
             // 51 call
        x_hash_table_new_(0, 0, 0, 0, 0, 0);
        // 56    rdi = rax;
        // 59     CA::Transaction::roots = rdi;
    } // 66
      // 66    rsi = rbx;
      // 69    rdx = rbx;
      // 72 call
    x_hash_table_insert((x_hash_table*)rax, (uintptr_t)esi, (uintptr_t)edx);
    // 77 testb %al, %al
    // 79
    if (!) { // 77 (0 == al)
             // 81 lock
             // 82    OSAtomicIncrement32((volatile int32_t*)&rbx->_0);
             // 84 testb $0x10, 0x84(%r14)
             // 92
        if (!) { // 84 (0 == (0x10 & r14->_84))
                 // 94    rax = (int64_t)(int32_t&)r14->_8;
                 // 98 testq %rax, %rax
                 // 101
            if () { // 98 (0 > rax)
                    // gen jmp 113
                goto _f113;
                // 103 cmpl $0x0, 0xa8(%rbx,%rax,4)
            } // 111
            else if () { // 103 ((int32_t&)((uint32_t*)&rbx->_a8)[rax] != 0x0)
                         // gen jmp 124
                goto _f124;
            }
            else { // 111 next
            _f113:     // from 101
            } // 113
              // 113    rdi = rbx;
              // 116    rsi = r14;
              // 119 call
            ((CA::Layer*)rbx)->thread_flags_((CA::Transaction*)r14);
        _f124:     // from 111
        } // 124
    } // 124
      // 124    rdi = & CA::Transaction::roots_lock;
      // 131 popq %rbx
      // 132 popq %r14
      // 134 popq %rbp
      // 135 ret
    return;    // jmp 0x1041ecb2a; symbol stub for: OSSpinLockUnlock
        // 140    rbx = rax;
        // 143    rdi = & CA::Transaction::roots_lock;
        // 150 call
    OSSpinLockUnlock(CA::Transaction::roots_lock);
    // 155    rdi = rbx;
    // 158 call
    _Unwind_Resume;
    // 163 nop


/*****
* global variables
*
*/

// 13 extern ent_off__0x5146c;    leaq 0x51458(%rip), %rdi;     CA::Transaction::roots_lock
// 25 extern ent_off__0x51464;    movq 0x51444(%rip), %rdi;     CA::Transaction::roots
// 59 extern ent_off__0x51464;    movq %rdi, 0x51422(%rip);     CA::Transaction::roots
// 124 extern ent_off__0x5146c;    leaq 0x513e9(%rip), %rdi;     CA::Transaction::roots_lock
// 143 extern ent_off__0x5146c;    leaq 0x513d6(%rip), %rdi;     CA::Transaction::roots_lock
}
CA::Transaction::add_root

 

CA::Transaction::run_deferred_visibility_layer_calls
{
    // 0 pushq %rbp
    // 1    rbp = rsp;
    // 4 pushq %r15
    // 6 pushq %r14
    // 8 pushq %rbx
    // 9 pushq %rax
    // 10    r14 = rdi;
    // 13    rbx = r14->_78;
    // 17 testq %rbx, %rbx
    // 20
    if (!) { // 17 (0 == rbx)
    _b22:     // from 81
             // 22    r15 = rbx->_0;
             // 25 testq %r15, %r15
             // 28
        if (!) { // 25 (0 == r15)
                 // 30    rdi = r15;
                 // 33 call
            ((CA::Layer*)r15)->call_did_become_visible();
            // 38    eax = 0xffffffff;
            // 43 lock
            // 44    OSAtomicAdd32(eax, (volatile int32_t*)&r15->_0);
            // 48 cmpl $0x1, %eax
            // 51
            if (!) { // 48 (eax != 0x1)
                     // 53    rdi = r15;
                     // 56 call
                ((CA::Layer*)r15)->~Layer();
                // 61    edi = 0xb;
                // 66    rsi = r15;
                // 69 call
                x_mem_dealloc_bucket(0xb, (void*)r15);
            } // 74
        } // 74
          // 74    rbx = rbx->_8;
          // 78 testq %rbx, %rbx
          // 81
        if () // 78 (0 != rbx)
            goto _b22;
        // 83    rdi = r14->_78;
        // 87 call
        x_list_free((x_list*)r14->_78);
        // 92    r14->_78 = 0x0;
    } // 100
      // 100    rsp = rsp + 0x8;
      // 104 popq %rbx
      // 105 popq %r14
      // 107 popq %r15
      // 109 popq %rbp
      // 110 ret
return;
// 111 nop
}
CA::Transaction::run_deferred_visibility_layer_calls

 

以上是关于C++反汇编与逆向分析技术揭秘的目录的主要内容,如果未能解决你的问题,请参考以下文章

C++反汇编与逆向分析-读书笔记

我想学C++和逆向工程

自制反汇编逆向分析工具 迭代第三版本

逆向-除法优化上

逆向与反汇编实战--PEiD分析复现

自制反汇编逆向分析工具 迭代第四版本