在Android应用的逆向工程中,我们经常会遇到开发者为了保护代码安全而采取的各种混淆和加密技术。下面我将简单介绍下这些技术以及可能的解决方案和工具,梳理下大致的逆向流程
逆向常用工具
在Android逆向工程中,一些工具可以帮助我们分析应用程序:
1.jadx:可以把APK文件中的DEX代码转换成Java代码。
2.jeb:一个强大的反编译器,支持多种编程语言。
3.IDA Pro:一个专业的反汇编工具,可以分析APK中的本地代码。
4.MT管理器:在Android设备上,它是一个方便的文件管理器。
Hook工具
Hook技术是一种在运行时拦截和修改应用行为的方法:
1.frida :一个非常流行的动态代码注入工具。
2.xposed:一个框架,可以在不修改APK的情况下改变应用的功能。
3.unidbg:一个模拟运行Android程序的库。
混淆和加密技术
开发者会使用混淆和加密技术来保护应用:
- 包名、类名和方法名混淆:将代码中的名称替换为难以理解的字符。
- 字符串混淆:将代码中的字符串通过加密存储。
- 花指令:插入一些不影响程序运行的指令。
- JNI函数混淆:在Java Native Interface中使用混淆技术。
- OLLVM混淆:使用LLVM工具链进行代码混淆。
解决思路
- 静态分析:不运行程序,仅通过查看代码来分析。
- 动态分析:运行程序,观察和修改程序的行为。
- 日志注入:在程序中注入日志输出。
- 动态调试:使用调试器逐步执行程序。
- 技巧补充:通过搜索特定的代码片段或使用特定的工具来辅助分析。
加固和脱壳
加固是增加应用安全性的过程,脱壳则是去除这些保护措施的过程:
- 加固概念:通过代码混淆、数据加密等手段提高应用的安全性。
- 查壳工具:用来检测应用是否使用了加固技术。
- 脱壳工具:用来去除应用的加固保护。
常见检测及绕过
应用可能会检测是否被逆向工程,以下是一些常见的检测手段和绕过方法:
- 双进程保护:应用运行两个进程相互监控。
- 权限检测:应用检测是否有未授权的权限。
- 调试端口检测:应用检测是否连接了调试器。
- 进程名检测:应用检测运行的进程名是否正常。
- 系统函数检测:应用检测是否被某些系统函数调用。
- 执行时间检测:应用检测执行是否过快。
实际例子
假设我们要分析一个Android应用的加密算法:
- 使用
jadx
打开APK文件,查看应用的源代码。 - 使用
frida
进行动态分析,在应用运行时注入自定义的JavaScript代码。 - 使用
IDA Pro
分析so文件,理解C/C++代码。 - 如果应用进行了加固,可能需要先进行脱壳。