前言

安装工具cycript

tweak 可以通过Cydia进行卸载

相关的代码可以到GitHub进行搜索RedRobert

安装 http://ftp.gnu.org/gnu/coreut...

寻找注入点

咂壳

动态分析-cycript

此时如果找不到ps 命令,就在软件源CYdia/telesphoreo 中实用工具-》查找pstree 进行安装,

<UIViewControllerWrapperView: 0x16b522f0; 
cy# [#0x16ae5ef0 nextResponder]
#"<BaseMsgContentViewController: 0x15d2d600>"

找到了当前聊天窗口的ViewController类名,他就是BaseMsgContentViewController
,现在我们缩小了目标范围,下面我们还需要继续缩小范围,要找到具体的消息处理函数才行。

动态分析-Logify

设置path

 open -e ~/.bash_profile
devzkndeMacBook-Pro:etc devzkn$ source ~/.bash_profile

devzkndeMacBook-Pro:etc devzkn$ logify.pl /Users/devzkn/Downloads/weiliu/sqxzs\(省钱小助手\)/交接资料的副本/越狱开发工具/APP头文件/微信头文件\(v6.5.7\)/微信头文件/WX_Hearder/BaseMsgContentLogicController.h  > ~/out/to/Tweak.xm

这里带百分号的关键字,例如 %hook、%log、%orig 都是mobilesubstrate的MobileHooker模块提供的宏,其实也就是把method swizzling相关的方法封装成了各种宏标记,使用起来更简单,大家想要更深入了解各种标记,可以google一下logos语言

theos创建tweak

list id applications to terminate upon installation,这里指定当tweak安装成功之后,需要kill的进程,我们要hook微信,这里就填微信的进程文件名就可以了,

注入原理

为什么要kill? 因为我么的插件是需要在app启动时加载进去的,如果不重启app,插件tweak是不会生效的

devzkndeMacBook-Pro:KNRedRobert devzkn$ cd /Users/devzkn/code/demo/KNRedRobert
devzkndeMacBook-Pro:KNRedRobert devzkn$ nic.pl

用另外一个微信在群里发个普通消息,连接xcode打开越狱机器控制台,查看输出,会发现有类似下面的输出:

