C++反编译-类与结构体分析三

main函数
;15 :    {
0x40137a    push   %ebp
0x40137b    mov    %esp,%ebp
0x40137d    and    $0xfffffff0,%esp
0x401380    sub    $0x60,%esp
0x401383    call   0x427130 <__main>
;16 :        A a;
;17 :        a.a = 1;
0x401388    movl   $0x1,0x38(%esp)
;18 :        a.b = 2;
0x401390    movl   $0x2,0x3c(%esp)
;19 :        strcpy(a.c, "this is question");
0x401398    lea    0x38(%esp),%eax
0x40139c    add    $0x8,%eax
0x40139f    movl   $0x73696874,(%eax)
0x4013a5    movl   $0x20736920,0x4(%eax)
0x4013ac    movl   $0x73657571,0x8(%eax)
0x4013b3    movl   $0x6e6f6974,0xc(%eax)
0x4013ba    movb   $0x0,0x10(%eax)
;20 :        printAll(a);
0x4013be    mov    0x38(%esp),%eax //下面0x8字节为参数a和参数b
0x4013c2    mov    %eax,(%esp)
0x4013c5    mov    0x3c(%esp),%eax
0x4013c9    mov    %eax,0x4(%esp)
0x4013cd    mov    0x40(%esp),%eax //下面0x20字节为字符数组c有的+没的
0x4013d1    mov    %eax,0x8(%esp)
0x4013d5    mov    0x44(%esp),%eax
0x4013d9    mov    %eax,0xc(%esp)
0x4013dd    mov    0x48(%esp),%eax
0x4013e1    mov    %eax,0x10(%esp)
0x4013e5    mov    0x4c(%esp),%eax
0x4013e9    mov    %eax,0x14(%esp)
0x4013ed    mov    0x50(%esp),%eax
0x4013f1    mov    %eax,0x18(%esp)
0x4013f5    mov    0x54(%esp),%eax
0x4013f9    mov    %eax,0x1c(%esp)
0x4013fd    mov    0x58(%esp),%eax
0x401401    mov    %eax,0x20(%esp)
0x401405    mov    0x5c(%esp),%eax
0x401409    mov    %eax,0x24(%esp)
0x40140d    call   0x401350 <printAll(A)>
;21 :        return 0;
0x401412    mov    $0x0,%eax
;22 :    }
0x401417    leave
0x401418    ret
printAll函数
;11 :    void printAll(A a) {
0x401350    push   %ebp
0x401351    mov    %esp,%ebp
0x401353    sub    $0x18,%esp //变量总数据长度为0x18字节
;12 :        printf("%d,%d %s\n", a.a, a.b, a.c);
0x401356    mov    0xc(%ebp),%edx //此处edx = 2
0x401359    mov    0x8(%ebp),%eax //此处eax = 1
0x40135c    lea    0x10(%ebp),%ecx //此处ecx为字符数组首地址
0x40135f    mov    %ecx,0xc(%esp)
0x401363    mov    %edx,0x8(%esp)
0x401367    mov    %eax,0x4(%esp)
0x40136b    movl   $0x4b9025,(%esp)
0x401372    call   0x4b5890 <printf(char const*, ...)>
;13 :    }
0x401377    nop
0x401378    leave
0x401379    ret

原文地址:https://www.cnblogs.com/reverse201/p/10325886.html

时间: 2024-10-16 01:02:56

C++反编译-类与结构体分析三的相关文章

C++反编译-类与结构体分析

