上节课回顾
image.png
debugServer的权限问题
- 链接手机
- cd /Developer/usr/bin/ -> ls -> 查看是否有debugServer
- touch 123.txt -> 发现是没有权限的
- 所以将debugServer拷贝到/usr/bin里面 -> /usr/bin/debugServer
- ls -l debugServer -> 查看权限
- 将该文件拷贝出来 -> scp -P 12345 root@localhost:/usr/bin/debugServer ./debugServer
- theos资料 ->debugserver.entitlements ->拷贝到当前目录下
- ldid -e debugserver > debugserver.entitlements -> 将debugserver里面的权限导出来
image.png
- 将上图两个key值对应的设为1
- ldid -Sdebugserver.entitlements debugserver -> 给debugserver重新设置权限
- 然后将修改后的debugserver拷贝到/usr/bin里面进行覆盖,这样全局都能用。
class-dump(MonkeyDev的使用)
- class-dump -> 查看class-dump的版本
- which class-dump -> 查看class-dump放在哪里
- Build Seting -> Monkey -> class-dump -> YES -> 重签的时候可以顺便帮你提取头文件
- MonkeyDev的路径不能有中文,否则有可能提取失败
命令行工具
- 快速建一个工程
image.png
- printf("打印") -> 编译 -> 来生成一个MachO文件
- 将该文件拷贝到手机 -> ./可执行文件 -> 执行
image.png
手动砸壳
- 我们是通过otool -l Wechat | grep crypt里面的cryptid字段来判断一个包是否加密的
- 链接手机找到微信 sp -A | grep Wechat
- scp -P 12345 root@localhost:微信手机路径(上一步可获取) ./ -> 将手机里面的拷贝出来 -> 查看权限,发现此时我们拿到的是一个未砸壳的微信包
- 直接WeChat的包 -> MachOView -> Load Commands -> INFO_64 -> 直接改0 -》 com + s 保存
- 直接calss-dump 这个包 -> class-dump -H Wechat -o headrs/ -> 发现不行
- otool -l Wechat | grep crypy -> 拿到偏移值off 和 size
- 手机debugserver localhost:12346 -a WeChat(17116用进程编号比较好) -> 附加进程
- 电脑lldb -> process connect conect://localhost:12346 -> 链接手机
- com + w -> 可以不杀掉进程,而退出lldb调试,使用exit同时会杀掉手机进程
- Xcode附加也可以 -> 建议用这种,比较快
- image list -> 拿到首地址
image.png
- 断点调试 -> memory read --force --outfile ~/Desktop/WeChatDump/WeChat.bin --binary --count 前面拿到的size + 首地址 + 偏移
image.png
- 将内存中的WeChat拷贝到桌面, 桌面文件夹要提前创建
- 所拷贝就是解密后的包
15 dd seek=16384 bs=1 conv=notrunc if=./Wechat.bin of=WeChat
- 把.bin文件写入WeChat(未砸壳的),seek->跳过多少字节,bs->一次写入多少字节,notrunc不截断文件,只进行覆盖操作
- 上面的写入比较慢,因为是一个一个字节写的,最后用class-dump进行验证
- 写入之后,需要手动改下cryptid
- class-dump -H Wechat -o headrs/ -> 手动砸壳成功
消除系统气泡小插件
- SpringBoard -> 系统桌面APP
- ps -A | grep Spring -> 找桌面的APP位置 -> 拷贝出来并且class-dump拿到头文件
image.png
- 可以用Xcode进程附加以及Cycript来分析系统的APP界面,最好是用Xcode进程附加找会比较快(这里我的实操是可以的, 如果附加失败的, 自己搜寻相关解决方案)
- 也可以通过Cycript来查看图层, 最终找到SBIconParallaxBadgeView, 这个视图
- 直接将SBIconParallaxBadgeView的初始化返回为空
- export THEOS_DEVICE_IP=localhost / export THEOS_DEVICE_PORT=12345 -> 这两个东西经常要用, 所以可以放在./zshrc里面
image.png
image.png
- 将文件夹放在桌面(放置路径有中文,导致编译不成功)
cd 桌面文件夹 make -> 编译 make package;make install -> 安装到手机, 可以同时执行 -> 可以看到APP所有气泡都消失了
MonkeyDev中Logos Tweak
- 打开MonkeyDev中的Logos Tweak -> 新建工程 -> 放在桌面(放置中文路径)
- Library文件夹下找 -> BadgeTweak.plist -> 找到要附加的进程
- Build Setting -> Monkey -> MonkeyDevBuildPackageOnAnyBuild -> 插件,每次编译是否安打包
1.MonkeyDevInstallOnAnyBuild -> 每次编译就安装,默认为Yes,所以插件不要随便编译
2.IP -> localhost
3.Port -> 12345 -> 当然也可以在./zshrc中配置(手动配置或./zshrc中配置都可以)
image.png
4.先映射一下
5.MonkeyDevkillProcessOnInstall -> 安装完后,需要杀掉的进程, 此处是SpringBoard
6.签名Build Settrings -> signing -> Code Signing Identity -> iOS Developer
7.失败的话, 如果代码没错, 清理一下缓存,再安装试试
Theos原理
- 拿到一个theos的插件项目 -> make编译 -> 生成的动态库, 目的是拿到这个动态库进行注入操作.
- make package -> 打包 -> 会在插件项目的packes文件夹下生成构建的版本, 如果重复构建会自动生成版本号来做区分.
1.生成的是.deb格式的包 -> cydia下发安装的
2.make install -> 安装到手机
- 链接上手机 -> cd /Library/MobileSubstrate/DynamicLibraries -> 发现我们安装的所有的插件都在这里
1..plist文件 -> 里面存的是要覆盖安装到哪个APP的插件
- 将系统的SpringBoard拷贝出来, 用MachO打开来查看, 发现我们的插件并没有注入到可执行文件里面, 那么插件是怎么运行的? -> 说明通过插件的这种方式, 并没有污染我们的MachO文件 -> 猜测修改的是dyld链接的方式,即DYLD_INSERT_LIBRARIES