安卓常用的反编译工具:dex2jar、jd-gui、apktool及oat2dex

[apk反编译]-Jadx反编译
工具及下载位置:
jadx:
https://github.com/skylot/jadx.git

1.git clone https://github.com/skylot/jadx.git
 cd jadx
./gradlew build-------->安装gradlew工具,联网
会在jadx/build/jadx/bin目录下生成jadx相关脚本及文件------------> 此处可直接使用已经编译好的相关文件

2. ./jadx -d + xxx+ xxx.apk
注意,此处的xxx指编译生成文件的存放目录,可随便起名

会在当前目录生成xxx命名的文件夹,文件夹中包含资源文件及java文件,可直接打开查看相关方法
    jadx[-gui] [options] <input file> (.dex, .apk, .jar or.class)

另外,可以看出,不止能反编译.apk文件,.dex,.jar及.class文件也都可以饭编译成.java文件

3.可视化窗口
./jadx-gui  xxx.apk
类似jd-gui工具,不过这个可以查看资源文件

注意,老版本的jadx工具在反编译apk时,会出现报错,解决方案如下:
将jadx-core/lib/dx-1.10.jar 替换为Android N项目编译工程后
out/host/linux-x86/framework/dx.jar这个jar包,
可拷贝直接修改jadx-core/build.gradle下: compile files('lib/dx.jar')

 

之后重新编译jadx工程,在目录下执行./gradlew build 编译,编译完成,目录下build/jadx/bin/下即可

 

 

[apk反编译]-smali/baksmali反编译.odex文件
工具及下载位置:
smali:
https://github.com/JesusFreke/smali/wiki

1.github下载smali包,编译生成相关jar包
./gradlew build
2.从系统中pull出需要反编译的odex文件,eg: Stk.odex

