自制反汇编工具使用实例 其一

这里有一个(x64)例子,刚好说明寄存器在函数中的位置编排。rdi是第一个不为浮点或数据结构对象的参数,这里的第一个参数实质上与我们定义的函数类型的第一个参数不是对应的。当函数类型是类成员函数,rdi首先安放this指针。当函数类型返回数据结构对象时,rdi优先安排返回结果的指针(这个临时对象就在上一级的栈中,指针指向临时对象)。如果满足上面两种情况,临时对象地址优先,这时rdi是临时对象,rsi才是this指针。

下面是我自制反汇编工具生成的代码:

// -[CALayer setAffineTransform:(CGAffineTransform)]
void CALayer20_setAffineTransform3A_(id self, SEL sel, CGAffineTransform affineTransform)
{
    // 0 pushq %rbp
    // 1    rbp = rsp;
    // 4 pushq %r14
    // 6 pushq %rbx
    // 7    rsp = rsp - 0x100;
    // 14    rbx = rdi;
    // 17    r14 = &_90;
    // 24    rsi = &arg_10;
    // 28    rdi = r14;
    // 31 call
    CATransform3DMakeAffineTransform_();
    // 36    rax = "setTransform:";
    // 43    ecx = 0x10;
    // 48    rdi = rsp;
    // 51    rsi = r14;
    // 54 rep
    // 55     = (int64_t)(int64_t&)rsi->_0;
    // 57    rdi = rbx;
    // 60    rsi = rax;
    // 63 call
    objc_msgSend(rbx, "setTransform:", ...);
    // 69    rsp = rsp + 0x100;
    // 76 popq %rbx
    // 77 popq %r14
    // 79 popq %rbp

    /*****
    * global variables
    *
    */

    // 36 extern ent_off__0x6c861;    movq 0x6c836(%rip), %rax;     "setTransform:"
}

很容易看出两处函数使用

CATransform3DMakeAffineTransform_

[self setTransform]

这里的CATransform3DMakeAffineTransform_返回的就是临时对象CATransform3D,虽然它使用了寄存器rdi和rsi,但它的函数原型只有一个参数,"CATransform3D CATransform3DMakeAffineTransform(CGAffineTransform m);"。

注:_90表示rbp-0x90,即为局部变量。

arg_10表示rbp+0x10,即为上级的栈中调用参数,并且是第一个用栈传递的参数(请注意这里第一个的表述)。

在-[CALayer setAffineTransform:]函数中,我们通常会认为CGAffineTransform参数在rdx,但这里不是,因为是一个对象传参,所以在传参时产生的临时对象,用栈来传递这个对象。

行55的汇编是 movsq (%rsi), es:(%rdi),就是等同于memcpy,其实就是两个对象简单copy。结合上面的rcx寄存和rep指令,就是复制了10个8字节长到rsp,作为-[CALayer setTransform:]的参数,使用栈传参数。

现在就可以得到最后的翻译:

// -[CALayer setAffineTransform:(CGAffineTransform)]
void CALayer20_setAffineTransform3A_(id self, SEL sel, CGAffineTransform affineTransform)
{
    // 31 call
    CATransform3D m = CATransform3DMakeAffineTransform_(affineTransform);
    // 63 call
    objc_msgSend(self, "setTransform:", m);
}
时间: 2024-12-14 12:01:19

自制反汇编工具使用实例 其一的相关文章

自制反汇编工具使用实例 其二(使用xmm寄存器初始化对象,以及空的成员函数指针)

在反汇编代码中,当看到xmm寄存器,第一反应是将要进行浮点操作或访问,但是更加多的情况是在使用xmm寄存器初始化局部对象. 下面是自制反汇编工具翻译出来的代码: // -[CALayer setAllowsEdgeAntialiasing:] void CALayer20_setAllowsEdgeAntialiasing3A_(id self, SEL sel, uintptr_t setAllowsEdgeAntialiasing) { // 0 pushq %rbp // 1 rbp =

逆向与反汇编工具

http://blog.163.com/[email protected]/blog/static/823405412012930555115/ 第 1 章           逆向与反汇编工具 了解反汇编的一些背景知识后,再深入学习IDA Pro之前,介绍其他一些用于二进制文件的逆向工程工具,会对我们学习有所帮助.这些工具大多在IDA之前发布,并且仍然可用于快速分析二进制文件,以及审查IDA的分析结果.如我们所见,IDA将这些工具的诸多功能整合到它的用户界面中,为逆向工程提供了一个集成环境.最

反汇编工具使用

内核开发,kernel panic是再常见不过的了,根据异常栈通常即可定位出代码出错的大概位置,但是有些时候我们还是会需要使用反汇编工具来帮助我们定位一些异常,objdump. 该反汇编工具存在于prebuilts/gcc/linux-x86/arm/gcc-linaro-aarch64-linux-gnu/bin/文件夹下,可参考如下使用方法: 1)   prebuilts/gcc/linux-x86/arm/gcc-linaro-aarch64-linux-gnu/bin/aarch64-l

开发者工具使用实例

开发者工具使用实例 1.查找事件执行函数 举例 F12打开控制台 在 chrome 的控制台的Element选项卡面板里右侧面板有个 Event Listeners,这里会显示你所选择元素的原生事件.原生事件就是元素上直接onclick="xx"等,如下图. 显示是按事件类型显示的,此处是标准事件click,展开后就是在哪些元素上绑定的,同一行后面超链接可以在Sources选显卡里定位处理过程.这个Dom事件模型要了解.然后紫色的handler就是处理函数,光标在上面就会显示出来. 下

分享:反汇编工具和模糊处理工具原理及使用

反编译和对安全的威胁      虽然,大部分的代码反编译是完全正大光明的,但事实是一个优秀的反汇编器是软件侵权的必需工具之一.正因如此,尤其对于在商业和不开放源代码领域中的开发人员来说,便宜的(或免费的) Java 代码反汇编工具的存在是一个严重的问题.       就语言本身而言, 由于其相对简单的 Java 虚拟机(与真实的微处理器相比)和其写得很规范的字节码格式, Java 代码非常容易反汇编.而这随着 Java 语言在 Web 开发平台上的日益普及,已经在商业开发领域引起了很多争议.自从

java生成excel文件工具类实例

import java.io.File; import java.io.IOException; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException; import org.

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

将一个函数的分支跳转逆向生成cpp文件,使逆向分析过程从分支跳转的分析中解放出来,工具首要的作用是应当解放生产力. 下面是效果图: 然后附上上面效果图对应的反汇编源代码和工具逆向生成的cpp文件. 有了这个逆向出来的文件,接下来的逆向工作有点像在做填空,但已经帮大忙. 不能上传附件,贴代码. 某比较大的函数的反汇编代码 QuartzCore`CA::Context::commit_transaction: -> <+0>: pushq %rbp <+1>: movq %rsp

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

这个版本添加了几个功能,分开几篇来写. 本篇是关于这样一个功能,显示选定的条件指令与其它条件分支的关系. 它们的关系分别在初版分支形态分布图,和第二版的汇编代码对应图同样展示. 红色表示被选中的目标 蓝色表示被选定的指令的执行位置之前,可能因为条件跳转而直接跳入到被选中的条件分支内(,忽略该条件判断). 绿色表示在被选中的条件分支内,因为其它条件跳转而直接离开目前分支的代码. 紫色表示在被选中的条件分支内,无条件跳转分支并且直接离开目前分支的代码. 浅紫色表示在被选中的条件分支内,无条件跳转分支

自制反汇编逆向分析工具 迭代第四版本

上一个版本,本工具支持的第一个逆向策略,(对反汇编的函数体内的分支控制结构逆向生成cpp代码,)一直都可以正常工作,直到遇上了一个函数.这个使我的逆向策略算法失效的函数,主要的特点是它含有众多无条件跳转指令(,都是在函数体内的跳转). 为什么无条件跳转指令会使得我的第一个逆向算法失效,因为这些无条件跳转指令让函数的执行流变得不易于线性理解. 在一个没有反汇编出来的函数汇编代码中,如果无条件跳转指令很少,特殊地连一条无条件跳转指令也没有时,将汇编代码的执行流当作行文阅读,总可以找到一个特例让所有条