持续创作,加快成长!这是我参加「日新方案 10 月更文挑战」的第2天,点击检查活动详情
前言
很高兴遇见你~
日常开发中,咱们或许需求反编译 apk 去检查或剖析一些问题,如:
1、这个 app 效果挺酷的啊,怎样完成的呢?此刻你就能够反编译看下它的布局和代码完成
2、这个 app 里边的资源挺多的啊,我想拿过来用,此刻你就能够反编译去拿这个 app 里边的资源
3、运用 aop 在一个类里边插入了一些代码,想验证一下,此刻你就能够反编译检查是否依照你的预期插入了代码
4、我想改吧改吧这个 app ,例如替换它的 app icon,替换里边的翻译,app 汉化等等,此刻你就能够反编译修正,然后打成一个新的 apk 发布(这种咱们知道就好,千万别去做啥坏事)
上面列举的 4 种场景基本能够覆盖咱们日常开发中遇到的问题了,接下来咱们就正式进入 APK 反编译技能的讲解
注意:下面演示均是在 mac 下进行
一、反编译东西介绍
假如咱们仅仅需求 app 中的图片资源,能够直接修正 xxx.apk
的后缀为 xxx.zip
,解压后的文件目录如下:
一切的代码处于 classes.dex
中,图片布局等资源处于 res 目录下。此刻你能够直接去 res 目录下仿制图片资源运用,但是你去翻开 AndroidManifest.xml 文件和 activity_main.xml 文件,会发现看不懂
AndroidManifest.xml 文件:
activity_main.xml 文件:
就是一推规整摆放的 16 进制数,那假如我想看懂要怎样办呢?
答:运用 apktool
1.1、apktool
效果:反编译 APK 中的资源
下载链接:ibotpeaches.github.io/Apktool/ins…
翻开下载链接会呈现如下界面:
mac 主张运用红框中的 Homebrew 去装置,履行 brew install apktool
指令一键装置,它会主动给你装备好环境变量以及添加文件的操作权限
装置完成后,输入apktool
指令 ,假如展现了 apktool 相关信息证明你装备成功了,如下图:
1.1.1、apktool 运用
接下来咱们经过 apktool 来反编译 apk 中的资源
1、先准备一个 apk 文件
2、履行 apktool d xxx.apk
指令
其间 d 是 decode 的意思,表明咱们要对 xxx.apk 进行解码,咱们还能够再加上一些附加参数来控制 decode 的更多行为:
-f :假如方针文件夹已存在,则强制删除现有文件夹(默许假如方针文件夹已存在,则解码失利)
-o :指定解码方针文件夹的名称(默许运用 APK 文件的名字来命名方针文件夹)
-s :不反编译dex文件,也就是说 classes.dex 文件会被保留(默许会将 dex 文件解码成 smali 文件)
-r :不反编译资源文件,也就是说 resources.arsc 文件会被保留(默许会将 resources.arsc 解码成详细的资源文件)
常用的用法就这么多,上述指令的履行成果如下图所示:
这就说明反编译资源成功了
需求注意的是:
1、上述 app-debug.apk
,mac 的 terminal 会主动添加 .zip
后缀,咱们别给误导了哈
2、别的生成的文件夹会在 apk-debug.apk.zip
的基础上在添加 .out
后缀:
这种现象和 windows 体系表现不太相同,咱们注意一下,假如看着不爽,能够运用上述讲的附加参数-o
,来对输出的文件夹进行重命名
3、主张咱们新建一个文件夹来进行反编译的操作,例如上面我新建了一个 apktool_reverse 的文件夹,然后将 apk 资源放到下面,经过 terminal cd 到这个目录,最终履行解码的指令
4、假如咱们履行解码指令 apktool d xxx.apk
成功后,想添加附加参数持续履行,如:apktool d -s -r xxx.apk
,此刻会报错:
报错提示咱们该文件夹现已存在了,因此在这种文件夹现已存在的情况下,咱们应该加上附加参数-f
强制删除现有文件夹
ok,看一下 apktool 反编译后生成的一些详细文件:
1、AndroidManifest.xml:经过反编译复原后的 manifest 文件
2、original 文件夹:存放了未经反编译过、原始的 AndroidManifest.xml 文件
3、res 文件夹:存放了反编译出来的一切资源
4、smali 文件夹:存放了反编译出来的一切代码,只不过格式都是
.smali
类型的
看一眼反编译后的 AndroidManifest.xml 文件和 activity_main.xml 文件
AndroidManifest.xml 文件:
activity_main.xml 文件:
现已复原成咱们看得懂的文件了,格式差点意思,你能够将内容仿制出来放到 AndroidStudio 里边格式化一下就完美了,这样咱们就把反编译资源的方法给把握了
别的运用 apktool 反编译后的代码处于 smali 文件夹下,且都是.smali
格式的,咱们简略截取一段 MainActivity.smali 文件的代码:
嗯,看不懂,假如你能看得懂,那么做的事情就多了,你能够随意修正应用程序内的逻辑,将其进行破解发布。
那怎样才能转化成能看懂的 Java 代码呢?
答:运用 dex2jar + jd-gui
1.2、dex2jar
效果:将 dex 文件转化成 jar 文件
下载地址:sourceforge.net/projects/de…
1.1.1、dex2jar 运用
将下载的 dex2jar 压缩包解压,能够看到如下内容:
在 mac 中运用 d2j-dex2jar.sh
文件就 ok 了
1、将需求转化的 dex 文件仿制到当时 dex2jar 目录:
2、履行如下指令:
sh d2j-dex2jar.sh classes.dex
此刻 terminal 会报错:Permission denied
这是由于文件权限不足导致的,履行如下指令提权即可:
chmod 777 d2j_invoke.sh
接着在履行上述反编译指令,进程如下:
咱们能够看到 dex2jar 多了两个压缩包:
其间代码都处于 classes-dex2jar.jar 中, dex2jar 现已完成它的任务,接下来咱们需求经过 jd-gui 去检查 jar 包下的内容
1.2、jd-gui
效果:检查 jar 包里边的详细类容
下载地址:java-decompiler.github.io/
翻开下载链接如下图:
根据自己的操作体系下载不同的压缩包即可,这儿我下载的是 jd-gui-osx-1.6.6.tar
,解压后你会看到下面 4 个文件:
双击翻开 JD-GUI ,你会发现体系给咱们报了个错误:
ERROR launching ‘JD-GUI’
No suitable Java version found on your system! This program requires Java 1.8+ Make sure you install the required Java version.
这是由于 universalJavaApplicationStub.sh
脚本在 Mac Big Sur 及以上版别有兼容性问题,咱们需求对这个脚本的内容进行替换
1、双击 JD-GUI 显示包内容
2、根据截图找到 universalJavaApplicationStub.sh
3、将此文件内容替换为 github.com/tofi86/univ… 这个链接中的内容
注意:装置之前你要保证体系现已装置了 JDK 1.8 及以上版别
经过上面 3 步,你就能够正确的翻开 JD-GUI 了:
接着将需求翻开的 jar 包给拖进去,检查 MainActivity:
上述 MainActivity 我运用 AspectJ 在 onCreate 方法中插入了一些代码,效果契合我的预期
至此,咱们就学会了如何反编译代码和资源了,简略的小结一下:
1、假如要反编译 app 的代码,就运用 dex2jar + jd-gui
2、假如要反编译 app 的资源,就运用 apktool
ok,还没完毕,现在你还只会我在前言中说到的 1,2,3 点,对于第 4 点:反编译一个 app,将它打包成一个新的 app 你还不会,跟着我的步伐持续往下走
二、根据一个 app 打造一个新的 app
提醒:这儿咱们就站在一个技能的视点去学习,千万别干坏事
咱们根据上述运用 apktool 反编译后的文件夹去做修正,先再看一眼:
未修正前 activity_main.xml 文件的代码如下:
咱们这儿就简略的对 activity_main.xml 文件进行一些修正然后打包,修正如下:
接着运用 apktool 将咱们反编译的app-debug.apk.zip.out
文件夹重新打包成 apk,运用如下指令:
apktool b app-debug.apk.zip.out -o new_app_debug.apk
履行进程如下图:
现在你会发现同级目录有了一个新的 apk 文件:
成果猴急猴急的拿去装置,你会发现装置报错了:
adb: failed to install xxx/new_app_debug.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl2142334632.tmp/base.apk: Attempt to get length of null array]
还是咱们高兴的太早了,目前这个新 apk 是不能装置的,由于它还没有进行签名,那么假如这是他人的 app,咱们从哪儿去整一个签名文件呢?很显然,拿他人的是不或许,因此咱们需求自己去生成,运用 AndroidStudio 能够非常简略的生成一个签名文件,这儿就不展开说了,不懂得自己去查一下
有了签名文件之后再 terminal 履行如下签名指令:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名
其间 jarsigner 指令文件是存放在 JDK 的 bin 目录下,需求将 bin 目录装备在体系的环境变量当中才能够在任何位置履行此指令
以我的为例:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore certificate -storepass erdai666 new_app_debug.apk key0
假如履行进程中没啥问题,就证明签名成功了,此刻咱们就能够把它装置到手机上了,不过在此之前,Android 还极度主张咱们对签名后的 apk 文件进行一次对齐操作,由于这样能够使得咱们的程序在 Android 体系中运行得更快。对齐操作运用的是 zipalign 东西,该东西存放于<Android SDK>/build-tools/<version>
目录下,将这个目录装备到体系环境变量当中就能够在任何位置履行此指令了
zipalign 4 new_app_debug.apk new_app_debug_aligned.apk
其间 4 是固定的值,后边指定待对齐的 apk 文件名和对齐后的 apk 文件名,运行这段指令之后,会生成一个new_app_debug_aligned.apk
文件,如下所示:
接下来咱们把这个签名对齐后的 apk 装置到手机上,效果如下图所示:
能够看到,当咱们翻开 app 后,页面的布局变成咱们修正后的了,说明咱们根据一个 app 打造一个新的 app 成功了
三、总结
本篇文章我讲了:
1、反编译资源,首要经过 apktool
2、反编译代码,首要经过 dex2jar + jd-gui
3、根据一个 app 打造一个新的 app,首要经过 apktool 反编译后,修正 activity_main.xml 文件,然后进行重新打包,签名,对齐,最终装置展现了预期的效果。当然这儿你有才能看懂 .smali
格式的代码,那么你能够做的事情就更加多
好了,本篇文章到这儿就完毕了,希望能给你带来帮助
感谢你阅读这篇文章
参考和引荐
Android安全攻防战,反编译与混淆技能彻底解析(上)
MAC下反编译APK的东西ApkTool,dex2jar,JD-GUI装置与运用方法
Mac Big Sur 晋级后 JD-GUI 无法翻开的问题修正
你的点赞,谈论,是对我巨大的鼓舞!
欢迎重视我的公众号: sweetying ,文章更新可第一时间收到
假如有问题,公众号内有加我微信的入口,在技能学习、个人成长的道路上,咱们一同前进!