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修改的统计可以反映出函数调用的分布,只能作大体上参考。

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

  • 相关阅读:
    win、mac 设置 php上传文件大小限制
    PHP. 02®. Ajax异步处理、常见的响应状态、XMLHttpRequest对象及API、ajax的get/post方法、
    PHP-02.文件上传、php保存/转移上传的文件、常见的网络传输协议、请求报文及属性、响应报文及属性
    PHP. 01. C/S架构、B/S架构、服务器类型、服务器软件、HTTP协议/服务器、数据库、服务器web开发、PHP简介/常见语法、PHPheader()、 PHP_POST/GET数据获取和错误处理
    MAMP 访问时显示文件列表
    HTML5 02. 多媒体控件、拖拽事件、历史记录、web存储、应用程序缓存、地理定位、网络状态
    CSS3 04. 伸缩布局、设置主轴,侧轴方向、主/侧轴对齐方式、 伸缩比例、元素换行、换行控制、覆盖父元素的align-items;控制子元素顺序、web字体、突变字体
    Linux网络设备驱动之数据发送流程(五)
    Linux网络设备驱动之网络设备的打开与释放(四)
    Linux网络设备驱动之网络设备的初始化(三)
  • 原文地址:https://www.cnblogs.com/bbqzsl/p/5490065.html
Copyright © 2011-2022 走看看