类>构造函数 ;5 : A(int a, int b, int c) { 0x438638 push %ebp 0x438639 mov %esp,%ebp 0x43863b sub $0x4,%esp 0x43863e mov %ecx,-0x4(%ebp) ;6 : this->a = a; 0x438641 mov -0x4(%ebp),%eax 0x438644 mov 0x8(%ebp),%edx //等价于取a的值 0x438647 mov %edx,(%eax) //等价于把a赋

C++反编译-类与结构体分析二

类作为参数传递 main函数;17 :    {0x401373    lea    0x4(%esp),%ecx0x401377    and    $0xfffffff0,%esp0x40137a    pushl  -0x4(%ecx)0x40137d    push   %ebp0x40137e    mov    %esp,%ebp0x401380    push   %ecx0x401381    sub    $0x24,%esp0x401384    call   0x4270d

[转]站在OC的基础上快速理解Swift的类与结构体

(阅读此文章前,您已经有一定的Object-C语法基础了!) 2014年,Apple推出了Swift,最近开始应用到实际的项目中. 首先我发现在编写Swift代码的时候,经常会遇到Xcode不能提示,卡顿,直接闪退等问题,尤其是在Swift和OC混编时.(不知道其他开发者是否也有这样的经历,但是我相信这样的问题,很快会得到解决) 然后感觉Swift并不像网上很多朋友说的那样简单.有很多细节问题是值得注意的,甚至有很多思路是颠覆了传统的开发语言的!又有很多特性是结合了其他编程语言的优点! Swif

在OC的基础上快速理解Swift的类与结构体

Swift中,类和结构体都是对数据和方法进行封装的常用做法!首先我们来看看他们的共同之处: 都可以有属性和方法: 都有构造器: 都支持附属脚本: 都支持扩展: 都支持协议. 然后我们来看看他们的不同之处: 类有继承: 结构体有一个自动生成的逐一初始化构造器: 在做赋值操作时,结构体总是被拷贝(Array有特殊处理): 结构体可以声明静态的属性和方法: 从设计模式的角度来分析,类的设计更侧重于对功能的封装,而结构体的设计更侧重于对数据的封装.(汽车与书架来区分类与结构体) 一.构造过程 1. 默认

Swift学习】Swift编程之旅---类和结构体(十三)

与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类的实例被称为对象.然而在Swift 中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上.因此,我们会主要使用实例而不是对象. 比较类和结构体 类和结构体都具有以下特性: 定义用于存储值的属性 定义提供特定能力或功能的方法 定义提供使用下标语法访问值的下标

OC类中一些细节问题(对象类存储、类中结构体的用法)

一:OC中得方法名 注意:方法名冒号和后面的and方法名冒号  都是方法名 一:对象的存储细节 类加载到代码区(包括类中得属性和方法).对象动态加载到堆内存中.指向对象的指针存放在栈区. 三:定义类常见的错误 定义类的时候,常见的错误 1)类的定义不能嵌套 2)不要漏写 @end 3) 不要忘记写实现类(如果忘记写了,编译不会报错,运行时候才报错) 4)定义成员变量的大括号经常漏写 5) 如果不写@interface 只有 @implementation 这可以,但是会报警告,建议不要这么写 6

C#中的类,结构体课堂笔记

C#中的类 C#是一门面向对象的语言,类是C#中一种复杂的数据类型. c#中定义一个类的基本格式: class 类名 { //类成员定义 } 默认情况下,如果class之前没有显示指定访问修饰符,则类的访问修饰符为internal,表示仅在当前项目内可以访问. 除了internal,C#中的修饰符还有private, protected, public, abstract, sealed等修饰符,以及这几个修饰符的组合. 修饰符 访问权限 无或者internal 只能在同一程序集访问类 publ

Swift 的类、结构体、枚举等的构造过程Initialization(上)

构造过程是为了使用某个类.结构体或枚举类型的实例而进行的准备过程.这个过程包含了为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务. 构造过程是通过定义构造器(Initializers)来实现的,这些构造器可以看做是用来创建特定类型实例的特殊方法.与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化. 类实例也可以通过定义析构器(deinitializer)在类实例释放之前执行特定的清除工作.想了解更多关于

进击的雨燕-------------类和结构体

类和结构体是人们构建代码所用的一种通用且灵活的构造体.我们可以使用完全相同的语法规则来为类和结构体定义属性(常量.变量)和添加方法,从而扩展类和结构体的功能. 与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意通常一个类的实例被称为对象.然而在 Swift 中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上.因此,我