美文网首页
动态调试(24)

动态调试(24)

作者: 为了自由的白菜 | 来源:发表于2021-06-07 11:20 被阅读0次

    上节课回顾

    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)

          本文链接:https://www.haomeiwen.com/subject/evumsltx.html