【Android 逆向】ARM CPP 类对象
#include <stdio.h>
class aclass{
private:
int m;
char c;
public:
aclass(int i, char ch) {
printf("Constructor called.\n");
this->m = i;
this->c = ch;
}
~aclass() {//定义析构函数
printf("Destructor called.\n");
}
int getM() const {
return m;
}
void setM(int m) {
this->m = m;
}
char getC() const{
return c;
}
void setC(char c) {
this->c = c;
}
int add(int a, int b) {
printf("%d\n", a+b);
}
};
int main(int argc, char* argv[]){
aclass *a = new aclass(3, 'c');
a->setM(5);
a->setC('a');
a->add(2, 8);
printf("%d\n", a->getM());
delete a;
return 0;
}
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := cpp1
LOCAL_SRC_FILES := cpp1.cpp
include $(BUILD_EXECUTABLE)
text:00008600
.text:00008600
.text:00008600
.text:00008600 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00008600 main ; CODE XREF: j_main↑j
.text:00008600 ; __unwind {
.text:00008600 PUSH {R4-R6,LR} ; 保存现场
.text:00008604 MOV R0, #8 ; unsigned int
.text:00008608 BL _Znwj ; 调用new 创建一个8字节的内存区域
.text:0000860C MOV R4, R0
.text:00008610 LDR R0, =(aConstructorCal - 0x8620) ; "Constructor called"的偏移
.text:00008614 LDR R5, =(aD - 0x862C) ; “%d\n”的偏移
.text:00008618 ADD R0, PC, R0 ; 获取“Constructor called" 首地址
.text:0000861C BL puts ; 打印“Constructor called”
.text:00008620 MOV R3, #5
.text:00008624 ADD R5, PC, R5 ; 获取“%d\n”字符串首地址
.text:00008628 STR R3, [R4] ; 把R3的值5,保存到R4对象的前四个字节
.text:0000862C MOV R3, #0x61 ; 'a'
.text:00008630 STRB R3, [R4,#4] ; 把R3的值a,保存到R4所指对象的后四个字节
.text:00008634 MOV R1, #0xA ; R1 = 10,这里编译器直接优化2+8为10
.text:00008638 MOV R0, R5 ; format
.text:0000863C BL printf ; 传入R0 和R1 分别是 “%d\n" 和10
.text:00008640 LDR R1, [R4] ; R1 = 5对象的前四个字节,即字段m的值
.text:00008644 MOV R0, R5 ; format
.text:00008648 BL printf ; printf 两个入参 R0 R1
.text:0000864C LDR R0, =(aDestructorCall - 0x8658) ; "Destructor called."
.text:00008650 ADD R0, PC, R0 ; 获取“Destructor called" 首地址
.text:00008654 BL puts ; 打印,一个参数编译器会把printf优化为puts
.text:00008658 MOV R0, R4 ; void *
.text:0000865C BL _ZdlPv ; _Zdlpv 为系统调用删除对象 ,R0为对象首地址
.text:00008660 MOV R0, #0
.text:00008664 POP {R4-R6,PC} ; 恢复现场
.text:00008664 ; End of function main
.text:00008664
【Android 逆向】ARM CPP 类对象的更多相关文章
- Android 通过 Intent 传递类对象或list对象
(转:http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html) Android中Intent传递类对象提供了两种方式一种是 通过实现 ...
- Android 通过 Intent 传递类对象
Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...
- android通过 Intent 传递类对象
Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...
- Android逆向——smali复杂类解析
i春秋作家:HAI_ 之前在Android逆向——初识smali与java类中讲解了基本的HelloWorld和简单类.这节课就要进一步深入.如果能够耐下心来分析一定会有所收获.——写给自己和后来人. ...
- Android中Intent传递类对象的方法一(Serializable)
Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.short ...
- android activity传递实体类对象
通过实现Parcelable接口序列化对象的步骤: 1.实现Parcelable接口.2.并且实现Parcelable接口的public void writeToParcel(Parcel dest, ...
- Android 开发笔记——通过 Intent 传递类对象
Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...
- android NDK 实用学习(三)- java端类对象的构造及使用
1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ...
- Android JNI和NDK学习(09)--JNI实例二 传递类对象
1 应用层代码 NdkParam.java是JNI函数的调用类,它的代码如下: package com.skywang.ndk; import android.app.Activity; impo ...
随机推荐
- <%= %> <%- %> <% %>是什么意思?
.ejs文件后缀的数据渲染,这是服务器端的.把 .html改成 .ejs, (1)<%= %>相当于html中的innerTEXT,导出不包含标签 . (2)<%- %>相当于 ...
- IDEA快速创建maven项目
遇到问题不要急,不要怕. 一. 二. 三. 四.Finish进来之后,项目会加载一会,之后会是下面这样子. 五.继续往下面配置,建立java和resorces文件夹 六.下面配置tomcat服 ...
- NC25136 [USACO 2006 Ope B]Cows on a Leash
NC25136 [USACO 2006 Ope B]Cows on a Leash 题目 题目描述 给定如图所示的若干个长条.你可以在某一行的任意两个数之间作一条竖线,从而把这个长条切开,并可能切开其 ...
- C# / VB.NET 将Html转为Word
本文分享以C#程序代码为例,实现将Html文件转换Word文档的方法(附VB.NET代码).在实际转换场景中可参考本文的方法,转换前,请按照如下方法引用Word API的dll文件到Visual St ...
- 如何等待ajax完成再执行相应操作
ajax广泛应用于异步请求,对于大多数业务来说,这是十分方便的,但对于一些特殊的业务,ajax的异步性会起到相反的作用. 例如在ajax请求成功后,后续的操作需要依赖ajax执行成功后的相应操作. / ...
- API概述,使用步骤和Scanner概述及其API文档的使用
API概述 API(Application Programming Interface),应用程序编程接口.Java API是一本程序员的 字典 ,是JDK中提供给 我们使用的类的说明文档.这些类将底 ...
- java--运算符和表达式
运算符:就是对常量或者遍历进行操作的符号: 表达式:用运算符把常量或者变量连接起来符合java语法的式子称为表达式,不同运算符连接的表达式体现的是不同类型的表达式. 一.算术运算符 1.使用%运算符: ...
- Qt+ECharts开发笔记(三):ECharts的柱状图介绍、基础使用和Qt封装Demo
前言 上一篇成功是EChart随着Qt窗口变化而变化,本篇将开始正式介绍柱状图介绍.基础使用,并将其封装一层Qt. 本篇的demo实现了隐藏js代码的方式,实现了一个条形图的基本交互方式,即Qt ...
- DHCP 动态主机设置协议 分析
在TCP/IP网络中,每个接口都需要一个IP地址.子网掩码和广播地址( IPv6中没有),简单来说就是需要网络配置信息.如果想访问外部网络可以通过DNS获取外部地址,再通过路由间接转发出去.但是在&q ...
- 5-19 SpringAop | 切面编程
Aop面向切面编程 什么是Aop 面向切面的程序设计(Aspect Oriented Programming)又译作剖面导向程序设计 和OOP(Object Oriented Programming) ...