技术分享,一直都是让人比较无奈的事情。分享的东西对于不感兴趣的童鞋而言,简直枯燥无味,而对于大佬而言,又是关公面前耍大刀。
没办法,硬性指标...
今天这里分享下,在公司做的技术分享,关于逆向的一些基础知识~
逆向简述
逆向的本质,是对现有软件和硬件系统的反向分析,其目的,更多的是从中发现各种安全漏洞,进一步提升健壮性,同时减少相关漏洞带来的实际损失。
例如某银行曾出现的黑客攻击,导致大量客户信息泄漏,最终盗刷巨额账户资金。
其实,透过现象看本质,想去更为深入的了解 Android 内部原理、机制、别的团队设计思想以及实现方法,逆向不为是另一种最佳选择。
例如,之前做某黑产应用,竞品实现的微信借壳分享关键代码,也是通过逆向的方式间接获取参考并实际应用的。
所以,掌握部分逆向技术,对于深入 Android 还是具有一定优势。
逆向工具简述
以下是一些常用的 Android 逆向工具以及它们的地址链接:
Apktool:反编译 APK、编译、签名工具,可以获取 APK 中的资源和代码。
GitHub 地址:
https://github.com/iBotPeaches/Apktool
dex2jar:将 DEX 文件转换为 JAR 文件,便于反编译 Java 代码。
GitHub 地址:
https://github.com/pxb1988/dex2jar
JD-GUI:Java 反编译器,可以将 JAR 文件和 APK 文件中的类文件反编译为 Java 代码。
官方网站:
https://java-decompiler.github.io/
JADX:Java 反编译工具,可以将 APK 文件反编译为 Java 代码。
GitHub 地址:
https://github.com/skylot/jadx
Frida:一款动态插桩工具,可以用于 Hook 应用程序中的函数、拦截系统调用等。
GitHub 地址:
https://github.com/frida/frida
Burp Suite:一款用于渗透测试的工具,可以拦截 HTTP(S) 流量,并提供各种功能,如拦截、修改、重放、验证等。
官方网站:
https://portswigger.net/burp
Wireshark:一款网络协议分析工具,可以捕获网络流量并分析其中的数据包。
官方网站:
https://www.wireshark.org/
IDA Pro:一款功能强大的反汇编器,可以对二进制代码进行静态分析。
神器 动态下钩子 动态调试 smail~ 官方网站:
https://www.hex-rays.com/products/ida/
Xposed Framework:一款基于动态链接库注入的框架,可以用于修改应用程序的行为、增强功能等。
GitHub 地址:
https://github.com/rovo89/Xposed
通过 ApkTool 修改 App Name/Logo
安装说明
这里附上关于 ApkTool 安装步骤:
下面附上实际的安装步骤,这里以 Mac OS 为准。
这里说下安装遇到的几个小问题,先附上截图:
其实这里遇到的都是权限导致的一些问题,如果是新电脑的话,建议直接是 sudo 大法走起。
另外,遇到的一个问题就是在 mac OS 中将文件后缀修改了,但是移动到目标目录里面,通过 ls 查看后续依然没变,所以为了省事儿,还是直接将下载的两个文件直接移动到 /usr/local/bin 目录中,然后继续通过 sudo mv 进行对应的修改更方便吧。
最后别忘记授权 chmod +x
实战操作
目标:
修改蘑菇启动 logo 以及 name
步骤:
通过 apktool d [target.apk] 命令,对目标 apk 进行解包操作:
res/string 文件中直接搜索 app_name,并修改为指定名称:
随后依次替换 mipmap 文件中的 ic_launcher 图片即可:
接着通过 apktool b [apktool 解包目录名称] 进行回包操作:
回包过程中如果出现以下问题:
W: ERROR: Failure processing PNG image 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 次。
这里给出工具方法,有需要的小伙伴可以自己操作,这里不做过多详解。
另外不得不提 Android 后续的 V2、V3 等签名机制,个人的理解,还是通过增加更多信息的校验规则,不断完善证书签名的有效性以及安全性吧。
掌握逆向的作用/意义
首当其冲,则是对于 Android 整个体系的融会贯通,了解内部工作原理和实现方式,便于后续应用开发提供更有力的参考依据;
优化,通过逆向分析,可以发现其中存在的一些性能、逻辑、代码的相关问题,更好的完善,更好的提升应用的健壮;
了解竞品,更好的借鉴参考,应用本产品中;
更深入的了解后,也可以专门针对应用攻防进行深入探究。
常规反逆向的方案
需要注意的是,以上的方案并不能百分百防止 Android 被逆向,只是增加逆向的难度和成本,间接提升安全性。
其实就矛与盾的关系一样。
欢迎各位关注
不定期发布
见证成长路