反编译及smali学习

【注】因为换了博客,所以这篇是从我之前的博客里copy过来的。


整体流程:

反编译—>修改smali代码—>回编—>重签名

 

一、反编译及回编:

1.Apktool

使用前准备:

(1)安装java并配置环境变量

(2)下载好的apktool中的三个文件(aapt.exeapktool.batapktool.jar)解压并放在同一个文件夹中

 

Apktool的使用:

(1)decode:命令行切换到上述文件夹,apktool d <apk文件> <dir>反编译;

(2)build:apktool b<dir>回编,在dir目录下多了2个文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。

(3)为APKTool安装特定的framework-res.apk文件,以方便进行反编译一些与ROM相互依赖的APK文件

 

2.baksmali和smali

        使用前准备:

(1)下载baksmali-2.0.3.jar和smali-2.0.3.jar并放在同个目录内

https://code.google.com/p/smali/

(2)将apk文件解压,获得其中的classes.dex文件

 

使用方法:

(1)java -jar baksmali-1.3.2.jar -oout/classes.dex   把classes.dex反编译,代码放在out文件夹下

(2)java -jar smali-1.3.2.jar out/ -oclasses.dex  把out文件夹下的代码回编,生成classes.dex文件,用生成的classes.dex文件覆盖原apk解压出来的classes.dex,并重签名

 

 

二、修改smali代码,添加log

1.smali语法学习

(1)类型:有两个主要类型,即基类和引用类型,其中引用类型又包括对象和数组

基类:

V

void 空,仅用作返回类型

Z

boolean 布尔型

B

byte 字节型

S

short 短整型 16位

C

char 字符型

I

int 整型

J

long 长整形 64位

F

float 浮点型

D

Double 双精度型 64位

对象:

Lpackage/name/ObjectName;

L表明这是一个对象类型,package/name/就是该对象,对象名是是对象的名称

eg. ” Ljava/lang/String;”就等同于”java.lang.String”

 

数组:

[I

等同于int[]

[[I

等同于int[][]

 

(2)方法

包括方法名、参数类型和返回值

Lpackage/name/ObjectName;->MethodName(III)Z

Lpackage/name/ObjectName表示类

MethodName表示方法名

III表示三个整型参数

Z表示返回值位布尔型

 

(3)field(相当于变量定义)

包括报名,变量名,变量类型

Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;

 

(4)寄存器

指定一个方法中有多少寄存器可用:.registers指定方法中寄存器总数;.locals指定方法中非参寄存器的数量。

寄存器的命名方式:V命名和P命名,P命名方式中的第一个寄存器就是方法中的第一个参数寄存器

v0 第一个局部方法寄存器

v1 第二个局部方法寄存器

v2 p0 第一个参数寄存器

v3 p1 第二个参数寄存器

 

如方法:LMyObject;->MyMethod(IJZ)V,参数分别是LMyObject、int、long(64位)、boolean,需要5个寄存器来存储参数

 

e.g.               const-stringv0, "TEST"

                     const-string v1,"onCreate"

                     invoke-static {v0, v1},Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I

相当于log.i(“TEST”,”onCreate”);

 

Smali语法文档:http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

 

 

2.找到添加log的地方

下载dex2jar(https://code.google.com/p/dex2jar/downloads/list),将classes.dex转成.jar文件,使用方法是命令行切到方解压后dex2jar的文件夹,dex2jar classes.dex

下载jd-gui(http://www.cr173.com/soft/5606.html)工具,查看上述.jar的java代码

用hierarchy view看activity结构,找到需要加log的view或activity,然后在java代码中找到对应的地方。如ondraw/onlayout/oncreate这些关键方法

 

小技巧:

        自己写java代码,反编译,找到smali语句,加入到smali代码中

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值