#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 类对象的更多相关文章

  1. Android 通过 Intent 传递类对象或list对象

    (转:http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html) Android中Intent传递类对象提供了两种方式一种是 通过实现 ...

  2. Android 通过 Intent 传递类对象

    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...

  3. android通过 Intent 传递类对象

    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...

  4. Android逆向——smali复杂类解析

    i春秋作家:HAI_ 之前在Android逆向——初识smali与java类中讲解了基本的HelloWorld和简单类.这节课就要进一步深入.如果能够耐下心来分析一定会有所收获.——写给自己和后来人. ...

  5. Android中Intent传递类对象的方法一(Serializable)

    Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.short ...

  6. android activity传递实体类对象

    通过实现Parcelable接口序列化对象的步骤: 1.实现Parcelable接口.2.并且实现Parcelable接口的public void writeToParcel(Parcel dest, ...

  7. Android 开发笔记——通过 Intent 传递类对象

    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...

  8. android NDK 实用学习(三)- java端类对象的构造及使用

    1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ...

  9. Android JNI和NDK学习(09)--JNI实例二 传递类对象

    1 应用层代码 NdkParam.java是JNI函数的调用类,它的代码如下:   package com.skywang.ndk; import android.app.Activity; impo ...

随机推荐

  1. 使用c++爬取股市数据,获取最新行情

    最近自己动手写个小软件(界面原生态,还没来得及加样式哈).每天看看潜力股懒人做法,不介意推荐.资源有限,只能观察一下低价股,分析一下运动规律,什么时候拉升,惯性如何 主要功能:读取网络数据:保存本地数 ...

  2. python基础教程:__call__用法

    __call__可以使得方法变成可被调用对象:(PS:python中的方法和普通函数有点区别:方法的第一个参数是类实例) 允许一个类的实例像函数一样被调用.实质上说,这意味着 x() 与 x.call ...

  3. 求求你们,别再刷 Star 了!这跟“爱国”没关系!

    这几年,随着几大互联网公司的强大,纷纷投入云计算产业的建设,开源项目作为维护潜在客户群体(开发者)的重要手段,是各大云计算厂商都在努力做的事. 这几年也诞生了很多真正优秀和看似优秀的开源项目.真正优秀 ...

  4. 自定义 systemd service

    Red Hat Linux 自 7 版本后 采用systemd 形式取代原先 init ,用户可以参考 系统service 创建自己的service ,以便于日常统一管理,系统service 存储路径 ...

  5. Codeforces Round #802 (Div. 2)

    题集链接 A Optimal Path 水 代码 #include <bits/stdc++.h> #define endl "\n" using namespace ...

  6. .NET GC工作流程

    前言 在上文[如何获取GC的STW时间]一文中,我们聊到了如何通过监听GC发出的诊断事件来计算STW时间.里面只简单的介绍了几种GC事件和它的流程. 群里就有小伙伴在问,那么GC事件是什么时候产生的? ...

  7. vue 调用nginx服务跨越的问题

    server { listen 80; server_name api.xxxx.com; add_header Access-Control-Allow-Origin '*' ; proxy_set ...

  8. 千万小心,99%的Java程序员会踩这些坑

    前言 作为Java程序员的你,不知道有没有踩过一些基础知识的坑. 有时候,某个bug查了半天,最后发现竟然是一个低级错误. 有时候,某些代码,这一批数据功能正常,但换了一批数据就出现异常了. 有时候, ...

  9. 01 开发App真机调试问题

    逍遥安卓模拟器 :https://juejin.cn/post/7062922018710093831 HBuilderX真机调试插上手机却提示"未检测到手机或浏览器"的问题:ht ...

  10. Redis系列4:高可用之Sentinel(哨兵模式)

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 1 背景 从第三篇 Redis系列3:高可用之主从架构 ,我们知道,为Re ...