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

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

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

第六版(四),在(三)的基础上增加对原子操作指令的逆向以及c++函数的逆向。

本篇是(五),对待c风格的函数符号调用的翻译,通过导入c风格符号的函数原型来参考分析。

上一篇在介绍对待 c++风格的函数符号调用的情况,提到了c风格的函数符号没有太多的原型信息可供参考,但是它唯一不被重载,参数约定使用标准的约定,所以用古老(老土)的办法就好了。就是导入c风格符号的函数原型(主要是符号名和参数序列)。

有外部的是参考信息,就可以对函数调用配用相应的寄存器和存储单元。我并不想让机器去试图臆意猜测一个不知道原型的函数参数序列,因为过犹不及,而且不严谨,机器猜测误导坑更加大。试想一下,一个c风格的函数,你可以单从函数被调用前的准备参数的工作流就能分辨出是foo(double, int)还是foo(int, double)吗?我是不能做到这种超人的程序了,我必须要通过外部信息来指导机器进行分析工作。

下面贴上机器逆向出来的代码:

CA::Transaction::add_root
{// 0 pushq %rbp// 1    rbp = rsp;// 4 pushq %r14// 6 pushq %rbx// 7    rbx = rsi;// 10    r14 = rdi;// 13    rdi = & CA::Transaction::roots_lock;// 20 call
    OSSpinLockLock(CA::Transaction::roots_lock);// 25    rdi = CA::Transaction::roots;// 32 testq %rdi, %rdi// 35if (!) { // 32 (0 != rdi)// 37    edi = 0;// 39    esi = 0;// 41    edx = 0;// 43    ecx = 0;// 45    r8d = 0;// 48    r9d = 0;// 51 callx_hash_table_new_(0, 0, 0, 0, 0, 0);// 56    rdi = rax;// 59     CA::Transaction::roots = rdi;} // 66// 66    rsi = rbx;// 69    rdx = rbx;// 72 callx_hash_table_insert((x_hash_table*)rax, (uintptr_t)esi, (uintptr_t)edx);// 77 testb %al, %al// 79if (!) { // 77 (0 == al)// 81 lock// 82    OSAtomicIncrement32((volatile int32_t*)&rbx->_0);// 84 testb $0x10, 0x84(%r14)// 92if (!) { // 84 (0 == (0x10 & r14->_84))// 94    rax = (int64_t)(int32_t&)r14->_8;// 98 testq %rax, %rax// 101if () { // 98 (0 > rax)// gen jmp 113goto _f113;// 103 cmpl $0x0, 0xa8(%rbx,%rax,4)} // 111else if () { // 103 ((int32_t&)((uint32_t*)&rbx->_a8)[rax] != 0x0)// gen jmp 124goto _f124;}else { // 111 next_f113:     // from 101} // 113// 113    rdi = rbx;// 116    rsi = r14;// 119 call((CA::Layer*)rbx)->thread_flags_((CA::Transaction*)r14);_f124:     // from 111} // 124} // 124// 124    rdi = & CA::Transaction::roots_lock;// 131 popq %rbx// 132 popq %r14// 134 popq %rbp// 135 retreturn;    // jmp 0x1041ecb2a; symbol stub for: OSSpinLockUnlock// 140    rbx = rax;// 143    rdi = & CA::Transaction::roots_lock;// 150 call
    OSSpinLockUnlock(CA::Transaction::roots_lock);// 155    rdi = rbx;// 158 call
    _Unwind_Resume;// 163 nop/*****
* global variables
*
*/// 13 extern ent_off__0x5146c;    leaq 0x51458(%rip), %rdi;     CA::Transaction::roots_lock
// 25 extern ent_off__0x51464;    movq 0x51444(%rip), %rdi;     CA::Transaction::roots
// 59 extern ent_off__0x51464;    movq %rdi, 0x51422(%rip);     CA::Transaction::roots
// 124 extern ent_off__0x5146c;    leaq 0x513e9(%rip), %rdi;     CA::Transaction::roots_lock
// 143 extern ent_off__0x5146c;    leaq 0x513d6(%rip), %rdi;     CA::Transaction::roots_lock
}
CA::Transaction::add_root

 

