【注】因为换了博客,所以这篇是从我之前的博客里copy过来的。
整体流程:
反编译—>修改smali代码—>回编—>重签名
一、反编译及回编:
1.Apktool
使用前准备:
(1)安装java并配置环境变量
(2)下载好的apktool中的三个文件(aapt.exe、apktool.bat、apktool.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代码中