移动安全-APK反编译

概述

工具名称作用
APKTool资源文件获取(可以提取出 图片、XML布局文件 进行使用查看)
dex2jar将APK解压出来的 classes.dex 文件反编译成 Jar 文件
jadxJar文件(或者直接查看APK文件)转化为可视化的Java源码文件

APK文件

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

SO文件

在这里插入图片描述在这里插入图片描述在这里插入图片描述

DEX文件

在这里插入图片描述在这里插入图片描述

APKTool

工具作用: 利用APKTool我们可以从APK文件中获取到图片资源和XML配置文件。
下载链接: https://ibotpeaches.github.io/Apktool/install/

反编译APK

  • 首先我们将目标APK放在APKTool工具的同一目录下:
    在这里插入图片描述
  • 然后在CMD中执行以下命令:apktool.bat d Safer.apk (-o 存放路径)
    在这里插入图片描述
  • 反编译执行成功以后我们可以看到APKTool的目录下会多了一个Safer文件夹:
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

重新打包

我们在对APK进行反编译后开始对APK进行篡改,此处只是利用APKTool反编译后修改了Safer.apk的splash_bg.jpg文件,然后准备进行重新打包,生成可运行的APK。
在这里插入图片描述

  1. 将APKTool反编译出来的Safer文件夹项目打包成Safer-new.apk安装包:
    apktool b Safer -o Safer-new.apk
    在这里插入图片描述
    打包完成后在APKTool的路径下会看到一个Safer-new.apk文件:
    在这里插入图片描述
    我们尝试将它直接安装到手机,发现安装失败:
    在这里插入图片描述
  2. 生成签名文件命令: keytool -genkey -alias my.keystore -keyalg RSA -validity 36500 -keystore my.keystore
    在这里插入图片描述此时可以在APKTool路径下看到签名文件my.keystore
    在这里插入图片描述
    3、查看证书指纹:keytool -list -v -alias my.keystore -keystore D:\Security\AndroidHack\APKTool\my.keystore
    在这里插入图片描述4、为APK文件签名:jarsigner -verbose -keystore “keystore文件路径” -signedjar “签名后的apk路径” “需要签名的apk路径” my.keystore(签名证书别名)
    在这里插入图片描述自签名证书签名成功:
    在这里插入图片描述
    最终生成的已签名的被篡改的APK文件:
    在这里插入图片描述
    在手机上成功安装:
    在这里插入图片描述
    发现APP页面成功被篡改:
    在这里插入图片描述

【自签名证书】 APK的证书通常的自签名的,也就是由开发者自己制作,没有向CA机构申请。Android在安装APK时并没有校验证书本身的合法性,只是从证书中提取公钥和加密算法,这也正是逆向人员对第三方APK重新签名后,还能够继续在没有安装这个APK的系统中继续安装的原因(Android签名机制不允许手机中安装同一包名的应用)。

【补充】不仅是APK,很多网站也在使用自签名证书。

所谓自签名证书,就是自己颁发给自己的证书 ,所以颁证的主体是不可信任的。自签证书是不会被浏览器信任的证书的,用户在访问自签证书时,浏览器会警告用户此证书不受信任,需要人工确认是否信任此证书。既然自签证书是不可信任的,那为何还有人包括12306也在用自签证书呢?主要原因是:

  • 自签证书是免费的
  • 自签证书相对申请CA证书,流程更简单
  • 自签证书同样可以对数据进行加密
  • 自签证书的有效期可以设置很长,免去续签的麻烦

所以对于一些个人开发者来说使用自签证书可能会更方便,只要你能接受别人浏览你网站时弹出的提醒:不安全。

DEX2jar

工具作用: 将从APK文件解压出来的 classes.dex 文件反编译成 Jar 文件。
下载地址:https://sourceforge.net/projects/dex2jar/

