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

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

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

下面选了三个例子

void prepare_commit(CA::Transaction*)
{
    // 0 pushq %rbp
    // 1    rbp = rsp;
    // 4 pushq %r15
    // 6 pushq %r14
    // 8 pushq %r13
    // 10 pushq %r12
    // 12 pushq %rbx
    // 13    rsp = rsp - 0x1058;
    // 20    r15 = rsi;
    // 23    _1078 = r15;
    // 30    r14 = rdi;
    // 33    rax = (void *)0x00000001066f9070: __stack_chk_guard;
    // 40    rax = rax->_0;
    // 43    _30 = rax;
    // 47    rsi = &_1030;
    // 54    edi = 0x400;
    // 59    edx = 0x1000;
    // 64 call
    // %edx = 0x1000
    // %edi = 0x400
    // %rsi = &_1030
    x_heap_new_with_ptr;
    // 69    rbx = rax;
    // 72    _1080 = rbx;
    // 79    rdi = r15;
    // 82 call
    // %rdi = r15
    CA::Transaction::lock();
    // 87    xmm0 = 0.; ;
    // 90    ((float*)&_1070)[0] = xmm0.ps[0]; ((float*)&_1070)[1] = xmm0.ps[1]; ((float*)&_1070)[2] = xmm0.ps[2]; ((float*)&_1070)[3] = xmm0.ps[3]; ;
    // 97    _1060 = 0x0;
    // 108    _1058 = r15;
    // 115    _1050 = rbx;
    // 122    _1048 = 0x2;
    // 132    _1044 = 0x4;
    // 142    _1040 = 0x0;
    // 152    rsi = &_1070;
    // 159    rdi = r14;
    // 162 call
    // %rdi = r14
    // %rsi = &_1070
    CA::Layer::collect_layers_(CA::Layer::CollectLayersData*);
    // 167    rbx = _1070;
    // 174    rdi = r15;
    // 177 call
    // %rdi = r15
    CA::Transaction::unlock();
    // 182
    goto _f188;
_b184:     // from 403
_b184:     // from 386
         // 184    rbx = rbx->_8;
_f188:     // from 182
         // 188 testq %rbx, %rbx
         // 191
    if (!) { // 188 (0 == rbx)
             // 197    r12 = rbx->_0;
             // 200    r14 = r12->_10;
             // 205 testq %r14, %r14
             // 208
        if (!) { // 205 (0 == r14)
                 // 214    rdi = r15;
                 // 217 call
                 // %rdi = r15
            CA::Transaction::lock();
            // 222    rdi = r14;
            // 225    rsi = "contents";
            // 232 call
            // %rsi = "contents"
            // %rdi = r14
            objc_msgSend;
            // 238    r13 = rax;
            // 241 testq %r13, %r13
            // 244
            if () { // 241 (0 == r13)
                    // gen jmp 336
                goto _f336;
                // 246    rdi = r13;
                // 249 call
                // %rdi = r13
                CFRetain;
                // 254    rdi = r15;
                // 257 call
                // %rdi = r15
                CA::Transaction::unlock();
                // 262    rdi = r13;
                // 265 call
                // %rdi = r13
                CFGetTypeID;
                // 270    r15 = rax;
                // 273 call
                CGImageGetTypeID;
                // 278 cmpq %rax, %r15
            } // 281
            else if () { // 278 (r15 != rax)
                         // gen jmp 346
                goto _f346;
            }
            else { // 281 next
                   // 283    rdi = r14;
                   // 286    rsi = "_renderImageCopyFlags";
                   // 293 call
                   // %rsi = "_renderImageCopyFlags"
                   // %rdi = r14
                objc_msgSend;
                // 299    r14d = eax;
                // 302    r15 = _1078;
                // 309    rdi = r15;
                // 312 call
                // %rdi = r15
                CA::Context::current_colorspace(CA::Transaction*);
                // 317    xmm0 = 0.; ;
                // 320    rdi = r13;
                // 323    rsi = rax;
                // 326    edx = r14d;
                // 329 call
                // %edx = r14d
                // %rsi = rax
                // %rdi = r13
                // %xmm0 = 0.;
                CA::Render::prepare_image(CGImage*, CGColorSpace*, unsigned int, double);
                // 334
                goto _f369;
            _f336:     // from 244
            } // 336
              // 336    rdi = r15;
              // 339 call
              // %rdi = r15
            CA::Transaction::unlock();
            // 344
            goto _f377;
        _f346:     // from 281
                 // 346    rdi = r13;
                 // 349    rsi = "CA_prepareRenderValue";
                 // 356 call
                 // %rsi = "CA_prepareRenderValue"
                 // %rdi = r13
            objc_msgSend;
            // 362    r15 = _1078;
        _f369:     // from 334
                 // 369    rdi = r13;
                 // 372 call
                 // %rdi = r13
            CFRelease;
        _f377:     // from 344
        } // 377
          // 377 cmpq $0x0, 0x98(%r12)
          // 386
        if () // 377 (r12->_98 == 0x0)
            goto _b184;
        // 392    rdi = r12;
        // 395    rsi = r15;
        // 398 call
        // %rsi = r15
        // %rdi = r12
        CA::Layer::prepare_animations(CA::Transaction*);
        // 403
        goto _b184;
    } // 408
      // 408    rdi = _1080;
      // 415 call
      // %rdi = _1080
    x_heap_free;
    // 420    rax = (void *)0x00000001066f9070: __stack_chk_guard;
    // 427    rax = rax->_0;
    // 430 cmpq -0x30(%rbp), %rax
    // 434
    if () // 430 (rax != _30)
        goto _f475;
    // 436    rsp = rsp + 0x1058;
    // 443 popq %rbx
    // 444 popq %r12
    // 446 popq %r13
    // 448 popq %r14
    // 450 popq %r15
    // 452 popq %rbp
    // 453 ret
    return;
_b454:     // from 473
         // 454    r14 = rax;
         // 457    rdi = r15;
         // 460 call
         // %rdi = r15
    CA::Transaction::unlock();
    // 465    rdi = r14;
    // 468 call
    // %rdi = r14
    _Unwind_Resume;
    // 473
    goto _b454;
_f475:     // from 434
             // 475 call
    __stack_chk_fail;
}

