越狱调试Reveal、debugserver、Class-dum
一、Reveal
Reveal:界面、轻量级
Cycript:可以对内存访问
LLDB:可以看函数调用栈、下断点
1.1 Mac电脑安装Reveal
1.2 (越狱)iPhone,Cydia
安装Reveal Loader
安装Reveal Loader
之后,系统设置中会出现Reveal
打开系统设置页面进入Reveal
设置打开对应APP
1.3、环境配置
导入dylib文件,由于新版本的Reveal只有Framework文件,所以需要修改Framework的可执行文件为dylib库
找到相关库把RevealServer
拷贝到桌面,然后重命名为libReveal.dylib
,然后拷贝到手机目录中。
在手机的/Library 目录下新建目录$mkdir RHRevealLoader
,需要把libReveal.dylib
拷贝到RHRevealLoader
中。scp -P 12345 ~/Desktop/libReveal.dylib root@localhost:/Library/RHRevealLoader
重启手机(Reveal支持USB链接和Wi-Fi链接,如果使用Wi-Fi链接必须让手机和Mac保持统一局域网)
重启Mac的Reveal
二、debugserver
我们Xcode中的lldb可以调试手机中的应用,是因为手机中的debugserver开启的相关服务。所以在越狱环境中,我们只需要开启debugserver服务就可以利用LLDB远程调试三方应用了。
Mac中的debugserver,在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
中可以看到对应不同iOS系统版本的镜像文件
打开
DeveloperDiskImage.dmg
文件,进入usr/bin目录可以看到debugserver。这就是xcode安装到真机中的文件。1.1、iPhone启动debugserver、Mac连接debugserver(这里是Wi-Fi链接)
-
iPhone中开启debugserver服务。
$debugserver 主机地址:端口号 –a 应用进程
eg:./debugserver *:12346 -a WeChat
由于主机地址是当前手机,可以使用*代替
端口号:启动server服务,开放端口,让远程的LLDB通过sever调试进程 -
Mac上启动LLDB连接iPhone
启动LLDB,$lldb
连接debugserver,(lldb)process connect connect://手机IP:服务端口号
eg:process connect connect://192.168.254.240:12346
1、将debugserver
先拷贝到桌面,然后拷贝到手机上 scp -P 12345 ~/Desktop/debugserver root@localhost:~/
,最后会把debugserver
放在/usr/bin/
目录下,可以在任何地方都可以用debugserver
了
2、./debugserver *:12346 -a WeChat
,iPhone中开启debugserver服务,手机WeChat界面已经没法动了
3、启动LLDB $lldb
,链接debugserver process connect connect://192.168.254.240:12346
,这个是Wi-Fi链接有点慢
(lldb) c
就能动了
(lldb) exit
退出,一退出应用就挂掉了,相当于杀掉应用
1.2、usb链接
1、端口映射
2、./debugserver *:12346 -a WeChat
,iPhone中开启debugserver服务,手机WeChat界面已经没法动了
3、启动LLDB $lldb
,链接debugserver process connect connect://localhost:12346
,这个是usb链接
(lldb) process interrupt
进入暂停状态
pvc
、pviews
、po 0x156911000
只有在暂停状态
这些指令才有用哦
找到target和action
(lldb) p [(UIButton *)0x157ef94e0 allTargets]
(__NSSetM *) $7 = 0x0000000157abb4f0 1 element
(lldb) po 0x0000000157abb4f0
{(
<WCAccountNewPhoneVerifyViewController: 0x156aa5200>
)}
(lldb) p [(UIButton *)0x157ef94e0 actionsForTarget:(id)0x156aa5200 forControlEvent:64]
(__NSArrayM *) $9 = 0x0000000157f45f00 @"1 element"
(lldb) po 0x0000000157f45f00
<__NSArrayM 0x157f45f00>(
onNext
)
(lldb) methods WCAccountNewPhoneVerifyViewController
(lldb) b 0x100479e38
方法地址(物理地址) = 偏移地址(ASLR) + 文件偏移地址(.hop中的地址,包含了1(_PAGEZERO))
1.3、手机中的debugserver
-
系统自带的
debugserver
,/Developer/usr/bin/
-
自己的
debugserver
,配置到/usr/bin/
目录中
1.4、把手机上的MachO拷贝到电脑
scp -P 12345 root@localhost:/var/mobile/Containers/Bundle/Application/1C5755EA-C7FD-4828-BCE2-40E38D467121/WeChat.app/WeChat ~/Desktop/
三、Class-dump
Class-dump是一个命令行工具,它通过查找MachO文件的相关段可以导出未经加密的APP的头文件。在逆向开发中,砸壳之后的第二件事就是使用它导出头文件。
安装
官网
下载class-dump $ git clone https://github.com/nygard/class-dump
拉下来
编译项目,生成命令行工具。直接使用。
将命令行工具导入/usr/local/bin/class-dump , 上权限 $sudo chmod +x class-dump
使用
命令格式:
单一架构:$class-dump –H MachO文件 -o 头文件存放目录
eg:class-dump -H WeChat -o ./headers/
或 class-dump -H WeChat -o ./headers
多种架构:加上--arch 架构 如arm64:$class-dump --arch arm64 –H MachO文件 –o 头文件存放目录
eg:class-dump --arch arm64 -H Course -o ./Headers
1.1、Monkey中集成了Class-dump
1.2、Monkey项目中使用Class-dump
a、创建一个Monkey项目
b、TargetApp中添加越狱的.ipa包(eg:微信-7.0.5(越狱应用))
c、TARGETS
的 MonkeyClassDump
的 Build Settings
中搜索MONKEY,把MONKEYDEV_CLASS_DUMP
改为 YES
d、build一下,会出现WeChat_Headers
文件下,里面就是head了
四、命令行工具
一个命令行工具,其实就是一个程序。只要架构正确就可以执行
1、创建一个工程,写入如下代码
2、build一下,Show in Finder
,显示包内容
,找到可以执行文件
3、来到文件夹下,./
执行,file
查看。arm64只能在手机上执行,然后移动到手机中
4、拷贝到手机中 scp -P 12345 DYZCmdTool root@localhost:~/
,然后执行
5、带参数的,重复以上操作
./DYZCmdTool
./DYZCmdTool -a -b -c -d
五、LLDB手动砸壳
原理把手机内存中解密的部分拷贝出来,然后和加密的MachO对比,覆盖掉加密的
利用lldb导出内存中解密了的二进制数据
1、将手机上运行的微信的MachO拷贝到电脑桌面 scp -P 12345 root@localhost:/var/mobile/Containers/Bundle/Application/1C5755EA-C7FD-4828-BCE2-40E38D467121/WeChat.app/WeChat ~/Desktop/
cryptoff 16384
从这里开始加密。这里是十进制
cryptsize 101646336
这么大的大小是加密了的。这里是十进制
cryptid 1
加密算法为1
2、获取手机上微信MachO的物理地址0x00000001000b8000
2.1、DYZyueyu5s:~ root# debugserver *:12346 -a WeChat
2.2、(lldb) process connect connect://localhost:12346
3、内存文件拷贝(LLDB指令) memory read --force --outfile 输出文件路径 --binary --count 文件长度 内存地址(开始地址)
memory read 命令
--outfile 导出文件
--count 指定读取的数据大小
eg: memory read --force --outfile ./decryption.bin --binary --count 101646336 0x00000001000b8000+16384
4、合并文件(终端指令) dd seek=开始合并地址 bs=1 conv=notrunc if=输入文件路径 of=输出文件路径
dd命令写入源文件
seek 指定偏移
conv=conversion 保留没有替换的部分
eg: dd seek=16384 bs=1 conv=notrunc if=./decryption.bin of=~/Desktop/WeChat
5、把Crypt ID
改为 0,保存
6、class-dump -H ~/Desktop/WeChat -o ./Headers