工欲善其事必先利其器
前言
Android反编译需要用到一些工具,使用这些工具可以大大的提高我们的工作效率。当然使用工具是一把双刃剑,一方面工具使我们的工作更方便,但另一方面工具把一些原理封装了起来,不利于我们的学习。所以使用工具的时候最好对工具的原理有一定的了解。
jadx
github地址,jadx是一个将android 的dex文件解码为java的工具。并且有GUI,用起来非常的方便,具体的使用可以看官方的文档。
apktool
有了上面的工具,可以很方便的将apk的源码进行反编译,让我们了解代码的逻辑。但是这还远远不够,比如我们想干点坏事,将apk反编译后,做点手脚,并把它重新打包发布出去,要实现这样的功能,光上面的工具已经达不到我们的要求了。我们需要另外一个更加强大的工具-apktool. apktool可以将dex文件反编译成smali文件。如果对smali语法熟悉,就可以在smali中修改app的逻辑。其实apktool这个工具集成了另外一个开源的项目baksmali,(因为apktool集成了baksmail, 假如baksmail修复了bug,需要一段时间才能集成的apktool中,所以我们也可以直接使用baksmail)
smali语法
为了达到我们对一个apk做手脚的目的,需要了解一种新的语言smali, smail语言类似与汇编语言,如果对汇编比较熟悉的学习起来会比较容易。
实战
下面就举个例子,演示一下怎么利用apktool解包,修改smali文件,重新打包,签名的过程。
首先新建个项目,主要一个MainActivity,里面只有一个字符串,我的目的就是通过解包apk,在smali语法中注入日志打印语句,把这个字符串打印出来:
1 |
|
将项目打包出来的apk(debug包和release包都可以)拷贝到apktool的同级目录
然后将apk包用apktool,反编译,命令为:
1 |
|
反编译后多了个app-release目录,反编译的文件就都在里边了,下面的任务就是找到MainActivity,在里边注入日志打印语言,将里边的字符串输出。
1 |
|
反编译后的目录:
1 |
|
所有的smali文件都在smali目录下,我们找到MainActivity.smali文件
1 |
|
MainActivity.smali文件中的代码:
1 |
|
前面说了smali语言有点像汇编,通过上面的注释大概能了解这个smali文件的大概意思,要想输出Hello World,我么可以加上调用Log的smali语句。
1 |
|
修改后的MainActivity.smali文件变成:
1 |
|
然后重新打包:
1 |
|
新的apk包位于
1 |
|
这个apk包是不能直接安装的,需要用签名工具签名,可以使用另外一个工具sign.jar,命令为:
1 |
|
签名后的新包叫app-release.s.apk,直接安装就可以打印Hello World的日志了。
1 |
|