void CA::Layer::prepare_commit(CA::Transaction*)

State* CA::Layer::writable_state(CA::Transaction*)
{
    // 0 pushq %rbp
    // 1    rbp = rsp;
    // 4 pushq %r15
    // 6 pushq %r14
    // 8 pushq %rbx
    // 9 pushq %rax
    // 10    r14 = rsi;
    // 13    rbx = rdi;
    // 16 cmpq $0x0, 0x90(%rbx)
    // 24
    if (!) { // 16 (rbx->_90 != 0x0)
             // 30 testb $0x40, 0x85(%rbx)
             // 37
        if (!) { // 30 (0 == ((0x40<<8) & rbx->_84))
                 // 39    rdi = rbx;
                 // 42    rsi = r14;
                 // 45 call
                 // %rsi = r14
                 // %rdi = rbx
            CA::Layer::fetch_geometry(CA::Transaction*);
        } // 50
          // 50    edi = 0x6;
          // 55 call
          // %edi = 0x6
        x_mem_alloc_bucket;
        // 60    r15 = rax;
        // 63    r15->_0 = 0x1;
        // 70    eax = rbx->_2c;
        // 73    r15->_4 = eax;
        // 77    rax = rbx->_30;
        // 81    rcx = rbx->_38;
        // 85    r15->_10 = rcx;
        // 89    r15->_8 = rax;
        // 93    xmm0.ps[0] = ((float*)&rbx->_40)[0]; xmm0.ps[1] = ((float*)&rbx->_40)[1]; xmm0.ps[2] = ((float*)&rbx->_40)[2]; xmm0.ps[3] = ((float*)&rbx->_40)[3]; ;
        // 97    ((float*)&r15->_18)[0] = xmm0.ps[0]; ((float*)&r15->_18)[1] = xmm0.ps[1]; ((float*)&r15->_18)[2] = xmm0.ps[2]; ((float*)&r15->_18)[3] = xmm0.ps[3]; ;
        // 102    xmm0.ps[0] = ((float*)&rbx->_50)[0]; xmm0.ps[1] = ((float*)&rbx->_50)[1]; xmm0.ps[2] = ((float*)&rbx->_50)[2]; xmm0.ps[3] = ((float*)&rbx->_50)[3]; ;
        // 106    ((float*)&r15->_28)[0] = xmm0.ps[0]; ((float*)&r15->_28)[1] = xmm0.ps[1]; ((float*)&r15->_28)[2] = xmm0.ps[2]; ((float*)&r15->_28)[3] = xmm0.ps[3]; ;
        // 111    r15->_38 = 0x0;
        // 119    rax = rbx->_60;
        // 123    r15->_38 = rax;
        // 127    rdi = rbx->_68;
        // 131    eax = 0;
        // 133 testq %rdi, %rdi
        // 136
        if (!) { // 133 (0 == rdi)
                 // 138 call
            CFRetain;
        } // 143
          // 143    r15->_40 = rax;
          // 147    rdi = rbx->_70;
          // 151    eax = 0;
          // 153 testq %rdi, %rdi
          // 156
        if (!) { // 153 (0 == rdi)
                 // 158 call
            CFRetain;
        } // 163
          // 163    r15->_48 = rax;
          // 167    r15->_50 = 0x0;
          // 175 cmpq $0x0, 0x78(%rbx)
          // 180
        if (!) { // 175 (rbx->_78 == 0x0)
                 // 182    rdi = r14;
                 // 185 call
                 // %rdi = r14
            CA::Transaction::lock();
            // 190    rdi = rbx->_78;
            // 194    eax = 0;
            // 196 testq %rdi, %rdi
            // 199
            if (!) { // 196 (0 == rdi)
                     // 201 call
                CA::AttrList::copy();
            } // 206
              // 206    r15->_50 = rax;
              // 210    rdi = r14;
              // 213 call
              // %rdi = r14
            CA::Transaction::unlock();
        } // 218
          // 218    eax = 0;
    _b220:     // from 239
        // 220    ecx = ((int32_t*)&rbx->_80)[rax];
        // 227    ((int32_t*)&r15->_58)[rax] = ecx;
        // 232    ++rax;
        // 235 cmpq $0x4, %rax
        // 239
        if () // 235 (rax != 0x4)
            goto _b220;
        // 241    r15->_59 = r15->_59 & -0x11;
        // 246    rbx->_90 = r15;
    } // 253
      // 253    rbx = rbx + 0x28;
      // 257    rax = rbx;
      // 260    rsp = rsp + 0x8;
      // 264 popq %rbx
      // 265 popq %r14
      // 267 popq %r15
      // 269 popq %rbp
      // 270 ret
    return;
    // 271    rbx = rax;
    // 274
    goto _f287;
    // 276    rbx = rax;
    // 279    rdi = r14;
    // 282 call
    // %rdi = r14
    CA::Transaction::unlock();
_f287:     // from 274
    // 287    rdi = rbx;
    // 290 call
    // %rdi = rbx
    _Unwind_Resume;
// 295 nop
}