下载之后直接解压即可使用。如图:
在这里插入图片描述
开始使用dex2jar

  1. 将目标APK(Safer.apk)后缀改为zip,然后解压,得到classes.dex文件
    在这里插入图片描述
  2. 将需要反编译的dex文件(classes.dex)复制到 dex2jar 解压目录下:
    在这里插入图片描述
  3. 打开CMD命令行进入 d2j-dex2jar.bat 文件所在目录,输入命令 d2j-dex2jar.bat classes.dex,如下图:
    在这里插入图片描述
  4. 此时可以看到目录中多出了classes-dex2jar.jar文件:
    在这里插入图片描述
    那么如何查看该jar文件的内容呢?此时就需要用上最后一个工具—— jd-gui

Jadx

工具作用:将 Jar文件(或者直接查看APK文件)转化为可视化的Java源码文件
下载地址:https://github.com/skylot/jadx/releases/tag/v1.0.0

查看源码

  1. 将下载后的zip文件解压后定位到在lib文件夹中,双击jadx-gui-1.0.0.jar即可运行:
    在这里插入图片描述
  2. 选择刚才获得的class-sex2jar.jar文件:
    在这里插入图片描述
  3. 即可获得APK的Java源码:
    在这里插入图片描述
  4. 还可以直接将完整的APK文件从该工具中打开,直接进行反编译:
    在这里插入图片描述java文件,资源文件(包括图片、layout、so文件)都反编译出来了。

注意:

  • 反编译出来的 java 代码只能帮分析代码,一般都是没法直接编译通过的。

  • 不要指望反编译出的完整目录结构能一模一样导出来。因为反编译的目的就是分析代码,不是运行代码。

  • 商用APP都是经过加密的,反编译出来的代码肯定是混淆的,我这个apk是自己写的没有加密,所以反编译出来看着很漂亮。嘿嘿嘿~~

进阶使用

1、deobfuscation

一般 APK 在发布出去之前,都是会被混淆的,这基本上是国内 App 的标配。这样一个类,最终会被混淆成 a.b.c ,方法也会变成 a.b.c.a() ,这样其实非常不利于我们阅读。我们很难看到一个 a.java 的文件,就确定它是哪一个,还需要根据包名来区分。

若Android工程进行了代码混淆,有的类的变量和方法名都变成了a,b,c,d……如下图所示:
在这里插入图片描述deobfusation 功能,可以为它们其一个特殊的名字,这样它在这个项目中,名字就唯一了,方便我们识别和搜索。这个功能可以在 Tools -> deobfusation 中激活。接下来来看看它的效果。
在这里插入图片描述
可以看到,a 变成了 p003a。不知道这样看你觉得有方便一些吗?

2、一键导出 Gradle 工程

虽然,jadx-gui 可以直接阅读代码,还是很方便的。但是毕竟没有我们常见的编辑器来的方便。而正好 jadx 还支持将反编译后的项目,直接导出成一个 Gradle 编译的工程。可以通过 File -> Save as gradle project 来激活这个功能。
在这里插入图片描述
最终输出的目录,是可以直接通过 Android Studio 打开的。不过虽然 AS 可以直接打开它,但是大多数情况下你是编译不起来的。但是这样的功能,主要是为了借助 AS 强大的 IDE 功能,例如方法跳转、引用搜索等等,让我们阅读起来更方便。

3、强大的搜索功能

jadx 提供的搜索功能,非常强大,而且搜索速度也不慢。你可以点击 Navigation -> Text Search 或者 Navigation -> Class Search 激活它,更方便的还是快捷键,我本机的快捷键是 control + shift + f,这个就因人而异了。
在这里插入图片描述
4、直接搜索到引用的代码

有时候找到关键代码了,还想看看在哪些地方调用或者引用了它。jadx 也提供了这方面的支持,找到我们需要查看的类或者方法,选中点击右键,选择 Find Usage。
在这里插入图片描述
之后,它就会帮你搜索出,在这个项目中,哪些地方引用了它。

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tr0e

分享不易,望多鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值