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

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

    本篇选两个函数的分支逆向贴上:

    void CA::Layer::prepare_commit(CA::Transaction* transaction)
    {
        // 64 call
        // %edx = 0x1000
        // %edi = 0x400
        // %rsi = &_1030
        x_heap_new_with_ptr;
        // 82 call
        // %rdi = r15
        CA::Transaction::lock();
        // 162 call
        // %rdi = r14
        // %rsi = &_1070
        CA::Layer::collect_layers_(CA::Layer::CollectLayersData*);
        // 177 call
        // %rdi = r15
        CA::Transaction::unlock();
        // 182
        goto _f188;
    _b184:     // from 403
    _b184:     // from 386
    _f188:     // from 182
             // 191
        if (!) { // 188 (0 == rbx)
                 // 208
            if (!) { // 205 (0 == r14)
                     // 217 call
                     // %rdi = r15
                CA::Transaction::lock();
                // 232 call
                // %rsi = "contents"
                // %rdi = r14
                objc_msgSend;
                // 244
                if () { // 241 (0 == r13)
                        // gen jmp 336
                    goto _f336;
                    // 249 call
                    // %rdi = r13
                    CFRetain;
                    // 257 call
                    // %rdi = r15
                    CA::Transaction::unlock();
                    // 265 call
                    // %rdi = r13
                    CFGetTypeID;
                    // 273 call
                    CGImageGetTypeID;
                } // 281
                else if () { // 278 (r15 != rax)
                             // gen jmp 346
                    goto _f346;
                }
                else { // 281 next
                       // 293 call
                       // %rsi = "_renderImageCopyFlags"
                       // %rdi = r14
                    objc_msgSend;
                    // 312 call
                    // %rdi = r15
                    CA::Context::current_colorspace(CA::Transaction*);
                    // 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
                         // 293 call
                         // %rsi = "_renderImageCopyFlags"
                         // %rdi = r14
                    objc_msgSend;
                    // 312 call
                    // %rdi = r15
                    CA::Context::current_colorspace(CA::Transaction*);
                    // 329 call
                    // %edx = r14d
                    // %rsi = rax
                    // %rdi = r13
                    // %xmm0 = 0.; 
                    CA::Render::prepare_image(CGImage*, CGColorSpace*, unsigned int, double);
                } // 336
                  // 339 call
                  // %rdi = r15
                CA::Transaction::unlock();
                // 344
                goto _f377;
            _f346:     // from 281
                     // 356 call
                     // %rsi = "CA_prepareRenderValue"
                     // %rdi = r13
                objc_msgSend;
            _f369:     // from 334
                     // 372 call
                     // %rdi = r13
                CFRelease;
            _f377:     // from 344
            } // 377
              // 386
            if () // 377 (r12->_98 == 0x0)
                goto _b184;
            // 398 call
            // %rsi = r15
            // %rdi = r12
            CA::Layer::prepare_animations(CA::Transaction*);
            // 403
            goto _b184;
        } // 408
          // 434
        if ()
            goto _f475;
    _b454:     // from 473
             // 460 call
             // %rdi = r15
        CA::Transaction::unlock();
        // 468 call
        // %rdi = r14
        _Unwind_Resume;
        // 473
        goto _b454;
        // 475 call
        __stack_chk_fail;
    _f475:     // from 434
    
    
             /*****
             * global variables
             *
             */
    
             // 33 extern ent_off__0x7516a;    movq 0x75142(%rip), %rax;     (void *)0x00000001066f9070: __stack_chk_guard
             // 225 extern ent_off__0x6fa52;    movq 0x6f96a(%rip), %rsi;     "contents"
             // 286 extern ent_off__0x6fa12;    movq 0x6f8ed(%rip), %rsi;     "_renderImageCopyFlags"
             // 349 extern ent_off__0x6f6c2;    movq 0x6f55e(%rip), %rsi;     "CA_prepareRenderValue"
             // 420 extern ent_off__0x7516a;    movq 0x74fbf(%rip), %rax;     (void *)0x00000001066f9070: __stack_chk_guard
    
    
             /*****
             * registers modify overviewing
             * scale:50
             */
    
             // rbx: 01020 0001
             // rdx: 01000 0100
             // rdi: 02023 34212 
             // rsi: 10011 1210
             // r12: 00010 0001
             // r13: 00001 0001
             // r14: 10010 10011 
             // r15: 10000 1111
    
    
             /*****
             * registers test overviewing
             * scale:50
             */
    
             // rax: 00000 0001
             // rbx: 00010 0000
             // r13: 00001 0000
             // r14: 00001 0000
             // r15: 00000 1000
    
    }

    以及:

    CA::Layer::State* CA::Layer::writable_state(CA::Transaction* transaction)
    {
        // 24
        if (!) { // 16 (rbx->_90 != 0x0)
                 // 37
            if (!) { // 30 (0 == ((0x40<<8) & rbx->_84))
                     // 45 call
                     // %rsi = r14
                     // %rdi = rbx
                CA::Layer::fetch_geometry(CA::Transaction*);
            } // 50
              // 55 call
              // %edi = 0x6
            x_mem_alloc_bucket;
            // 136
            if (!) { // 133 (0 == rdi)
                     // 138 call
                CFRetain;
            } // 143
              // 156
            if (!) { // 153 (0 == rdi)
                     // 158 call
                CFRetain;
            } // 163
              // 180
            if (!) { // 175 (rbx->_78 == 0x0)
                     // 185 call
                     // %rdi = r14
                CA::Transaction::lock();
                // 199
                if (!) { // 196 (0 == rdi)
                         // 201 call
                    CA::AttrList::copy();
                } // 206
                  // 213 call
                  // %rdi = r14
                CA::Transaction::unlock();
            } // 218
        _b220:     // from 239
                 // 239
            if () // 235 (rax != 0x4)
                goto _b220;
        } // 253
          // 270 ret
        return;
        // 274
        goto _f287;
        // 282 call
        // %rdi = r14
        CA::Transaction::unlock();
    _f287:     // from 274
             // 290 call
             // %rdi = rbx
        _Unwind_Resume;
    
    
        /*****
        * registers modify overviewing
        * scale:50
        */
    
        // rbx: 10000 4
        // rcx: 01001 
        // rdi: 11221 2
        // rsi: 10000 
        // r14: 10000 1
        // r15: 01000 1
    
    
        /*****
        * registers test overviewing
        * scale:50
        */
    
        // rax: 00001 
        // rdi: 00120 
    
    }

    相信大家会发现,在函数结尾处,有另外一些统计信息的输出,包括有全局变量的访问,寄存器在各范围段内修改次数的统计,寄存器在各范围段内用作条件检测比较次数的统计。

    /*****
             * global variables
             *
             */
    
             // 33 extern ent_off__0x7516a;    movq 0x75142(%rip), %rax;     (void *)0x00000001066f9070: __stack_chk_guard
             // 225 extern ent_off__0x6fa52;    movq 0x6f96a(%rip), %rsi;     "contents"
             // 286 extern ent_off__0x6fa12;    movq 0x6f8ed(%rip), %rsi;     "_renderImageCopyFlags"
             // 349 extern ent_off__0x6f6c2;    movq 0x6f55e(%rip), %rsi;     "CA_prepareRenderValue"
             // 420 extern ent_off__0x7516a;    movq 0x74fbf(%rip), %rax;     (void *)0x00000001066f9070: __stack_chk_guard
    
    
             /*****
             * registers modify overviewing
             * scale:50
             */
    
             // rbx: 01020 0001
             // rdx: 01000 0100
             // rdi: 02023 34212 
             // rsi: 10011 1210
             // r12: 00010 0001
             // r13: 00001 0001
             // r14: 10010 10011 
             // r15: 10000 1111
    
    
             /*****
             * registers test overviewing
             * scale:50
             */
    
             // rax: 00000 0001
             // rbx: 00010 0000
             // r13: 00001 0000
             // r14: 00001 0000
             // r15: 00000 1000

    例如上面的例子,寄存器使用状况统计(overviewing),'scale:50'表现为统计口径为50个代码字节,‘r15: 10000 1111’表示寄存器r15在各个50个代码字节片段中被修改的次数,这个例子中,前250字节的代码中,r15只被修改过一次,后面侧每50字节的代码都被修改过只作为短距离有效。一般来说rdi修改的统计可以反映出函数调用的分布,只能作大体上参考。

    这个额外的功能或许现阶段没有用处,但可能后面功能开发的基础。

  • 相关阅读:
    Mysql的联合索引-最左匹配的隐藏规则
    C#读取word文档内容
    安装完office后 在组件服务里DCOM配置中找不到的解决方案
    .NET Web应用程序发布后无法读取Word文档的解决方法
    web程序读取word报异常:COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。最新解决方案
    C# 读取txt格式文件内容
    idea 社区版开发 springbook及问题
    Visualvm jvisualvm1.8详情使用
    VSCODE 打造完美java开发环境(新)
    如何将sdk的jar包安装到本地maven库中
  • 原文地址:https://www.cnblogs.com/bbqzsl/p/5490065.html
Copyright © 2011-2022 走看看