State* CA::Layer::writable_state(CA::Transaction*)

void CA::Layer::set_needs_display_in_rect(CGRect const&)
{
    // 0 pushq %rbp
    // 1    rbp = rsp;
    // 4 pushq %r15
    // 6 pushq %r14
    // 8 pushq %r13
    // 10 pushq %r12
    // 12 pushq %rbx
    // 13    rsp = rsp - 0x38;
    // 17    rbx = rsi;
    // 20    r12 = rdi;
    // 23 testl $0x60000, 0x4(%r12)
    // 32
    if (!) { // 23 (0x60000 & r12->_4)
             // 38 call
        CA::Transaction::ensure_compat();
        // 43    r14 = rax;
        // 46    rdi = r14;
        // 49 call
        // %rdi = r14
        CA::Transaction::lock();
        // 54    xmm0 = 0.; ;
        // 58 ucomisd 0x10(%rbx), %xmm0
        // 63
        if (!) { // 58 (xmm0.sd == (double&)rbx->_10)
                 // 69 ucomisd 0x18(%rbx), %xmm0
                 // 74
            if (!) { // 69 (xmm0.sd == (double&)rbx->_18)
                     // 80    r13 = r12->_10;
                     // 85    rsi = "contents";
                     // 92    rdi = r13;
                     // 95 call
                     // %rdi = r13
                     // %rsi = "contents"
                objc_msgSend;
                // 101    _58 = rax;
                // 105 cmpq $0x0, -0x58(%rbp)
                // 110
                if (!) { // 105 (_58 == 0x0)
                         // 116    rdi = _58;
                         // 120 call
                         // %rdi = _58
                    CFGetTypeID;
                    // 125    r15 = rax;
                    // 128 call
                    CABackingStoreGetTypeID;
                    // 133 cmpq %rax, %r15
                    // 136
                    if (!) { // 133 (r15 != rax)
                             // 142    xmm0.pd[0] = ((double*)&rbx->_0)[0];    xmm0.pd[1] = ((double*)&rbx->_0)[1]; ;
                             // 146    xmm1.pd[0] = ((double*)&r12->_40)[0];    xmm1.pd[1] = ((double*)&r12->_40)[1]; ;
                             // 153    xmm0.pd[0] = xmm0.pd[0] - xmm1.pd[0];    xmm0.pd[1] = xmm0.pd[1] - xmm1.pd[1]; ;
                             // 157    rax = rbx->_10;
                             // 161    rcx = rbx->_18;
                             // 165    ((double*)&_50)[0] = xmm0.pd[0];        ((double*)&_50)[1] = xmm0.pd[1]; ;
                             // 170    _40 = rax;
                             // 174    _38 = rcx;
                             // 178 testb $0x1, 0x87(%r12)
                             // 187
                        if (!) { // 178 ((0x1<<24) & r12->_84)
                                 // 189    xmm0.sd = (double&)rax; ;
                                 // 194    xmm1.sd = (double&)rcx; ;
                                 // 199
                            goto _f254;
                        } // 201
                          // 201    rsi = "contentsScale";
                          // 208    rdi = r13;
                          // 211 call
                          // %rdi = r13
                          // %rsi = "contentsScale"
                        objc_msgSend;
                        // 217    xmm0.pd[0] = xmm0.pd[0];                xmm0.pd[1] = xmm0.pd[0]; ;
                        // 221    xmm1.pd[0] = ((double*)&_50)[0];        xmm1.pd[1] = ((double*)&_50)[1]; ;
                        // 226    xmm1.pd[0] = xmm1.pd[0] * xmm0.pd[0];    xmm1.pd[1] = xmm1.pd[1] * xmm0.pd[1]; ;
                        // 230    ((double*)&_50)[0] = xmm1.pd[0];        ((double*)&_50)[1] = xmm1.pd[1]; ;
                        // 235    xmm0.pd[0] = xmm0.pd[0] * ((double*)&_40)[0]; xmm0.pd[1] = xmm0.pd[1] * ((double*)&_40)[1]; ;
                        // 240    ((double*)&_40)[0] = xmm0.pd[0];        ((double*)&_40)[1] = xmm0.pd[1]; ;
                        // 245    xmm1.pd[0] = xmm0.pd[0];                xmm1.pd[1] = xmm0.pd[1]; ;
                        // 249 shufpd $0x1, %xmm1, %xmm1
                    _f254:     // from 199
                             // 254    eax = 0;
                             // 256    xmm2.sd = (double&) defines_property(unsigned int)::atoms + 32; ;
                             // 264 ucomisd %xmm2, %xmm1
                             // 268    rsi = &_50;
                             // 272    rsi = (xmm1.sd > xmm2.sd) ? rax : rsi;
                             // 276 ucomisd %xmm2, %xmm0
                             // 280    rsi = (xmm0.sd > xmm2.sd) ? rax : rsi;
                             // 284    rdi = _58;
                             // 288 call
                             // %rdi = _58
                             // %
                             // %rsi = &_50
                             // %
                             // %xmm2.sd = (double&) defines_property(unsigned int)::atoms + 32;
                        CABackingStoreInvalidate;
                    } // 293
                } // 293
            } // 293
        } // 293
          // 293    edx = 0x100;
          // 298    ecx = 0x200;
          // 303    rdi = r12;
          // 306    rsi = r14;
          // 309 call
          // %rsi = r14
          // %rdi = r12
          // %ecx = 0x200
          // %edx = 0x100
        CA::Layer::mark(CA::Transaction*, unsigned int, unsigned int);
        // 314    rdi = r14;
        // 317 call
        // %rdi = r14
        CA::Transaction::unlock();
    } // 322
      // 322    rsp = rsp + 0x38;
      // 326 popq %rbx
      // 327 popq %r12
      // 329 popq %r13
      // 331 popq %r14
      // 333 popq %r15
      // 335 popq %rbp
      // 336 ret
    return;
    // 337    rbx = rax;
    // 340    rdi = r14;
    // 343 call
    // %rdi = r14
    CA::Transaction::unlock();
    // 348    rdi = rbx;
    // 351 call
    // %rdi = rbx
    _Unwind_Resume;
}

void CA::Layer::set_needs_display_in_rect(CGRect const&)

时间: 2024-10-29 03:46:55

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

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

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

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

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

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

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

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

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

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

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

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日,安卓巴士全球开发者论坛在重庆举办,网易资深安全工程师钟