如果你想反编译一个简单的APK文件,修改里面的代码,那么你不妨尝试看一下,还是不难的。
为什么说是简单的APK文件呢?因为复杂一点的,比如大企业的app,是不可能让你如你所愿的,他们一般会通过复杂的分包和混淆,让你无法获取代码的可读性,读都读不了,更何况是动手改代码了~![](https://i-blog.csdnimg.cn/blog_migrate/e4cf1dc2d7708aee6255607e4bc2bc75.png)
系统:Windows
一、apktool
apktool工具的作用:
- 我们可以通过apktool去查看apk的AndroidManifest、XML文件和图片资源文件。
- 可以修改apk中的代码,不过并非源码,而是smail文件,这个后面会讲。
首先要下载apktool工具,我们需要去到apktool官网去下,链接是:https://ibotpeaches.github.io/Apktool/install/
翻译过来是这样子:
我这边是在E盘新建一个“apktool反编译工具”的文件夹,并将两个文件(apktool.jar)&(apktool.bat)放在里边,然后配置系统环境变量Path:
然后调出cmd命令行窗口,就可以自由使用apktool命令了~
相关命令:
//apk解析
apktool d -f E:\gongju\apktool反编译工具\app.apk -o E:\gongju\apktool反编译工具\test
解析后的目录结构是这样的:
这里我们可以查看:
assets:资源文件
lib:jni相关的so包
original:原始的AndroidManifest.xml文件和签名文
res:xml和图片资源
smail:反编译出来的代码,smail文件夹中目录结构和源代码的包一样
AndroidManifest:就AndroidManifest.xml
//打包成apk
apktool b -f E:\gongju\apktool反编译工具\test -o E:\gongju\apktool反编译工具\packed.apk
此外,可以修改smail文件后用apktool工具来重新打包,这样子避免了开发过程中一些小改动导致重新修改、编译以及打包的情况。
那么问题来了,smail文件是什么?
Dalvik虚拟机和Jvm一样,也有自己的一套指令集,类似汇编语言,但是比汇编简单许多,只要你会java,了解android的相关知识,就可以轻松的看懂,如果得到这些汇编文件呢,利用apktool或者dex2jar工具包(网上很多),反编译classes.dex文件,就可以得到以smali为后缀的文件,这些smali文件就是Dalvik的寄存器语言。
以上是摘抄的,打开来看看是这样子的,怎么样?我反正看不怎么懂。
怎么改代码呢?是不是还要学会这种汇编语言的语法呢?其实大可不必,只要会看一点就可以。
首先我们需要定位要改的代码所在的位置,这里用到的工具有:
- dex2jar:将dex文件转换成jar文件的工具
- jd-gui:查看jar文件的反编译工具
二、dex2jar
下载地址:https://sourceforge.net/projects/dex2jar/postdownload
使用步骤:
- 把app(应用名称).apk的后缀改成zip或者rar,即改成app.zip或app.rar,右键“解压”出来,目录结构如下:
- 把classes.dex文件拷贝到的dex2jar文件夹下,执行命令:
d2j-dex2jar classes.dex
至此dex文件就转化为jar文件了。
三、jd-gui
下载地址:http://java-decompiler.github.io/
使用步骤:
- 打开工具,查看jar包信息,可以定位到需要修改的地方,假设我要改一个请求的url地址,马上就可以定位到:
- 根据路径可以确认smail文件的位置,如图上所示。然后去到对应的smail文件夹(这里是com\game\sdk\util\Constans.smail),改了它就可以了。
这只是一个简单的修改,同样你如果有这个项目中依赖的包的源码,你就可以改这个包源码。通过编译成jar文件,再通过转化为dex(通过dx.bat),再转化为smail(baksmali.jar),最终替换调此项目中的相关smail即可。
四、dx.bat
1.这个是Android自带的(如何你安装了Android Studio)工具,你可以在以下目录中找到它:
2.通过cmd命令行进入到当前目录:
cd C:\Users\Administrator\AppData\Local\Android\Sdk\build-tools\28.0.3
输入此命令拿到dex文件:
dx.bat --dex --no-strict --no-warning --output=E:\work\out\dex\classes.dex(此处替换你想输入dex文件的位置) E:\Project\jhsdk\build\intermediates\bundles\default\classes.jar(此处替换你的jar文件所在的位置)
五、baksmali.jar
下载链接:
https://bitbucket.org/JesusFreke/smali/downloads/
命令:
java -jar baksmali.jar(此处为baksmail.jar文件的路径) -o E:\work\out\smali(输出smail文件的位置) E:\work\out\dex\classes.dex(dex文件的位置)
六、补充
上述这些都是代码层面的修改,如果我们想改资源就更简单了,直接在res文件中修改,不过要注意不能随意更改,资源大都被引用了,删除了会导致我们在build构建apk时直接报错,亦或者安装apk失败。
另外,如果我们要改apk的包名和版本呢?包名简单,只需要在AndroidManifest中修改就可以,sdk版本在哪修改呢?在这儿: