动态调试(24)

上节课回顾

image.png

debugServer的权限问题

  1. 链接手机

  2. cd /Developer/usr/bin/ -> ls -> 查看是否有debugServer

  3. touch 123.txt -> 发现是没有权限的

  4. 所以将debugServer拷贝到/usr/bin里面 -> /usr/bin/debugServer

  5. ls -l debugServer -> 查看权限

  6. 将该文件拷贝出来 -> scp -P 12345 root@localhost:/usr/bin/debugServer ./debugServer

  7. theos资料 ->debugserver.entitlements ->拷贝到当前目录下

  8. ldid -e debugserver > debugserver.entitlements -> 将debugserver里面的权限导出来
    image.png
  9. 将上图两个key值对应的设为1

  10. ldid -Sdebugserver.entitlements debugserver -> 给debugserver重新设置权限

  11. 然后将修改后的debugserver拷贝到/usr/bin里面进行覆盖,这样全局都能用。

class-dump(MonkeyDev的使用)

  1. class-dump -> 查看class-dump的版本
  2. which class-dump -> 查看class-dump放在哪里
  3. Build Seting -> Monkey -> class-dump -> YES -> 重签的时候可以顺便帮你提取头文件
  4. MonkeyDev的路径不能有中文,否则有可能提取失败

命令行工具

  1. 快速建一个工程
    image.png
  2. printf("打印") -> 编译 -> 来生成一个MachO文件

  3. 将该文件拷贝到手机 -> ./可执行文件 -> 执行

  4. image.png

手动砸壳

  1. 我们是通过otool -l Wechat | grep crypt里面的cryptid字段来判断一个包是否加密的

  2. 链接手机找到微信 sp -A | grep Wechat

  3. scp -P 12345 root@localhost:微信手机路径(上一步可获取) ./ -> 将手机里面的拷贝出来 -> 查看权限,发现此时我们拿到的是一个未砸壳的微信包

  4. 直接WeChat的包 -> MachOView -> Load Commands -> INFO_64 -> 直接改0 -》 com + s 保存

  5. 直接calss-dump 这个包 -> class-dump -H Wechat -o headrs/ -> 发现不行

  6. otool -l Wechat | grep crypy -> 拿到偏移值off 和 size

  7. 手机debugserver localhost:12346 -a WeChat(17116用进程编号比较好) -> 附加进程

  8. 电脑lldb -> process connect conect://localhost:12346 -> 链接手机

  9. com + w -> 可以不杀掉进程,而退出lldb调试,使用exit同时会杀掉手机进程

  10. Xcode附加也可以 -> 建议用这种,比较快

  11. image list -> 拿到首地址
    image.png
  12. 断点调试 -> memory read --force --outfile ~/Desktop/WeChatDump/WeChat.bin --binary --count 前面拿到的size + 首地址 + 偏移
    image.png
  13. 将内存中的WeChat拷贝到桌面, 桌面文件夹要提前创建

  14. 所拷贝就是解密后的包
    15 dd seek=16384 bs=1 conv=notrunc if=./Wechat.bin of=WeChat

  15. 把.bin文件写入WeChat(未砸壳的),seek->跳过多少字节,bs->一次写入多少字节,notrunc不截断文件,只进行覆盖操作

  16. 上面的写入比较慢,因为是一个一个字节写的,最后用class-dump进行验证

  17. 写入之后,需要手动改下cryptid

  18. class-dump -H Wechat -o headrs/ -> 手动砸壳成功

消除系统气泡小插件

  1. SpringBoard -> 系统桌面APP
  2. ps -A | grep Spring -> 找桌面的APP位置 -> 拷贝出来并且class-dump拿到头文件
  3. image.png
  4. 可以用Xcode进程附加以及Cycript来分析系统的APP界面,最好是用Xcode进程附加找会比较快(这里我的实操是可以的, 如果附加失败的, 自己搜寻相关解决方案)
  5. 也可以通过Cycript来查看图层, 最终找到SBIconParallaxBadgeView, 这个视图
  6. 直接将SBIconParallaxBadgeView的初始化返回为空
  7. export THEOS_DEVICE_IP=localhost / export THEOS_DEVICE_PORT=12345 -> 这两个东西经常要用, 所以可以放在./zshrc里面
    image.png
  8. image.png
  9. 将文件夹放在桌面(放置路径有中文,导致编译不成功)
    1. cd 桌面文件夹
    2. make -> 编译
    3. make package;make install -> 安装到手机, 可以同时执行 -> 可以看到APP所有气泡都消失了

MonkeyDev中Logos Tweak

  1. 打开MonkeyDev中的Logos Tweak -> 新建工程 -> 放在桌面(放置中文路径)
  2. Library文件夹下找 -> BadgeTweak.plist -> 找到要附加的进程
  3. 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原理

  1. 拿到一个theos的插件项目 -> make编译 -> 生成的动态库, 目的是拿到这个动态库进行注入操作.
  2. make package -> 打包 -> 会在插件项目的packes文件夹下生成构建的版本, 如果重复构建会自动生成版本号来做区分.
    1. 生成的是.deb格式的包 -> cydia下发安装的
    2. make install -> 安装到手机
  3. 链接上手机 -> cd /Library/MobileSubstrate/DynamicLibraries -> 发现我们安装的所有的插件都在这里
    1. .plist文件 -> 里面存的是要覆盖安装到哪个APP的插件
  4. 将系统的SpringBoard拷贝出来, 用MachO打开来查看, 发现我们的插件并没有注入到可执行文件里面, 那么插件是怎么运行的? -> 说明通过插件的这种方式, 并没有污染我们的MachO文件 -> 猜测修改的是dyld链接的方式,即DYLD_INSERT_LIBRARIES

你可能感兴趣的:(动态调试(24))