自制反汇编逆向分析工具 迭代第六版本 (五)

本工具从最初版的跳转分布图只为了更直观地分析反汇编代码的分支结构,第三版开始对直观图进行逆向分支代码的输出第四版对分支输出策略的一些探索第五版结合之前的探索进行改进。第六版在现在功能的基础上进行增强,利用第六版(一)的基本功能-直译第六版(二)对条件分支增加条件判断翻译,以及改进在函数调用处附带备选参数参考

第六版(三)将(一)和(二)组合在一起进行逆向代码输出。

第六版(四),在(三)的基础上增加对原子操作指令的逆向以及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

时间: 2024-10-27 20:09:07

自制反汇编逆向分析工具 迭代第六版本 (五)的相关文章

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

本工具从最初版的跳转分布图只为了更直观地分析反汇编代码的分支结构,第三版开始对直观图进行逆向分支代码的输出,第四版对分支输出策略的一些探索,第五版结合之前的探索进行改进.第六版在现在功能的基础上进行增强,利用第六版(一)的基本功能-直译,第六版(二)对条件分支增加条件判断翻译,以及改进在函数调用处附带备选参数参考. 现在将第六版的(一)和(二)组合在一起进行逆向代码输出. 下面选了三个例子 void prepare_commit(CA::Transaction*) { // 0 pushq %r

自制反汇编逆向分析工具 迭代第六版本 (一)

这个版本主要在逆向代码输出上做功夫.首先就是对反汇编代码指令的直译,寻址访问则适配成结构体成员访问或数组访问的方式,使更加直观,效果图如下: 另一图: 接着就是有关SSE指令的直译: 直译中并没有对检测比较和条件跳转进行翻译,因为它们只有在couple成对才有意义(, 一条指令对标志寄存器进行修改,另一条指令根据标志寄存器进行判断).所以检测比较和条件跳转更加适合在带分支结构的逆向代码中翻译,下一篇将介绍.

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

将一个函数的分支跳转逆向生成cpp文件,使逆向分析过程从分支跳转的分析中解放出来,工具首要的作用是应当解放生产力. 下面是效果图: 然后附上上面效果图对应的反汇编源代码和工具逆向生成的cpp文件. 有了这个逆向出来的文件,接下来的逆向工作有点像在做填空,但已经帮大忙. 不能上传附件,贴代码. 某比较大的函数的反汇编代码 QuartzCore`CA::Context::commit_transaction: -> <+0>: pushq %rbp <+1>: movq %rsp

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

上一个版本,本工具支持的第一个逆向策略,(对反汇编的函数体内的分支控制结构逆向生成cpp代码,)一直都可以正常工作,直到遇上了一个函数.这个使我的逆向策略算法失效的函数,主要的特点是它含有众多无条件跳转指令(,都是在函数体内的跳转). 为什么无条件跳转指令会使得我的第一个逆向算法失效,因为这些无条件跳转指令让函数的执行流变得不易于线性理解. 在一个没有反汇编出来的函数汇编代码中,如果无条件跳转指令很少,特殊地连一条无条件跳转指令也没有时,将汇编代码的执行流当作行文阅读,总可以找到一个特例让所有条

自制反汇编逆向分析工具 迭代第五版本 (一)

这个版本添加了几个功能,分开几篇来写. 本篇是关于这样一个功能,显示选定的条件指令与其它条件分支的关系. 它们的关系分别在初版分支形态分布图,和第二版的汇编代码对应图同样展示. 红色表示被选中的目标 蓝色表示被选定的指令的执行位置之前,可能因为条件跳转而直接跳入到被选中的条件分支内(,忽略该条件判断). 绿色表示在被选中的条件分支内,因为其它条件跳转而直接离开目前分支的代码. 紫色表示在被选中的条件分支内,无条件跳转分支并且直接离开目前分支的代码. 浅紫色表示在被选中的条件分支内,无条件跳转分支

Android动态逆向分析工具ZjDroid--脱壳神器

项目地址:https://github.com/BaiduSecurityLabs/ZjDroid 前提条件: 1.Root手机一部 2.须要通过Xposed installer( http://dl.xposed.info/latest.apk)安装Xposed Framework; 一.ZjDroid工具介绍 ZjDroid是基于Xposed Framewrok的动态逆向分析模块,逆向分析者能够通过ZjDroid完毕下面工作:1.DEX文件的内存dump2.基于Dalvik关键指针的内存Ba

自用Android程序破解,逆向分析工具集

下载: git clone https://github.com/zencodex/hack-android.git 本人主要在Mac osx使用,所以linux下没经过严格测试,可能会存在小问题.签名脚本是自己写的,临时文件写到了/tmp 目录下,所以linux下要确定存在/tmp. 如遇到问题,可在github上new issue. romtools可配合厨房工具使用,可用于ROM的定制修改,厨房工具下载: git clone https://github.com/zencodex/Andr

Android--那些值得你试试的 Android 竞品分析工具

那些值得你试试的 Android 竞品分析工具 原创 2016-07-05 Clock Android程序员 声明:本文为 Clock 原创,授权发布在 Android程序员公众号,转载请参考原文协议. 原文:http://www.jianshu.com/p/ba2d9eca47a2#rd 最近一段时间因为琐事(有公有私)太多,加上搬家后,家里断网了一周,虽然有很多东西想写,但却迟迟没有动手.好在目前基本事情都搞完,又可以愉快的写东西了,所以,接下来博客更新的频率将会有所提高.写博客的好处是很多

一文了解安卓APP逆向分析与保护机制

"知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物由学"希望通过一篇篇技术干货.趋势解读.人物思考和沉淀给你带来收获的同时,也希望打开你的眼界,成就不一样的你. 以下为文章正文: 想知道Android App常见的保护方法及其对应的逆向分析方法吗? 网易云易盾资深安全工程师 钟亚平 3月17日,安卓巴士全球开发者论坛在重庆举办,网易资深安全工程师钟