CA::Transaction::run_deferred_visibility_layer_calls
{// 0 pushq %rbp// 1    rbp = rsp;// 4 pushq %r15// 6 pushq %r14// 8 pushq %rbx// 9 pushq %rax// 10    r14 = rdi;// 13    rbx = r14->_78;// 17 testq %rbx, %rbx// 20if (!) { // 17 (0 == rbx)_b22:     // from 81// 22    r15 = rbx->_0;// 25 testq %r15, %r15// 28if (!) { // 25 (0 == r15)// 30    rdi = r15;// 33 call((CA::Layer*)r15)->call_did_become_visible();// 38    eax = 0xffffffff;// 43 lock// 44    OSAtomicAdd32(eax, (volatile int32_t*)&r15->_0);// 48 cmpl $0x1, %eax// 51if (!) { // 48 (eax != 0x1)// 53    rdi = r15;// 56 call((CA::Layer*)r15)->~Layer();// 61    edi = 0xb;// 66    rsi = r15;// 69 callx_mem_dealloc_bucket(0xb, (void*)r15);} // 74} // 74// 74    rbx = rbx->_8;// 78 testq %rbx, %rbx// 81if () // 78 (0 != rbx)goto _b22;// 83    rdi = r14->_78;// 87 callx_list_free((x_list*)r14->_78);// 92    r14->_78 = 0x0;} // 100// 100    rsp = rsp + 0x8;// 104 popq %rbx// 105 popq %r14// 107 popq %r15// 109 popq %rbp// 110 ret
return;
// 111 nop
}
CA::Transaction::run_deferred_visibility_layer_calls

 

转载于:https://www.cnblogs.com/bbqzsl/p/5512642.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模型搜索 及 轮廓搜索 的原理

模型搜索 及 轮廓搜索 的原理

Linux中设置vim自动在运算符号两边加上空格

vim中设置自动在-之类的运算符号左右两边加上空格。原版的vim不带这个功能,写出的代码例如zxy,不美观,很多编译器(如VS)能够自动在符号两边加上空格,如z x y,看起来比较美观。 只要在.vimrc里…

HALCON示例程序class_ndim_norm.hdev基于多通道图像的分类

