iOS逆向笔记

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

官网:http://www.cycript.org

通过Cydia安装

开启

1
2
3
cycript
cycript -p 进程ID
cycript -p 进程名称

取消输入: Ctrl + C

退出: Ctrl + D

语法

提示 tab键可代码补全

1
2
3
4
5
6
UIApp # 等价于 [UIApplication sharedApplication]
var window = UIApp.keyWindow # var定义一个变量
UIApp.keyWindow.rootViewController

# 创建一个view
var view = [[UIView alloc] initViewFrame: CGRectMake(0,0,100,100)]
使用内存地址可直接访问对象
1
2
UIApp.keyWindow # 内容显示 0x00001010
#0x00001010.rootViewController
已加载的所有OC类

ObjectiveC.classes

查看对象的所有的成员变量
1
2
*对象
*UIApp.keyWindow
递归打印view的所有成员变量
1
2
[UIApp.keyWindow recursiveDescription].toString() # toString 可排版
UIApp.keyWindow.recursiveDescription().toString()
筛选
1
choose(UIViewController) # 会筛选出所有UIViewController

加载.cy文件

.cy文件存放位置

/usr/lib/cycript0.9

加载方法

1
@import xxx

Reveal

环境配置

  1. iPhone上安装Reveal Loader (http://apt.so/codermjlee)
  2. Reveal->help->Show Reveal Library In Finder -> iOS Library (RevealServer.framework/RevealServer) 覆盖iPhone/Library/RHRevealLoader/RevealServer
  3. 重启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上用于存储程序、库的标准格式