Oct 28 17:17:44 iPhone WeChat[2957] <Notice>: [KNRedRobert] Tweak.xm:124 DEBUG: -[<BaseMsgContentLogicController: 0x16c6bf20> SendTextMessage:Ty]
Oct 28 16:34:33 iPhone WeChat[2957] <Notice>: [KNRedRobert] Tweak.xm:85 DEBUG: -[<BaseMsgContentLogicController: 0x16c6bf20> OnAddMsg:5565276344@chatroom MsgWrap:{m_uiMesLocalID=15, m_ui64MesSvrID=7434149195130973487, m_nsFromUsr=5565276344@chatroom, m_nsToUsr=wxi*o22~19, m_uiStatus=3, type=1, msgSource="<msgsource><sequence_id>664251092</sequence_id>
        <silence>0</silence>
        <membercount>3</membercount>
    </msgsource>
    "} ]

BaseMsgContentLogicController.OnAddMsg 消息处理函数

动态分析-lldb

还要继续追根溯源,寻找消息的源头,这里就用到了lldb远程调试,使用lldb打断点的方式,通过调用栈,我们可以就可以看到当消息来到时,方法的调用顺序,找到最先执行的消息处理函数。
这样才能做到处理当前用户的所有群的消息。

内存地址=进程内存基地址+函数在二进制中的偏移量
devzkndeMacBook-Pro:.ssh devzkn$ scp /Users/devzkn/Downloads/kevin-software/ios-Reverse_Engineering/debugserver/debugserver iphone150://usr/bin/debugserver
debugserver                                                                                                                                                                                                              100% 4475KB   4.4MB/s   00:01    
devzkndeMacBook-Pro:.ssh devzkn$ sshi
iPhone:~ root# /usr/bin/debugserver
debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-320.2.89
 for armv7.
Usage:
  debugserver host:port [program-name program-arg1 program-arg2 ...]
  debugserver /path/file [program-name program-arg1 program-arg2 ...]
  debugserver host:port --attach=<pid>
  debugserver /path/file --attach=<pid>
  debugserver host:port --attach=<process_name>
  debugserver /path/file --attach=<process_name>
iPhone:~ root# debugserver *:12345 -a "WeChat"
debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-320.2.89
 for armv7.
Attaching to process WeChat...
Listening to port 12345 for a connection from *...
devzkndeMacBook-Pro:~ devzkn$ lldb
(lldb) process connect connect://127.0.0.1:12345

获取内存中的地址

(lldb) image list -o -f|grep 'WeChat'
[  0] 0x00031000 /private/var/mobile/Containers/Bundle/Application/F3D35C16-C17C-4C75-AEC6-205A3C5B7A99/WeChat.app/WeChat(0x0000000000035000)

到这里我们两个地址都找到了,再通过br命令打断点:

(lldb) br s -a '0x00014000+0x01d3dba8'
Breakpoint 1: where = WeChat`ClearDataItem::compareTime(std::__1::shared_ptr<ClearDataItem> const&, std::__1::shared_ptr<ClearDataItem> const&) + 6336658, address = 0x01d51ba8
Process 3071 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x01d51ba8 WeChat`ClearDataItem::compareTime(std::__1::shared_ptr<ClearDataItem> const&, std::__1::shared_ptr<ClearDataItem> const&) + 6336658
WeChat`ClearDataItem::compareTime:
->  0x1d51ba8 <+6336658>: push   {r4, r5, r6, r7, lr}
    0x1d51baa <+6336660>: add    r7, sp, #0xc
    0x1d51bac <+6336662>: push.w {r8, r10, r11}
    0x1d51bb0 <+6336666>: sub    sp, #0x20
(lldb) po $r0
<RoomContentLogicController: 0x1598f180>

打好断点后继续向群里面发消息,我们会发现进程被断掉了,这时输入bt指令,就可以看到当前的调用栈,就像下图这样:

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
  * frame #0: 0x01d51ba8 WeChat`ClearDataItem::compareTime(std::__1::shared_ptr<ClearDataItem> const&, std::__1::shared_ptr<ClearDataItem> const&) + 6336658
    frame #1: 0x03cabc90 MMCommon`_callExtension + 426
    frame #2: 0x0254f296 WeChat`ClearDataItem::compareTime(std::__1::shared_ptr<ClearDataItem> const&, std::__1::shared_ptr<ClearDataItem> const&) + 14714752
    frame #3: 0x27cd8d6e Foundation`__NSThreadPerformPerform + 386
    frame #4: 0x26f90376 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
    frame #5: 0x26f8f786 CoreFoundation`__CFRunLoopDoSources0 + 218
    frame #6: 0x26f8ddec CoreFoundation`__CFRunLoopRun + 772
    frame #7: 0x26edc210 CoreFoundation`CFRunLoopRunSpecific + 476
    frame #8: 0x26edc022 CoreFoundation`CFRunLoopRunInMode + 106
    frame #9: 0x2e2d50a8 GraphicsServices`GSEventRunModal + 136
    frame #10: 0x2a4e81d0 UIKit`UIApplicationMain + 1440
    frame #11: 0x000e9cac WeChat`_mh_execute_header + 859308
    frame #12: 0x34cf4aae libdyld.dylib`start + 2

分析堆栈的时候,重点找出模块时WeChat的项,这些都是微信模块的方法调用,有了堆栈,我们需要根据堆栈的内存地址找出它的具体函数名,思路还是先根据上面讲到的公式来计算出栈地址在二进制中的偏移量,然后用hooper找到偏移量对应的函数名

函数在二进制中的偏移量=内存地址 - 进程内存基地址

最终把所有的栈都进行还原,得出调用栈是这个样子的:

-[CMessageMgr MainThreadNotifyToExt:]:
–>    
-[BaseMsgContentLogicController OnAddMsg:MsgWrap:]:
——>
-[RoomContentLogicController DidAddMsg:]

CMessageMgr这个类浮出水面了,是时候发挥黑客的嗅觉了,根据方法名我们能判断出MainThreadNotifyToExt:这个方法仅仅是用来发送通知的,如果hook这个方法,我们是拿不到消息内容的

这里可能是一个异步调用,用断点的方式,可能已经打印不出来栈信息了,所以还得使用logify来继续追踪CMessageMgr这个类,讲过的内容我就不重复了,直接得到最终的消息处理函数:

-(void)AsyncOnAddMsg:(id)message MsgWrap:(CMessageWrap* )msgWrap 

实现“抢”的动作

同样我们需要结合动态分析和静态分析,首先得到红包消息体的数据特征,然后再分析处理消息的关键点

数据包分析

首先我们的代码需要分辨哪些才是红包消息,方法很简单,用logify追踪BaseMsgContentViewController,然后向微信群发一个红包,观察手机日志输出,我们可以看出消息的数据结构中有个type字段,值是49,这个type应该就是标记消息类型的.

Oct 28 18:01:14 iPhone WeChat[3109] <Notice>: [KNRedRobert] Tweak.xm:85 DEBUG: -[<BaseMsgContentLogicController: 0x189aed50> OnAddMsg:5565276344@chatroom MsgWrap:{m_uiMesLocalID=22, m_ui64MesSvrID=2839424898155754725, m_nsFromUsr=5565276344@chatroom, m_nsToUsr=wxi*o22~19, m_uiStatus=3, type=49, msgSource="<msgsource><sequence_id>664251099</sequence_id>
        <silence>0</silence>
        <membercount>3</membercount>
    </msgsource>
    "} ]

从ui入手,先找到微信本身的抢红包函数,我们自己来给它构造参数并调?

请输入代码

iOS逆向
44 声望15 粉丝