冬令营Day2:移动应用程序逆向
安卓应用程序结构
- AndroidManifest.xml(清单文件)
- dex(java代码编译后的文件)
- res(ui布局、颜色、字符资源文件)
- lib(第三方库)
- assets(静态的音视频文件)
- META.INF(签名)
安卓应用四大组件
- Activity
- Service
- Broadcast Receiver
- Content Provider
反编译
dex反编译
- dex -> smali
- baksmali
- dex -> smali -> java
- Jeb
- apktool
- dex2jar
so反编译
- elf -> arm指令
- IDA
- Radare2
- Ghidra
- arm -> C++
- IDA f5
- Ghidra
定位逆向目标
- 关键字定位
- 关键字
- Grep
- 反编译的静态代码
- Dump动态代码
- 监控文件变化
- 资源定位
- 定位UI中的资源变量名
- ddms
- uiautomatorviewer
- dumpsys
- res目录中对应的索引值
- 在smali代码中grep所有对该索引值的引用
- 定位UI中的资源变量名
- 日志定位
- adb logcat | grep
- 日志文件
- app目录下
- Sdcard
- 打开app内置的日至开关
- 重打包
- hook
- smali注入
- 调用栈跟踪
- ddms method profiling
- hook系统函数打印call back
核心目标逆向
-
静态分析
- 直接分析smali代码
- 分析伪java代码
- 直接分析arm指令
- 分析伪C++代码
• smali代码
•类
• 基本数据类型
• 寄存器
• 函数和函数调用 • 代码块和跳转• ARM指令
• 寄存器 SP、PC、LR • 传参方式
• 跳转 B、BL、BX、BLX • 存储器访问• 数据处理
• arm和thumb切换 -
动态调试
- AS 调试(smali动调)
- IDA动调
- Smali注入
- hook技术
• Smali代码注入(插桩)
• 注入方法
• 反编译 -> 修改smali代码 -> 重打包• 使用场景
• 批量打印log• 控制流分析
• 数据流分析
• 可能存在的问题 • 重打包失败• 签名检查
• 寄存器维护• Hook技术
• 使用场景
• 注入到目标代码,改变执行结果 • 获取某一状态下的变量值
• hook的本质 • 代码注入
• Hook工具
• Xposed 替换app_process• Frida Ptrace注入
frida和xposed hook
frida
一般在root手机上运行 由于frida app是后台app,所以一般用attach附加
- 在native上的hook
Android应用安全保护和对抗
干扰反编译
- 利用反编译工具的bug或者漏洞
- AndroidManifest.xml
- dex
- so
- 转化为伪代码的bug
- smali -> java
- arm -> C++
- 链接资源文件时的bug
- 特殊的资源文件
- 超长的资源id
- 案例
- xxe漏洞
- 无效代码使反编译工具的CPU耗尽
- 添加无效的资源文件,使apktool编译失败
- 资源id越界导致链接时Crash
- 添加特殊编码字符,使反编译工具Crash
- 对抗
- 反编译不链接资源文件 -no-resource
- 使用新的反编译工具
- 直接分析底层代码
- 打造自己的逆向环境
代码混淆
-
目的:将代码变得难以阅读
-
变量名、类名、方法名混淆
-
超长名字 00o0ooo00ooo000ooo
-
相似字符 mabin -> m4bln
-
特定含义的代码 int int= 5
-
特殊编码 ȷava \u0237
-
难以阅读的字符
-
-
-
字符串加密
-
编码
-
进行各种加密
-
-
控制流混淆
-
运算混淆
- 控制流伪造
- 控制流平坦化
- 控制流伪造
-
代码混淆工具
-
java代码
- ProGuard
- DexGurad- C++代码
- OLLVM
- C++代码
-
混淆带来的问题
- 运行不稳定
- 开发调试困难
- 执行效率
-
什么app会使用混淆
- 受众基础大的APP不会使用“变态”的混淆方式
- 即使混淆,也只是一小部分核心逻辑
- 老版本的APP一般不会混淆
- 纯混淆的CTF题目很无聊
- 企业级的APP
-
对抗代码混淆
- 变量名、类名、方法名混淆
- 变量重命名 jeb、重打包
- 寻找老版本app
- 根据开源代码映射
- 自动化 -> 自动化相似代码检测
- 字符串加密
- 静态分析替换
- 动态hook
- 控制流混淆
- 优化反编译工具
- 符号执行
- 硬核逆向
- 变量名、类名、方法名混淆
反调试
策略(一般是多种策略结合)
-
ptrace
-
检测TracePid的值
-
检测调试器
- 进程名
- gdb_server
- android-server
- 端口号
- IDA: 23946
- Frida: 27042
- 内存特征码
- 进程名
-
基于时间检测
对抗
-
找到所有的监测点并Patch
-
抢占先机hook 如frida
-
上帝模式修改系统
-
IDA绕过反调试https://blog.csdn.net/jltxgcy/article/details/50598670
加壳
- 加固
- Dex加固
- 指令抽取
- Dex加密
- java->C
- So加固
- So加密
- 函数动态加解密
- 虚拟机(vmp)
- Dex加固
dex
-
实际上的Android生命周期
-
Process.start->Application创建->attachBaseContext->onCreate->onStart->onResume->Activity生命周期
-
各厂商对比
可见原理上大致相同
-
dex脱壳
- hook dex加载函数
- dump内存重建dex
- 定制化系统
-
脱壳工具
- dumpdex
- FDex2
- Frida
总的来说,没有完全万能的脱壳工具,如果有能力自己编写一个是最好,没有的话Frida是最好用也最简单的但是要进行js的学习
so
-
有源码
- vmp
-
无源码
-
so加密
-
section加密
-
-
so脱壳
- 解密so
- hook loader
- 修复section
- dump内存
- vmp
- 硬逆
- 状态机
- 虚拟机入口
- 解密so
Frida hook
https://mabin004.github.io/2018/03/09/Android-Hook-%E2%80%94%E2%80%94-Frida/
一道极棒2017的第一题攻击&讲解
(之后再写)