iOS 逆向 笔记
逆向App的思路
界面分析
Cycript、Reveal
代码分析
对Mach-O文件的静态分析(MachOView、 class-dump、Hopper Disassembler、ida等)
动态调试
对运行中的APP进行代码调试 (debugserver、LLDB)
代码编写
注入代码到APP中,必要时可能需要重新签名、打包ipa
苹果源码
https://opensource.apple.com/tarballs/
ipa砸壳
首先获取一个砸壳的ipa,好像都需要一部越狱手机,我没有直接在pp助手下载了一个。
导出头文件
使用class-dump导出头文件
下载 class-dump 后把 class-dump 放入 /usr/local/bin
目录下,并修改权限:
1 | sudo chmod 777 /usr/local/bin/class-dump |
执行 class-dump 命令:
1 | class-dump -H [xxx.app所在的位置] -o [头文件导出的位置] |
Hopper 反编译
使用方法很简单,下载安装后直接将破壳后的.app文件拖进去即可
它有四种显示模式,分别是:汇编模式
、控制流图模式
、伪代码模式
、十六进制模式
,我们主要通过伪代码模式
来查找方法调用,找到需要Hook的方法。
Hook
使用 CaptainHook Hook 代码
CHDeclareClass
作用是声明需要Hook的类CHMethod
作用是对应的方法Hook的实现CHConstructor
作用是用于加载Hook的方法和所在的类CHLoadLateClass
加载Hook类CHHook
注册Hook方法
MonkeyDev
MonkeyDev 帮我们简化了 Hook的流程,只关心具体的代码实现。他帮我们做了:
- 创建dylib, hook类的属性或方法
- 将dylib注入App中
- 冲签名ipa文件
Cycript
通过Cydia安装
开启
1 | cycript |
取消输入: Ctrl + C
退出: Ctrl + D
语法
提示 tab键可代码补全
1 | UIApp # 等价于 [UIApplication sharedApplication] |
使用内存地址可直接访问对象
1 | UIApp.keyWindow # 内容显示 0x00001010 |
已加载的所有OC类
ObjectiveC.classes
查看对象的所有的成员变量
1 | *对象 |
递归打印view的所有成员变量
1 | [UIApp.keyWindow recursiveDescription].toString() # toString 可排版 |
筛选
1 | choose(UIViewController) # 会筛选出所有UIViewController |
加载.cy文件
.cy文件存放位置
/usr/lib/cycript0.9
加载方法
1 | @import xxx |
Reveal
环境配置
- iPhone上安装Reveal Loader (http://apt.so/codermjlee)
- Reveal->help->Show Reveal Library In Finder -> iOS Library (RevealServer.framework/RevealServer) 覆盖iPhone/Library/RHRevealLoader/RevealServer
- 重启SpringBoard(killall SpringBoard)或手机
Class-dump
将Mach-O文件中的class信息导出来(dump),生成对应的.h头文件
官方地址:http://stevenygard.com/projects/class-dump/
下载完工具包后将class-dump文件复制到/usr/local/bin目录,这样就可以在终端识别class-dump命令了
常用格式
1 | class-dump -H Mach-O文件路径 -o 头文件存放路径 |
报错处理
我的class-dump是官网下载的,在使用class-dump -H报错Error:Cannot find offset for address 0xd80000000101534a in stringAtAddress:由于我项目使用了Swift和Oc混编,猜测可能是官网的class-dump不支持dump swift files导致。
解决办法:
从链接https://github.com/AloneMonkey/MonkeyDev/blob/master/bin/class-dump中重新下载class-dump拖入到路径:**/usr/local/bin**
若执行class-dump命令报错 /usr/local/bin/class-dump: Permission denied,在终端运行
sudo chmod 777 /usr/local/bin/class-dump
命令赋予所有用户可读可写可执行class-dump文件权限
最后运行class-dump即可。
Hopper Disassmbler
将Mach-O文件的机器语言代码反汇编成汇编代码、OC伪代码或者Swift代码
动态库共享缓存
从iOS3.1开始,为了提高性能/节省内存,绝大部分的系统动态库都打包存到了一个缓存文件中(dyld shared cache)
/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX
动态库的加载
在Mac/iOS中,是使用了/usr/lib/dyld来加载动态库 (dynamic link editor)
Mach-O
Mach-O是Mack object的缩写,是Mac/iOS上用于存储程序、库的标准格式