工欲善其事,必先利其器之—搭建Android(apk)的反编译环境

反编译流程

这里仅关注java代码的反编译

步骤工具
apk(zip) -> dex代码更改后缀名为.zip后用图形功能解析或直接命令行下unzip命
dex代码 -> jar代码(class文件可选工具 dex2jar
jar代码 -> java代码可选工具 jd-gui

工具安装

* 前提java运行环境要配置好呀! *

apktool

* apktool主要是用来还原Apk中所包含的resources.arsc,classes.dex(smali格式), 9.png 和 xml 等文件, 我常用来看AndroidManifest.xml文件的内容 *
参考官方指引 Install Instructions
【个人实践】
1.直接下载apktool.jar 下载地址
2.设置相关的环境变量使其能在终端访问即可
如代码是常用的配置(.base_profile文件的代码)

# for reverse engineering, java, android tools
alias apktool='java -jar ${HOME}/dev_tool/apktool_2.3.3.jar'
alias jdgui='java -jar ${HOME}/dev_tool/jd-gui-1.4.0.jar'
alias dex2jar='${HOME}/dev_tool/dex2jar-2.0/d2j-dex2jar.sh'

如下示例是decode bilibili app的效果

luogw@luogw-MacBook-Pro temp$ apktool d iBiliPlayer-bili.apk
I: Using Apktool 2.3.3 on iBiliPlayer-bili.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
S: WARNING: Could not write to (/Users/luogw/Library/apktool/framework), using /var/folders/s3/lg1rl_fn51ggy89fkxx8t7gc0000gn/T/ instead...
S: Please be aware this is a volatile directory and frameworks could go missing, please utilize --frame-path if the default storage directory is unavailable
I: Loading resource table from file: /var/folders/s3/lg1rl_fn51ggy89fkxx8t7gc0000gn/T/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Baksmaling classes2.dex...
I: Baksmaling classes3.dex...
I: Baksmaling classes4.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

dex2jar

下载相应的zip包下载地址并解压到本地目录,配置好访问方式即可
解析后的所有文档需要加上可执行权限
即cd到dex2jar解析后的目标

chmod -R +x  .

jd-gu

下载相应的jar包下载地址,配置好访问方式即可

实践示例

反编译Bili APP

步骤1(zip 2 dex)

unzip iBiliPlayer-bili.apk -d unzip-dis

解压后增加的文件如下

luogw@luogw-MacBook-Pro temp$ tree -L 2
.
├── iBiliPlayer-bili.apk
└── unzip-dis
    ├── AndroidManifest.xml
    ├── META-INF
    ├── assets
    ├── classes.dex
    ├── classes2.dex
    ├── classes3.dex
    ├── classes4.dex
    ├── isoparser-default.properties
    ├── lib
    ├── main
    ├── okhttp3
    ├── res
    └── resources.arsc

7 directories, 8 files

步骤2(dex 2 class)

dex2jar的基本用法如下

d2j-dex2jar -- convert dex to jar
usage: d2j-dex2jar [options] <file0> [file1 ... fileN]
options:
 -d,--debug-info              translate debug info
 -e,--exception-file <file>   detail exception file, default is $current_dir/[fi
                              le-name]-error.zip
 -f,--force                   force overwrite
 -h,--help                    Print this help message
 -n,--not-handle-exception    not handle any exception throwed by dex2jar
 -nc,--no-code
 -o,--output <out-jar-file>   output .jar file, default is $current_dir/[file-na
                              me]-dex2jar.jar
 -os,--optmize-synchronized   optmize-synchronized
 -p,--print-ir                print ir to Syste.out
 -r,--reuse-reg               reuse regiter while generate java .class file
 -s                           same with --topological-sort/-ts
 -ts,--topological-sort       sort block by topological, that will generate more
                               readable code, default enabled
version: reader-2.0, translator-2.0, ir-2.0

接来把第一步骤的*.dex转成.class文件

luogw@luogw-MacBook-Pro unzip-dis$ dex2jar classes.dex classes2.dex classes3.dex classes4.dex
dex2jar classes.dex -> ./classes-dex2jar.jar
dex2jar classes2.dex -> ./classes2-dex2jar.jar
Detail Error Information in File ./classes2-error.zip
Please report this file to http://code.google.com/p/dex2jar/issues/entry if possible.
dex2jar classes3.dex -> ./classes3-dex2jar.jar
dex2jar classes4.dex -> ./classes4-dex2jar.jar
Detail Error Information in File ./classes4-error.zip
Please report this file to http://code.google.com/p/dex2jar/issues/entry if possible

步骤3(class 2 java)

使用jd-gui打开jar包,查看Java源码文件

luogw@luogw-MacBook-Pro unzip-dis$ jdgui classes-dex2jar.jar

这里写图片描述
注:使用jd-gui的另存功能,保存Java源码文件
这里写图片描述

TIPS

【推荐】如果只关注java代码,步骤1与步骤2可以直接使用dex2jar来完成,另外的好处是可以一次性处理多个dex文件,一般现在的APP代码量都很大,即使用了MultiDex,直接unzip会出来多个dex文件。

luogw@luogw-MacBook-Pro temp$ dex2jar iBiliPlayer-bili.apk
dex2jar iBiliPlayer-bili.apk -> ./iBiliPlayer-bili-dex2jar.jar

参考资料

1 . 把apk拷到apktool根目录下,执行:./apktool d xxx.apk,会生成xxx目录,里面有res目录(各种资源文件),smali目录(类似src目录,里面文件的语法不一样)及AndroidManifest.xml。 [*.apk->*.jar: sh ./dex2jar/dex2jar.sh xxx.apk,生成xxx_dex2jar.jar通过jd-linux看源码] 2 . 什么apk汉化啊,就到res/values里string.xml里修改字符串,或者拷贝一份values目录改为values-zh-rCN,再去里面修改string.xml里英文字符串改为中文,所谓的汉化就是这么简单。另外,有些图片里不是中文的得去改图片,那得用Photoshop了,图片也不能乱改,格式,图片大小(尺寸)得原来的。 3 . 修改smali文件,这个有些难度。比如有些apk安装了后要积分什么的,比如大于100才可以用的,其实这个值是用SharedPreference存放的,也就是存在xml里,,位置:/data/data/[包名]/shared_prefs的某个xml里,文件不多肯定是可以找到的。另外一种方法就是修改.smali文件也可以达到这目的,软件实现肯定是读取积分那个值给它修改一下就可以了,例如 const/16 v0 100 (其实就是 v0 = 100)这个语法有点像汇编,觉得还是比汇编简单,v0 v1 ...是寄存器,之前会跟变量关联的。具体的还是自己看看smali语法。 4 . 打包生成apk,执行:./apktool b xxx,会在xxx里面生成,一个dist目录,里面就是xxx.apk,但不能安装滴,提示(Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]),没有给这个apk签名, 5 . 签名,执行:sh ./dex2jar/d2j-apk-sign.sh ./xxx/dist/xxx.apk 就是给刚才那个apk签名,生成的文件还是xxx.apkapktool根目录下。这样就大功告成啦。 [请看:http://blog.csdn.net/zhouyuanjing/article/details/7446988]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值