zoukankan      html  css  js  c++  java
  • 自制反汇编逆向分析工具 迭代第六版本 (三)

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

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

    下面选了三个例子

    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&)
  • 相关阅读:
    Window 服务安装
    SQL
    vb To c# or c# To vb
    CacheHelper-缓存
    让Linq的OrderBy支持动态字段
    哪些列上适合建立索引???
    如何查看Oracle数据库中无效的对象,约束,触发器和索引
    如何查看Oracle中被锁定的表
    ORACLE ASM
    WebLogic Server
  • 原文地址:https://www.cnblogs.com/bbqzsl/p/5498388.html
Copyright © 2011-2022 走看看