准备工具, 安装,使用
- 可能需要工具
名称 | 作用 |
---|---|
apktool | 用于查看, 解压, 再编译apk |
jadx | dex 反编译器 |
dex2jar | dex反编译成jar |
frida | 动态调试工具 |
xposed | hook框架, 可用于hook系统,app的api |
ddms | Dalvik Debug Monitor Service, Dalvik 虚拟机调试监控服务 |
wireshark | 抓包工具 |
fiddler | 抓包工具 |
ida | 可交互式的反汇编器, 在linux, free版本不支持arm架构,正版比较贵, 使用ghidra替代 |
Ghidra | 开源的逆向工程分析工具,高度可扩展, 可替代IDA |
gdb | 很强大的调试器, 非常有必要学习 |
lldb | 新一代的高性能的调试器 |
qemu | 虚拟环境模拟 |
platform tools | android平台工具 logcat, adb, fastboot, linux下的一些工具 |
其他工具 | 更多的工具随着后面更深入的学习再进行统计, 以上的工具学会使用, 便可以开始初步的逆向学习了。 |
uiautomatorview | android sdk tools下的工具,可以查看当前UI页面的UI层级 |
010editor | 二进制查看,编辑工具 |
<++> | <++> |
<++> | <++> |
- 工具安装
archlinux的AUR很强,根据包名模糊搜索, 基本上都可以找到相应的包, packman或yaa安装即可, 有部分包找不到或者是正版的,一般也都会有相关的替代品可用。 目前统计的工具里,就是IDA 使用不了, 这里使用Ghidra替代。
好的工具可以事半功倍,但是没有了特定的工具,也不是事情就进行不下去了,要么自行开发,要么搜索其他替代的工具, 或组合出工具来使用。关键是要了解所需工具的作用与目的, 抽象出工作流的思维, 完善自己的工具即可。
当一件事重复性比较高,或者比较耗时耗力, 就需要去寻找或者开发相应的工具来减少工作量。
# 根据包名模糊搜索, 然后找到相应的包安装即可
yay -Ss <package_name>
yay -S <package_name>
- 使用指令
有的工具带有gui, 每个工具肯定会有命令行。 记录一些常用的命令,更详细的使用还需查看文档。
# apk 解压
apktool d <apkname> [-o <outpath>]
# dex 反编译
# jar 反编译
# ddms 调试
# 查看当前activity
adb shell dumpsys activity top | grep ACTIVITY
- 前置知识
Android开发技能
smali 语法
arm汇编指令
- 资源
CTF竞赛入门指南 里有相对较全面的逆向安全方面的学习知识。
apk 组成
lib目录:主要存放用C/C++编写的native部分。里面又根据不同的cpu架构存放着不同的so文件,分析so文件的时候就到这个目录里找。
AndroidManifest.xml文件:资源配置文件,和开发中一样,只不过进行了加密打开全是乱码。
res目录:和开发时一样,存放着程序会使用到的布局、图片等等资源。
META-INF目录:保存应用的签名信息,对apk的完整性进行校验,我们逆向对程序进行修改之后都要删掉这个文件重新签名。
assets目录:存放静态资源,通过AssetsManager类访问,一下加壳的apk会把加密之后的源apk存放在这里。
resources.arsc文件:用来记录资源文件和资源ID之间的映射关系,用来根据资源ID寻找资源。
classes.dex文件:开发时所编写的Java部分编译之后就存放在这里。传统的Java编译生成.class文件并运行在JVM上。有可能是谷歌为了规避版权上的纠纷,也有可能是手机的资源有限,谷歌专门设计了Dalvik虚拟机来运行.dex文件。而.dex文件就是经过dx工具对.class文件的常量池进行整合所生成。相比于.class文件,.dex文件体积更小,执行速度更快。并且Java虚拟机基于堆栈,但Dalvik虚拟机基于寄存。
oat 后缀的文件: 使用dex2oat翻译后的本地机器码文件
dalvik 和 art 虚拟机
首先, 不管是 dalvik 还是 art, apk 中所有的代码还是放在 classes.dex 中.
区别是:
1. dalvik 是实时将 classes.dex 中的java字节码转换成机器码, 而 art 是安装时就转换成机器码。
对于此不同点,art 的优点是字节码加载快,缺点是安装速度慢, 占用更多的磁盘空间, 但对于现在的手机来说, 这点空间是小意思。
2. art 对内存回收做了优化
3. art 对内存利用率做了优化
所以, 不管是dalvik 还是 art, classes.dex 还是通用的字节码文件, 反译出来是 smali 语言
smali 语言是虚拟机字节码的汇编语言,通过编译器编译成不同平台的字节码
因此,逆向的大体思路仍是反编译apk中的dex, 再将dex反编译成jar, 可以调试smali语言,也可以看反编译后的java代码,由于混淆等反逆向手段, 通常都是两个语言结合着看, 逆向出上层逻辑。
心理模型
心理模型,是用于解释人的内部心理活动过程而构造的一种比拟性的描述或表示; 是经过组织的知识结构,使个体能与环境相互作用; 是对于周遭世界如何运作的看法和行为。
我所理解的心理模型, 就是在处理一个问题,一件事的时候,心是所想,大脑所思考的一种方式, 抽象成一种流程,一种套路, 一个思维框架。
不同领域,有不同的心理模型, 逆向的思维会涉及到不同的领域,每个领域会有不同的心理模型,而逆向本身也有一些共通的心理模型。
逆向的心理模型的建立过程涉及到: 编译与反编译, 对抗反逆向,工具的使用,正向开发的思维,底层承载框架的原理, 逆向需求目标
逆向的通用模型:
反编译出可阅读代码, 这里需要对抗反编译手段,如混淆,加壳, 虚拟机保护
查找,学习工具的使用,将贯穿整个逆向过程,脱壳工具,反编译工具,调试工具,抓包工具,内存读取, 虚拟机环境等等
然后是分析代码,这个过程需要有目标的去定位,通过运行相关的业务,抓包,查看信息栈等手段,找到特征字符串,类名,方法名,再定位到源码位置去分析。
接着是提高代码分析的效率, 就需要借助各种调试工具。
接下来的攻击的步骤, 涉及到注入,hook, 回编, 代理等手段。
其他专业的心理模型:
这与具体的业务领域强相关,大多数时候必须得懂正向的开发知识,思路会更加清晰,也会更加高效。
逆向是渗透的一个分支, 相对于代码层面的技术分支, 渗透还包括社会工程学, 认知心理学, 网络安全,物理渗透等。
逆向是一把双刃剑,游走在善与恶的边缘, 一念之间就是白帽子与黑客的转换。
这里有一篇逆向工程经验谈讲得不错。
总结
在linux下搞Android逆向好像更加合适,毕竟Android使用linux内核,链接库和可执行文件都是elf, 工具链高度重合, 缺点是,工具使用也需要学习成本,想要达到一个高效的工作流,学习门槛是比较高的, 然而我认为这是值得的。
逆向心理模型的建立是很有必要的, 心理模型也相当于战略思维,能保证大方向不走弯路,继而更准确地去解决所遇到的更具体的问题。
搞逆向前,需要先搞几年的正向开发, 个人是赞同的。