HALCON示例程序class_ndim_norm.hdev基于多通道图像的分类 示例程序源码(加注释) 读入图片 read_image (Image, ‘ic’)得到图片大小 get_image_size (Image, Width, Height)关闭窗口 dev_close_window ()根据图片大小打开窗口 dev_open_window (0, 0,…

centos7搭建FTP服务器

1.   使用 yum 安装 vsftpd:yum install -y vsftpd 2.  启动 VSFTPD:systemctl start vsftpd.service 3.  启动后可监听到21端口:netstat -nltp | grep 21 4.  配置FTP权限:(vsftpd.conf,修改前先备…

[HDOJ2586]How far away?(最近公共祖先, 离线tarjan, 并查集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid2586 这题以前做过…现在用tarjan搞一发…竟然比以前暴力过的慢………… 由于是离线算法,需要Query来保存查询数据,Ans来保存结果。最后输出的时候按照idx的顺序输出,所以胡搞…

爱普生SCARA机器人参考文档列表

爱普生SCARA机器人参考文档列表软件EPSON RC 5.0 用户指南记载了机器人系统与程序开发软件。 - 安全 - 机器人系统的操作与设定 - 程序开发软件 EPSON RC GUI的操作 - SPEL语言、应用程序 - 机器人…

HALCON示例程序classify_citrus_fruits.hdev应用常规gmm分类器进行水果分类

HALCON示例程序classify_citrus_fruits.hdev应用常规gmm分类器进行水果分类 示例程序源码(加注释) 读入图片、显示与显示相关设置 read_image (Image, ‘color/citrus_fruits_01’) get_image_pointer1 (Image, Pointer, Type, Width, Height) dev_clos…

python进阶10 MySQL补充 编码、别名、视图、数据库修改

python进阶10 MySQL补充 编码、别名、视图、数据库修改 一、编码问题 #MySQL级别编码 #修改位置: /etc/mysql/mysql.conf.d/mysqld.cnf default-character-set utf8character-set-server utf8 collation-server utf8_general_ci#最佳实践 #1、无论mysql是否设…

教你如何剖析源码

一、源码阅读需求 在学习中,我们会需要了解,学习,使用一个框架,一个新的函数库。在工作中,因为业务需求,因为性能问题,可能通过一个更高性能的工具,架构去优化我们的程序。 那么&…

SPEL + 中的错误处理

SPEL 中的错误处理 如果在SPEL程序中发生错误,可以将执行转到错误处理例程中进行错误处理。该例程必须在函数定义内。下一页的表格显示了用于错误处理的程序指令。 项目 目的 OnErr 使用OnErr语句定义错误处理…

HALCON示例程序classify_halogen_bulbs.hdev使用SVM分类器检测卤素灯泡的好坏

HALCON示例程序classify_halogen_bulbs.hdev使用SVM分类器检测卤素灯泡的好坏 示例程序源码(加注释) 得到halcon默认图片存储路径 get_system (‘image_dir’, HalconImages) 获得操作系统类型 get_system (‘operating_system’, OS) OS{0:2}的意思是…

php调用API支付接口(转自刘68)

首先访问 https://charging.teegon.com/ 注册账号, 找到开发配置 记下client_id和client_secret。 点击 天工开放平台 点击天工收银 点击 SDK下载与使用 选择php版下载 解压后获得 打开form.php这个是样板文件可以用它来测试是否成功,测试前需要先修…

S3C2440 SPI驱动框架

S3C2440 SPI驱动代码详细解读: https://www.linuxidc.com/Linux/2012-08/68402p4.htm 一、platform device and board_info /* /arch/arm/plat-s3c24xx*/static struct resource s3c_spi0_resource[] { [0] {.start S3C24XX_PA_SPI,.end S3C24XX_PA_SPI 0…

单目相机标定原理

一.相机标定主要涉及三个坐标系:图像坐标系、摄像机坐标系和世界坐标系 【图像坐标系】 摄像机采集的图像变换为数字图像后,每副数字图像在计算机内为M x N数组,M行N列的图像中每一个元素(pixel)数值就是图…

HALCON示例程序classify_image_class_gmm.hdev使用GMM分类器分割彩色图片

HALCON示例程序classify_image_class_gmm.hdev使用GMM分类器分割彩色图片 示例程序源码(加注释) dev_update_off () dev_close_window () dev_open_window (0, 0, 735, 485, ‘black’, WindowHandle) set_display_font (WindowHandle, 14, ‘mono’, …

Android开始之 activity_lifecycle和现场保护

生命周期: oncreate—onstart—onresume,--onpause--onstop,——onrestart——onstart——onresume,。。onpause。。。onstop。。。ondestroy 现在保护---保存系统状态 通过这个方法保存到数据库中或者xml中,&#xff…

Apache启动错误:could not bind to address[::]:443

Q:Windows环境下启动apache报错如下: 可是在httpd.conf文件中apache listen的明明是http 80端口,为什么会报443的错误? A:因为你的计算机安装了VM,所有有个vm的进程一直占用着443端口,在命令行下…

针孔相机拍摄的图像坐标和空间点的对应关系

一:摄像机成像原理 摄像机成像模型一般有三种:透镜投影模型(小孔摄像机模型)、正交投影模型和透视投影模型 光学中最基本的高斯成像公式:1/u 1/v 1/f (式一) 原理图如下: 二:认识三个…

window.onload中动态获得img的高度

$(function(){}); window.οnlοadfunction(){} $(function(){}) 是在DOM结构渲染完成以后调用的,这时候网页中一些资源还没有加载,比如图片等资源,但是DOM结构已经渲染成功了 window.onload是在网页DOM结构渲染完成,而且资源已经…

HALCON关于显示的函数与介绍(持续更新)

点击下方直达算子蓝色字体 目录1、dev_update_off ();dev_update_on2、dev_close_window ()3、dev_open_window( : : Row, Column, Width, Height, Background : WindowHandle)4、set_display_font( : : WindowHandle, Size, Font, Bold, Slant : )5、dev_set_draw(…