我正在参加「掘金·启航计划」
前言
技术分享,一直都是让人比较无奈的事情。分享的东西对于不感兴趣的童鞋而言,简直枯燥无味,而对于大佬而言,又是关公面前耍大刀。
没办法,硬性指标...
今天这里分享下,在公司做的技术分享,关于逆向的一些基础知识~
逆向简述
逆向的本质,是对现有软件和硬件系统的反向分析,其目的,更多的是从中发现各种安全漏洞,进一步提升健壮性,同时减少相关漏洞带来的实际损失。
例如某银行曾出现的黑客攻击,导致大量客户信息泄漏,最终盗刷巨额账户资金。
其实,透过现象看本质,想去更为深入的了解 Android 内部原理、机制、别的团队设计思想以及实现方法,逆向不为是另一种最佳选择。
例如,之前做某黑产应用,竞品实现的微信借壳分享关键代码,也是通过逆向的方式间接获取参考并实际应用的。
所以,掌握部分逆向技术,对于深入 Android 还是具有一定优势。
逆向工具简述
以下是一些常用的 Android 逆向工具以及它们的地址链接:
- Apktool:反编译 APK、编译、签名工具,可以获取 APK 中的资源和代码。GitHub 地址:github.com/iBotPeaches…
- dex2jar:将 DEX 文件转换为 JAR 文件,便于反编译 Java 代码。GitHub 地址:github.com/pxb1988/dex…
- JD-GUI:Java 反编译器,可以将 JAR 文件和 APK 文件中的类文件反编译为 Java 代码。官方网站:java-decompiler.github.io/
- JADX:Java 反编译工具,可以将 APK 文件反编译为 Java 代码。GitHub 地址:github.com/skylot/jadx
- Frida:一款动态插桩工具,可以用于 Hook 应用程序中的函数、拦截系统调用等。GitHub 地址:github.com/frida/frida
- Burp Suite:一款用于渗透测试的工具,可以拦截 HTTP(S) 流量,并提供各种功能,如拦截、修改、重放、验证等。官方网站:portswigger.net/burp
- Wireshark:一款网络协议分析工具,可以捕获网络流量并分析其中的数据包。官方网站:www.wireshark.org/
- IDA Pro:一款功能强大的反汇编器,可以对二进制代码进行静态分析。官方网站:www.hex-rays.com/products/id…
- Xposed Framework:一款基于动态链接库注入的框架,可以用于修改应用程序的行为、增强功能等。GitHub 地址:github.com/rovo89/Xpos…
通过 ApkTool 修改 App Name/Logo
安装说明
这里附上关于 ApkTool 安装步骤:
下面附上实际的安装步骤,这里以 Mac OS 为准。
这里说下安装遇到的几个小问题,先附上截图:
其实这里遇到的都是权限导致的一些问题,如果是新电脑的话,建议直接是 sudo 大法走起。
另外,遇到的一个问题就是在 mac OS 中将文件后缀修改了,但是移动到目标目录里面,通过 ls 查看后续依然没变,所以为了省事儿,还是直接将下载的两个文件直接移动到 /usr/local/bin 目录中,然后继续通过 sudo mv 进行对应的修改更方便吧。
最后别忘记授权 chmod +x
实战操作
目标:
- 修改目标 app 启动 logo 以及 name
步骤:
实践:
通过 apktool d [target.apk] 命令,对目标 apk 进行解包操作:
res/string 文件中直接搜索 app_name,并修改为指定名称:
随后依次替换 mipmap 文件中的 ic_launcher 图片即可:
接着通过 apktool b [apktool 解包目录名称] 进行回包操作:
回包过程中如果出现以下问题:
W: ERROR: Failure processing PNG image /Users/heliquan/Downloads/apktool/test/res/mipmap-xxhdpi/ic_launcher.png W: libpng error: Not a PNG file
则代表不要直接通过修改图片格式的方式去调整图片格式,通过某些软件的导出,导出 png 即可。
此时的 test.apk 仅仅只是一个基础包,未签名的包,也可称为母包。
随后我们借助 360 加固工具,快速创建一个 keystore 证书:
随后继续借助该工具完成 apk 签名:
最后直接通过 adb 命令进行安装、验证:
有没有一种纵享丝滑的赶脚~
此种玩法弊端:
- 对应 app 三方不可用,sha1 值发生了变化
那么有没有一种方式,可以实现原包证书签名打包呢?
本质上是可操作的。
下面简单的进行拓展一下。
拓展篇
我们知道 Apk 的产生是我们将代码文件、资源文件以及相关配置进行构建打包,整合并输出到 apk 中。
那么我们同样也可以通过将 .apk 修改为 .zip,并解压,这里一起来看下解压后的目录,这里我们着重关注 META-Info 目录。
因为 Android 会将打包后的证书签名信息存储在 META-INF 目录中,当前也包含其他的一些常规配置。
这里简单的回顾下签名的意义:
- 防止应用被篡改;
- 保护应用完整性以及同类数据共享;
- 归属确认
还是老生常谈的话,既然生成对应的“保护文件”,那我们同样可以通过反向操作,得到最终的签名文件。
不过过程比较艰难了就,而且不同的证书对于密码的重试有一定的限制。
- 例如 jks 虽然是默认的 Keystore 类型,但是它的密码是以明文形式保存,而且没有重试次数的限制。
- 而 AndroidKeyStore 则支持重试限制,次数限制由设备厂商决定,通常次数限制为 10 次。
这里给出工具方法,有需要的小伙伴可以自己操作,这里不做过多详解。
- 通过 keytool/OpenSSL 工具 解析 CERT.RSA 文件,提取证书信息;PS:如果对方的签名是 jks,猜测可以通过撞库暴力破解。keystore 知识盲区了就。
- 随后通过 keytool 工具创建新的签名文件,同时保障相同的 SHA1。
另外不得不提 Android 后续的 V2、V3 等签名机制,个人的理解,还是通过增加更多信息的校验规则,不断完善证书签名的有效性以及安全性吧。
Smail 文件简述/学习
Smail 是 Android Dex 文件的汇编语言,它被用于将 Dex 文件中的字节码转化为可读的文本格式。
个人针对 Smail 的学习,更多的建议是通过自己编写一个简单的登录 demo,借助 apktool 工具进行解包,随后对照着「Dalvik虚拟机操作码」手册,进行 smail 代码解读,并修改对应代码,最后进行 apktool 回包。
这里比较枯燥,不一一阐述了,
掌握逆向的作用/意义?
首当其冲,则是对于 Android 整个体系的融会贯通,了解内部工作原理和实现方式,便于后续应用开发提供更有力的参考依据;
优化,通过逆向分析,可以发现其中存在的一些性能、逻辑、代码的相关问题,更好的完善,更好的提升应用的健壮;
了解竞品,更好的借鉴参考,应用本产品中;
更深入的了解后,也可以专门针对应用攻防进行深入探究。
常规反逆向的方案
- 加密,做好防御式编程,核心组件使用不同的加密方案,提升逆向难度,密钥信息可 so 化存储;
- 混淆:通过混淆代码中的类、方法、变量名,提高反编译出来的代码可阅读性。当然混淆的规则也可以自定义,而我们的资源文件,同样也可以进行混淆,提升安全的同时也可以大幅度减少 Apk 大小,此处可自行搜索微信压缩方案;
- 移除调试信息:在编译 Apk 的时候,去掉调试形式,使得调试工具无法使用;
- 加固:通过对 Apk 进行加密或者二次加密,提升反编译难度以及增加调试难度。目前市面上较为成熟的,个人更推荐 360 加固,最近看个人版也开始有限制了;
- 动态加载:将一些核心代码放在服务器,通过动态下发的方式,提升安全的同时,减少本地静态代码的暴露。当然此方案需要搭配完整的兜底容错方案;
- Root/Xpose 化检测收集,完善用户画像,增加风控。之前针对 Root/Xpose,某些产品的方案是直接闪退,残暴的同时,其实也没啥卵用,也可以绕过去。
需要注意的是,以上的方案并不能百分百防止 Android 被逆向,只是增加逆向的难度和成本,间接提升安全性。
其实就矛与盾的关系一样。