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

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

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

下面选了三个例子

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&)

 

posted on 2016-05-16 16:24  bbqz007  阅读(653)  评论(0编辑  收藏  举报