3.将smali-master/baksmali/build/libs/baksmali-2.2.0-dev-fat.jar和smali-master/smali/build/libs/smali-2.2.0-dev-fat.jar
拷贝出来(123 forever目录下有备份:smb://172.16.78.123/forever/Tools/apktool/smali/ )

4.执行指令:java -jar baksmali-2.2.0-dev-fat.jar deodex Stk.odex
此时可能会提示,Could not find classpath entry boot.oat, 请将系统/system/framework/arm或者/system/framework/arm64中的boot.oat pull出来
    java -jar baksmali-2.2.0-dev-fat.jar -h查看支持的指令帮助

5.再次执行指令:java -jar baksmali-2.2.0-dev-fat.jar deodex Stk.odex
此时可能会提示, Cannot find dependency boot-core-libart.oat in null, 请将系统/system/framework/arm或者/system/framework/arm64中的boot-core-libart.oat pull出来
---->建议将/system/framework/arm或者/system/framework/arm64中所有的文件均pull出来,省去一次次执行报错的烦恼(当然,apk的依赖不一样,所需的包也不一样,请根据提示来操作即可)

6.再次执行java -jar baksmali-2.2.0-dev-fat.jar deodex Stk.odex后,会在当前目录下生成out文件夹,里边放的是smali中间文件,可以用这些文件来生成.dex文件

7.生成.dex方法,执行指令:
java -jar smali-2.2.0-dev-fat.jar assemble out/
会在当前目录下生成out.dex
java -jar smali-2.2.0-dev-fat.jar -h查看支持的指令帮助

8.之后使用jadx工具反编译.dex文件(jadx -d Stk_folder out.dex),即可生成java文件 (不再详解,请查看[apk反编译]-Jadx ,smb://172.16.78.123/forever/Tools/apktool/)
 

9.反编译出的只有java文件,如需资源文件,请pull出Stk.apk文件,使用apktool,即可反编译出资源文件 apktool d Stk.apk(不再详解,请查看[apk反编译]-ApkTool ,smb://172.16.78.123/forever/Tools/apktool/)

 

 [apk反编译]-ApkTool反编译
工具及下载位置:
apkTool:
https://bitbucket.org/iBotPeaches/apktool/downloads/
dex2jar:
https://sourceforge.net/projects/dex2jar/
jd-gui:
http://jd.benow.ca/

1.使用apktool反编译出apk的资源文件及smali中间文件,需要用到apktool的脚本及apktool.jar包
./apktool  d xxx.apk
会在目录下生成xxx文件夹,里边的AndroidManifest.xml及资源文件可直接打开查看, 但是java
文件被反编译成.smali文件,只能看到大概的方法,具体方法无法看出;

2.需要使用dex2jar工具将apk中dex文件提取并反编译成jar包
./dex2jar-0.0.9.15/dex2jar.sh xxx.apk或者./dex2jar-0.0.9.15/d2j-dex2jar.sh xxx.apk 
会在目录下生成xxx.jar包,但是jar包也是无法直接查看的,因为里边是编译生成的.class文件;

3.需要使用jd-gui工具来查看jar包(查看jar包的工具很多,比如android Studio等IDE工具都可查看)

打开jd-gui工具,打开Step2中反编译的jar包,即可查看具体的方法

另外,使用apktool还可以将Step1中反编译出来的文件重新打包回去,比如修改一些资源文件后重新打包成apk

./apktool b xxx   此处的xxx指Step1中反编译出的文件夹,会在xxx文件夹下的dist目录下生成新的xxx.apk文件

注意,一旦Step1中的apktool反编译时出现报错,请下载最新的apktool.jar,然后将apktool.sh这个脚本中的jarfile=apktool_2.2.0.jar 替换成新版本jar包名称即可 

 

[apk反编译] - oat2dex

Android 为优化虚拟机的运行速度做了很多处理,其中最重要的就是将字节码提前转译为机器码,减少解释器的耗时,提高执行效率。
再将字节码进行优化后会对我们的反编译造成一定障碍。
在user版本编译生成的app一般为apk文件和一个odex文件,apk内只存在一些资源文件和库。
而odex文件就是编译优化后的文件,通过提前转译和优化映射提高执行效率。在L之后,代码运行在ART上,odex文件已经是一种ELF文件了。
通过file *.odex查看文件类型
1
jingwq@jwq-linux[~/android/test/SystemUIGoogle/oat/arm64]
2
$ file SystemUIGoogle.odex
3
SystemUIGoogle.odex: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=f1d85bbbcb3cce4fa0a6c78960704f41981846d1, stripped
odex内包含被优化过的dex文件,部分字节码被转换为机器码了,以及一些映射表的优化,总之dex并不是完整的,无法反汇编。odex文件内还包含一系列库的依赖关系。
想要将odex还原为dex需要借助framework中的相关内容来补完。补完后我们就得到完整的dex文件了,随后反汇编为smail语言文件,再反编译为Java语言。


Android内部将dex转换为odex的工具为dex2oat


我们需要使用的工具就叫oat2dex
获取地址:https://github.com/testwhat/SmaliEx/releases


做了一个简单封装便于使用,获取地址:
链接: https://share.weiyun.com/5j1Uf74 (密码:bg4k)
进行简单的配置:
1.下载tgz包
1
jingwq@jwq-linux[~/android/test]
2
$ ll oat2dex-bin.tgz
3
-rwxr--r-- 1 jingwq 1.2M 04-16 11:41 oat2dex-bin.tgz*
2.解压tgz包
1
jingwq@jwq-linux[~/android/test]
2
$ tar -xf oat2dex-bin.tgz -C ~/
3.设置权限
1
jingwq@jwq-linux[~/android/test/SystemUIGoogle/oat/arm64]
2
$ sudo chmod a+x ~/bin/oat2dex


进入正题~


先pull出相关的app目录,再pull出framework目录


1
adb pull /system/priv-app/SystemUIGoogle/
2
adb pull /system/framework framework-o


对于 O 之前版本:
将需要deodex的odex文件放到framework/arm(或arm64)中执行以下命令得到dex文件。
1
jingwq@jwq-linux[~/android/test/framework/arm]
2
$ ls -l Dialer.odex
3
-rwxr--r-- 1 jingwq jingwq 10707424 4月  13 14:06 Dialer.odex
4
jingwq@jwq-linux[~/android/test/framework/arm]
5
$ oat2dex Dialer.odex .
6
04-16 10:53:27:214 Art version=79 (Dialer.odex)
7
04-16 10:53:27:219 De-optimizing /system/priv-app/Dialer/Dialer.apk
8
04-16 10:53:30:001 Output to /home/jingwq/android/test/framework/arm/Dialer.odex-dex/Dialer.dex
当然,也可以写一个完整的framework/arm路径。
1
jingwq@jwq-linux[~/android/test]
2
$ oat2dex Dialer.odex framework/arm/
3
04-16 10:55:39:566 Art version=79 (Dialer.odex)
4
04-16 10:55:39:573 De-optimizing /system/priv-app/Dialer/Dialer.apk
5
04-16 10:55:42:085 Output to /home/jingwq/android/test/Dialer.odex-dex/Dialer.dex
如果需要反odex framework中的代码,只需要将odex文件替换为相应的oat文件就好。
1
jingwq@jwq-linux[~/android/test/framework/arm]
2
$ oat2dex boot-framework.oat .
3
04-16 11:00:16:702 Art version=79 (boot-framework.oat)
4
04-16 11:00:16:714 De-optimizing /system/framework/framework.jar
5
04-16 11:00:23:335 Output to /home/jingwq/android/test/framework/arm/boot-framework.oat-dex/framework.dex
6
04-16 11:00:23:336 De-optimizing /system/framework/framework.jar:classes2.dex
7
04-16 11:00:26:615 Output to boot-framework.oat-dex/framework-classes2.dex


对于 O 版本:
在O版本,Google新增了一种文件为vdex,vdex文件中存放了被提取的dex文件,所以我们直接解包vdex就能得到dex文件了。
01
jingwq@jwq-linux[~/android/test/SystemUIGoogle/oat/arm64]
02
$ ls -l
03
total 15912
04
-rw-r--r-- 1 jingwq jingwq 10863312 4月  13 16:08 SystemUIGoogle.odex
05
-rw-r--r-- 1 jingwq jingwq  5425244 4月  13 16:08 SystemUIGoogle.vdex
06
jingwq@jwq-linux[~/android/test/SystemUIGoogle/oat/arm64]
07
$ oat2dex SystemUIGoogle.vdex
08
04-16 10:51:33:977 QuickeningGroup dexIndex=0 offsetBegin=5424664 offsetEnd=5425240
09
04-16 10:51:33:980 QuickeningInfoSize[0]=72 @ SystemUIGoogle.vdex
10
04-16 10:51:33:980 Unquickening SystemUIGoogle.vdex ver=10
11
04-16 10:51:36:048 Output to /home/jingwq/android/test/SystemUIGoogle/oat/arm64/SystemUIGoogle.dex
反odex framework中的代码,同样解包vdex就可以了。
1
jingwq@jwq-linux[~/android/test/framework-o/arm64]
2
$ oat2dex boot-framework.vdex
3
04-16 12:04:21:922 QuickeningGroup dexIndex=0 offsetBegin=19571070 offsetEnd=19668958
4
04-16 12:04:21:936 QuickeningInfoSize[0]=12236 @ boot-framework.vdex
5
04-16 12:04:21:937 QuickeningGroup dexIndex=1 offsetBegin=19668958 offsetEnd=19774238
6
04-16 12:04:21:942 QuickeningInfoSize[1]=13160 @ boot-framework.vdex
7
04-16 12:04:21:942 Unquickening boot-framework.vdex ver=10
8
04-16 12:04:25:566 Output to /home/jingwq/android/test/framework-o/arm64/boot-framework.dex
9
04-16 12:04:26:558 Output to /home/jingwq/android/test/framework-o/arm64/boot-framework2.dex


得到了dex文件,我们就可以用jadx工具打开它进行反编译得到JAVA源码了。


jadx使用,以及apk内资源的解包请参阅关联知识。

 
 
 
 
 
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值