前言
apk的反编译是我们在Android开发中绕不开的一个坎,对于反编译这门技术,我们应该抱着学习的态度,学的越多,也越能防备别人反编译我们,这就是所谓的知己知彼吧,哈哈
需要准备的工具
- Apktool,解包和重新打包都需要它
- dex-tools,可以直接把apk中的classes.dex文件反编译为.jar文件
- jd-gui,直接查看.jar文件中的java文件
- JEB,同时满足dex-tools和jd-gui的功能,但反编译出来的代码不太一样,可以互相对照
- Notepad++,非常强大的文档编辑器,用来查看各种文件,修改.smali我用的就是它
- Android SDK target版本的build-tools中的apksigner,用于给打包好的apk签名
具体实现
apktool
Apktool - A tool for reverse engineering 3rd party, closed, binary Android apps.
用来解包和重新打包apk的工具,命令最多只用得到几行,可以反编译出AndroidManifest.xml和各种资源文件。
解包
这句命令是指在D:\tools\apk_tool_2.7.0文件夹中有一个test.apk文件,这个test.apk文件反编译到同路径下的test文件夹中,该操作会反编译AndroidManifest.xml和res的资源文件
apktool d D:\tools\apk_tool_2.7.0\test.apk -o D:\tools\apk_tool_2.7.0\test
但需要注意的是,重新打包时不能用反编译过res和AndroidManifest.xml的文件夹打包,不然会报错,不会反编译AndroidManifest.xml和res的命令如下:
apktool -r d test.apk
这句命令省略了当前文件路径和输出文件夹路径,和上面的命令相差只是在d前面多加了一个-r
该操作不会反编译AndroidManifest.xml和res的资源文件,可以被重新打包
重新打包
把apktool相同路径下的test文件夹重新打包为test.apk
apktool b test
dex-tools
github地址:
GitHub - pxb1988/dex2jar: Tools to work with android .dex and java .class files
我们把需要反编译的apk准备好,例如我这里准备了一个test.apk,现在我们需要获取这个apk中的classes.dex文件。
有两种办法:
方法一是右键用xx压缩软件打开
直接解压这两个文件出来即可。
方法二是把.apk文件的后缀名改为.rar或是.zip,然后再用压缩软件打开,剩下的步骤是一样的。
注:一定要解压所有名为classes.dex和classes[n].dex的文件,n是数字
这个时候,我们就可以把下好的dex-tools解压出来,并且把我们刚刚解压出来的classes.dex文件丢进来,如图所示:
使用起来非常简单,在未配置环境变量时(默认不配置),打开命令行进入到当前目录(快捷方法是按住shift键,在当前目录右键空白处)
输入命令:d2j-dex2jar.bat [文件名]
d2j-dex2jar.bat classes.dex
如果提示如下信息:
则在命令前面加上".\"即可
.\d2j-dex2jar.bat classes.dex
这条命令仅仅只是反编译1个classes.dex文件,如果有多个classes.dex文件,我们需要依次反编译
因为这里我有两个classes.dex文件,所以最后我能反编译出两个.jar文件
jd-gui
下载地址:
Java Decompiler
想要阅读.jar文件我们就需要jd-gui,下载完成后解压出来如图所示,我们双击运行jd-gui.exe即可
打开刚刚我们反编译出来的两个.jar文件 ,就可以阅读源码!此时的源码一般都是被混淆过的
JEB
官网文档地址:
下载地址和激活教材在参考博客中,但可能并不存在时效性
JEB Decompiler
JEB是一个非常强大的逆向工程工具,我仅仅只会粗略的使用,更加进阶的使用请查阅官方文档或其他博客,本文仅做浅显的使用
JEB下载好之后直接双击运行jeb_wincon.bat即可
语言设置
我们可以在Edit->Language->中文(中文)把JEB设置为中文界面,设置完后需要重启才能生效
在JEB中,我们可以直接打开.apk文件,会自动帮我们反编译,既可以查看java源码也可以对照查看smali
打开.apk时,会弹出以下界面,我们可以进行一些反编译的设置,但默认就足够用了,我们直接点击确定即可 。等待一会
点击转换后,可以看java代码和smali对照
注:JEB的横向查看代码需要按住shift+鼠标滚轮,就可以横向滑动了
JEB的debug调试
JEB还有一个非常实用的功能,就是把一个apk重新打包为可调式的包,并且可以在JEB中打断点进行调试,具体步骤如下:
如果你的apk文件是可调式的安装包,则可以直接进行第3步
- 重新打包为可调试的apk
- 为apk重新签名
- 打断点,使用JEB进行debug调试
重新打包为可调试的apk
jeb自带一个makeapkdebug的命令可以帮助我们直接重新打包出可以调试的apk
在有jeb_wincon.bat的文件夹下,打开cmd或power shell窗口,test.apk中的test是apk名称
命令如下:
jeb_wincon.bat -c --makeapkdebug -- test.apk
为apk重新签名
重新打包出来的apk需要重新签名才能够安装和调试,所以找到我们安装Android SDK的目录,找到build-tools文件夹,目前我的最新安装版本为13,因此我使用的是33.0.0的构建工具,找到文件夹中存在apksigner.bat即可
然后我们随意准备一个签名文件,我这里使用的是Android Studio新建一个签名,步骤如图所示:
随意打开一个工程,点击Build-> Generate Signed Bundle / APK
选啥都行,点next
点击create new
key store path 是保存签名文件的路径
第二行Password 是签名文件的密码
然后来到Key标签页
第一行 Alias 是秘钥的名称
第二行 Password 是秘钥的密码
Validity是签名有效期
Certificate标签页是提供你的个人信息证明
第一行是名称
第二行是组织单位名称
第三行是组织名称
第四行是所在城市或区域
第五行是所在州或省份
第六行是所在的国家代码
填写完之后就在刚刚填写路径的地方生成好了一个.jks的签名文件
这里为了方便省事,我把这个签名文件和重新打包后可以调试的apk文件,直接复制到apksigner.bat所在的文件夹,同样的,在这个文件夹打开命令行(方法同上),运行命令进行签名
--ks后跟的是签名文件的名称,test_debuggable.apk是我们重新打包可以调试的apk文件,运行命令之后,我们还需要输入签名文件的密码别忘了!这里输入密码是看不到的,输完直接回车即可
apksigner sign --ks 123456.jks test_debuggable.apk
更多命令详见官方文档
apksigner | Android 开发者 | Android Developers
签名好之后,我们就可以用这个apk在JEB上进行断点调试了!
打断点,使用JEB进行debug调试
手机或模拟器连接好之后,我们把刚刚签名好的apk重新打开,打好断点,点击开始调试
断点只能打在smali文件中,快捷键为ctrl+B
官方调试文档说明:Debugging - JEB Decompiler
点击开始后,会让你选择需要调试的设备和需要调试的包,选中设备和包之后点击attach/附上就可以开始调试了
至此,我们进行到了最后一步,找到关键代码后,我们需要进行修改并重新打包为可以我们自己使用的apk
在第一步中,想要重新打包,就必须得使用apktool的这个解包命令,然后修改对应的.smali文件
apktool -r d test.apk
修改完.smali文件后,记得保存!然后使用apktools重新打包,最后再去签名,签名完就可以使用我们修改后的apk了!
参考博客
JEB动态调试Smali-真机/模拟器(详细,新手必看) - 『移动安全区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn