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

在反汇编代码中,当看到xmm寄存器,第一反应是将要进行浮点操作或访问,但是更加多的情况是在使用xmm寄存器初始化局部对象。

下面是自制反汇编工具翻译出来的代码:

// -[CALayer setAllowsEdgeAntialiasing:]
void CALayer20_setAllowsEdgeAntialiasing3A_(id self, SEL sel, uintptr_t setAllowsEdgeAntialiasing)
{
    // 0 pushq %rbp
    // 1    rbp = rsp;
    // 4    rsp = rsp - 0x20;
    // 8    rax = CALayer._attr;
    // 15    rdi = rax->_rdi._8;
    // 20    xmm0 = 0.; ;
    // 23    ((float*)&_10)[0] = xmm0.ps[0]; ((float*)&_10)[1] = xmm0.ps[1]; ((float*)&_10)[2] = xmm0.ps[2]; ((float*)&_10)[3] = xmm0.ps[3]; ;
    // 27    rax = _10;
    // 31    rcx = _8;
    // 35    rsp->_8 = rcx;
    // 40    rsp->_0 = rax;
    // 44    r8d = (uint32_t)(uint8_t&)dl;
    // 48    esi = 0xb;
    // 53    edx = 0x1d;
    // 58    ecx = 0x67;
    // 63 call
    ((CA::Layer*)rax->_rdi._8)->set_bit((unsigned int)0xb, (unsigned int)0x1d, (unsigned int)0x67, (bool)dl, (void (CA::Layer::*)(CA::Transaction*))r9);
    // 68    rsp = rsp + 0x20;
    // 72 popq %rbp

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

    // 8 extern ent_off__0x648d0;    movq 0x648c1(%rip), %rax;     CALayer._attr
}

首先对函数原型进行分析,对下面翻译代码对rdx的访问使用分析,可以知道作为dl访问,通常是作为布尔类型使用,从而得到setAllowsEdgeAntialiasing的参数类型应该是布尔类型。

在翻译代码唯一的一处函数调用,CA::Layer::set_bit的调用中,最后一个参数是一个成员函数指针,这个成员函数指针不是一个指针而是一个结构体(请参看前面《函数指针和成员函数指针有什么不同,反汇编带看清成员函数指针的本尊([email protected]平台)》,不能直接使用寄存器传递,这里应该使用栈来传递。也就是xmm0寄存器用来初始化了一个成员函数指针,并且初始化了一个为空的成员函数指针(结构体)。也就是上面在set_bit函数中传递了一个为空的成员函数指针(请区分好普通指针)。根据参考前面的方面,可知成员函数指针结构体有两个成员变量,在x64体系中,正是16字节(128位)大小,用一条媒体指令就可以将xmm0寄存128位赋值0,并且然后只要一条写内存指令,方便cpu进行超示量。

翻译的最后结果是:

// -[CALayer setAllowsEdgeAntialiasing:(bool)]
void CALayer20_setAllowsEdgeAntialiasing3A_(id self, SEL sel, uintptr_t allowsEdgeAntialiasing)
{
    // 63 call
    ((CA::Layer*)self->_attr._8)->set_bit((unsigned int)0xb, (unsigned int)0x1d, (unsigned int)0x67,                         (bool)allowsEdgeAntialiasing, (void (CA::Layer::*)(CA::Transaction*))0);
}
时间: 2024-12-23 09:50:43

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

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

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

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

这个版本主要在逆向代码输出上做功夫.首先就是对反汇编代码指令的直译,寻址访问则适配成结构体成员访问或数组访问的方式,使更加直观,效果图如下: 另一图: 接着就是有关SSE指令的直译: 直译中并没有对检测比较和条件跳转进行翻译,因为它们只有在couple成对才有意义(, 一条指令对标志寄存器进行修改,另一条指令根据标志寄存器进行判断).所以检测比较和条件跳转更加适合在带分支结构的逆向代码中翻译,下一篇将介绍.

逆向与反汇编工具

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.

每天进步一点点-实例为导学-一个java对象序列化的例子

序列化和反序列化例子 如果我们想要序列化一个对象, (对象 转 序列)首先要创建某些OutputStream(如FileOutputStream.ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中.这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节(1字节8位)的,不能使用Reader和Writer等基于字符的层次结构).而反序列的过

c语言函数指针实例

如果使用typedef 是这样的 //可以把一个小写字母变成大写 //char (*pFun)(char); typedef char (*PTRFUN)(char); PTRFUN pFun; char glFun(char a){ return a & 223;} void print(int a,PTRFUN call){ cout<<call(a)<<endl;}void main() { pFun = glFun; print('a',pFun);} 如果不使用t