逆向实战 (26)

逆向实战(26)

  1. 通过MonkeyDev 创建WeChatDemo
  2. 开发技术选择
    1. 越狱环境中 -> 越狱插件 Logos
    2. 重签名. 非越狱中, 破解版本(容易封号)
  3. 以前自定义界面到设置界面上添加HKSettingCell
    1. 当是图片 -> App包里面 -> 重签
    2. 那么越狱插件该怎么写?

编写Tweak插件

  1. image.png
  2. 在越狱环境下去拿微信的APP ID -> 修改上面对应的地方,表示我的插件的目标是微信
  3. 要想插件在编译时安装
    1. image.png
    2. image.png
    3. 注意: 你的电脑如果同时连接了两台手机, 用USB进行连接什么的,容易出问题,记得保存一台手机连接即可
  4. 将HKSettingCell.xm脱到工程里面, 拖拽时选择12, 不用选择4
  5. 因为上面的设置,编译时会安装, 所以先关闭MonkeyDevInstallOnAnyBuild -> NO
  6. 编译
    1. 如果是编译错误 -> Build Setting -> sign -> 找到Code Signing Identity -> iOS Developer
    2. 注意Tweak中文路径敏感 -> 直接将工程放在桌面
    3. 如果没有问题则会生成.mm文件, 将生成的文件添加到工程里面, 添加时选择124
  7. 上步没有问题 -> 编译运行, 记得改MonkeyDevInstallOnAnyBuild -> Yes, 让编译时安装到微信
    1. 头文件报错的话, 注释掉
    2. 还有不成功的话, 修改版本号
      image.png
  8. 此时是没有图片的, 用USB链接图片
    1. 链接到手机, ps -A | grep WeChat -> 找到微信的沙盒路径(记录一下沙盒路径)

      2.
      image.png
    2. 做越狱插件的时候, 如果需要增加图片 -> 将图片资源拷贝到APP目录下就行

定位聊天界面接收消息方法

  1. 砸壳, 将砸壳文件放到桌面 -> 解压缩 -> class dump -> 那倒头文件
    1. 小细节, APP包里面有修改 info.plist, 打开info.plist最下面有个 设备device这个东西, 记得删掉,不然重签名不了
  2. 找到聊天详情界面
    image.png
  3. 当然也可以用Xcode进程附加,或者Reveal工具都可以
  4. 最终找到了聊天详情界面BaseMsgContentViewController
  5. 去头文件里面找到这个文件, 然后我们要做的是HooK里面所有的方法

THEOS工具使用来HOOK一个.h里所有方法

  1. open $THEOS
  2. image.png
  3. logify.pl -> 你给我一个头文件, 我帮你Hook, 头文件里所有的方法, 并写上%log, 这正是我们迫切需要的
  4. 终端进入头文件目录
    1. logify.pl BaseMsgContentViewController > ../logMethod.xm -> > 是输入到一个文件, 后面是文件路径
    2. 然后将生成的文件放到工程里查看
    3. 编译 -> 先关闭MonkeyDevInstallOnAnyBuild -> NO
    4. 会生成.mm文件 -> 将.mm文件拖拽到工程 -> 再次编译
      1. 因为这里的hook方法比较多, 点.mm文件会很卡
      2. 再次编译很多地方报错, 直接干掉报错代码
      3. 导入 #import
      4. 编译没问题后 -> MonkeyDevInstallOnAnyBuild -> YES -> 然后重编译安装插件
      5. 附加进程有可能看不到打印信息 -> 控制台 -> 搜WeChat的进程来看打印
      6. 进入微信聊天详情界面, 发条消息, 看控制台的打印

定位全局接收消息方法

  1. image.png
  2. 要想Hook红包, 应该不止在聊天详情界面, 退出聊天详情界面, 再次发消息观察
    image.png
  3. 定位onNewSyncStart(收到消息时调用), addMessageNode(进入详情界面有调用)
  4. 消息管理者调用的onNewSyncStart -> 下断点看函数调用栈
  5. 下断点
    1. methods BaseMsgContentViewController
    2. 找onNewSyncStart的内存地址, 这个进程死掉就不行了
      image.png
    3. image.png
    4. image.png
    5. bt 查看堆栈 -> sbt 恢复符号 (多试两次, 有可能恢复多点符号名称)
      1. 恢复了frame#1的符号
        image.png
      2. frame2的符号只有个地址
        1. image list -> 拿到首地址 -> 用拿到的frame2的地址 - 首地址 -> 分析出来是个block方法(此处没有用到相减得到的地址, 而是通过断点到时打印)
          image.png
        2. image.png
        3. 多sbt尝试恢复符号, 上面的步骤有许多恢复的方法值得我们去探究, 去下断点,或许有新的收获

定位消息管理者作为HOOK对象

  1. 经过上面的分析, 我们怀疑addMessageNode这个很重要(sbt恢复的函数栈来看)

  2. 需要重新hook, 栈里面的那几个函数

  3. 从我们导出的头文件里面找到需要hook的类, 然后上面的相应的栈方法

  4. 注释掉原来xm里面的大量hook代码
    image.png
  5. 注意搜索类的技巧 -> @interface CMessageMgr

    1. 上面这个方法一看就是消息管理类, 我们现在对这个类有很强烈的兴趣
  6. MonkeyDevInstallOnAnyBuild -> NO -> 先编译一下, 看是否有问题

    1. 小细节: 主动杀掉WeChat -> 通过Spring board重启有可能有问题
    2. MonkeyDevInstallOnAnyBuild -> YES
    3. Xcode运行插件
    4. 打开控制台 -> 不进聊天界面,发消息
      image.png
    5. 我们发现这有很大概率是我们的目标
    6. 发送不同消息类型来看控制台打印 -> 发红包时type=49
    7. 然后MainThreadNotifyToExt是我们研究的重点吗? -> CMessageMgr 这个类才是
    8. 需要对CMessageMgr这个类进行全方位的HOOK
  7. logify.pl CMessageMgr.h > ../logMethodCMessageMgr.xm

    1. 将生成的文件 拖拽进项目 12
    2. 不显示.xm内容的话 -> 尝试重启Xcode
    3. MonkeyDevInstallOnAnyBuild -> NO -> 编译生成.mm -> 拖拽到项目124
    4. 注释掉报错方法
    5. MonkeyDevInstallOnAnyBuild -> YES
    6. 手动杀掉WeChat -> 运行安装插件
  8. 查看控制台

    1. 需要分析的记录一下, 要找那种每次发消息都会调用的方法 -> 多发几条消息记录一下
    2. image.png
    3. 去头文件里找到这个方法
    4. image.png
    5. 手动杀掉WeChat
    6. 重新运行插件 -> 找到打印信息
      image.png
  9. image.png

动态分析定位到抢红包的方法

  1. 分析强红包的方法, 如果是类方法, 简单
  2. 如果是对象方法, 需要静态分析, 反汇编去分析出打开红包的代码
  3. IDA!!! 登场
  4. 附加进程 -> 分析红包界面的开按钮
    1. WCRedEnvelopesReceiveHomeView对象的OnOpenRedEnvelopes
    2. 安装IDA -> Mac比较麻烦 -> 安装个虚拟机Parallels Desktop
    3. Parallels Desktop这个跟Mac融合的比较好
    4. 用IDA分析WeChat的包

IDA分析流程

  1. New
  2. 找到文件夹 -> 看不到文件 -> All Files -> WeChat
  3. 选择Mach-O file ARM64 -> OK -> 时间比较长

你可能感兴趣的:(逆向实战 (26))