资讯专栏INFORMATION COLUMN

微信抢红包iPhone-Tweak1

csRyan / 3286人阅读

前言

安装工具cycript

tweak 可以通过Cydia进行卸载

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

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

寻找注入点

咂壳

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

cy# [#0x16ae5ef0 nextResponder]
#""

找到了当前聊天窗口的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] : [KNRedRobert] Tweak.xm:124 DEBUG: -[ SendTextMessage:Ty]
Oct 28 16:34:33 iPhone WeChat[2957] : [KNRedRobert] Tweak.xm:85 DEBUG: -[ 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="664251092
        0
        3
    
    "} ]

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=
  debugserver /path/file --attach=
  debugserver host:port --attach=
  debugserver /path/file --attach=
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 const&, std::__1::shared_ptr 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 const&, std::__1::shared_ptr 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

打好断点后继续向群里面发消息,我们会发现进程被断掉了,这时输入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 const&, std::__1::shared_ptr const&) + 6336658
    frame #1: 0x03cabc90 MMCommon`_callExtension + 426
    frame #2: 0x0254f296 WeChat`ClearDataItem::compareTime(std::__1::shared_ptr const&, std::__1::shared_ptr 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] : [KNRedRobert] Tweak.xm:85 DEBUG: -[ 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="664251099
        0
        3
    
    "} ]
从ui入手,先找到微信本身的抢红包函数,我们自己来给它构造参数并调?
请输入代码

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16809.html

相关文章

  • 信抢红包外挂

    摘要:如何发红包会安全点现在抢红包就看谁的外挂工具反应够快如何去干扰这些外挂,其实也有点小技巧,就是在发红包前,发送文本微信红包可以导致部分外挂工具失效。 版本归作者 Leon 所有,所以在此注明出处:http://www.happycodeboy.com/index.php/archives/10/ 源码下载地址:https://github.com/lendylongli/qiangho...

    QiShare 评论0 收藏0
  • Redis从入门到进阶

    摘要:从入门到进阶今天跟大家交流一下的一些学习材料,希望通过今天的分享,能够带领大家简单入门。这样它就只会把有效的流量透传到数据库上,而把大部分的数据拦截在这一侧,从而达到了保护数据库的作用。 Redis从入门到进阶 今天跟大家交流一下Redis的一些学习材料,希望通过今天的分享,能够带领大家简单入门Redis。首先介绍一下什么是Redis? Redis全称是Remote Dictionar...

    blair 评论0 收藏0
  • Redis从入门到进阶

    摘要:从入门到进阶今天跟大家交流一下的一些学习材料,希望通过今天的分享,能够带领大家简单入门。这样它就只会把有效的流量透传到数据库上,而把大部分的数据拦截在这一侧,从而达到了保护数据库的作用。 Redis从入门到进阶 今天跟大家交流一下Redis的一些学习材料,希望通过今天的分享,能够带领大家简单入门Redis。首先介绍一下什么是Redis? Redis全称是Remote Dictionar...

    Hwg 评论0 收藏0
  • iOS 逆向 - 收藏集 - 掘金

    摘要:破解首先,这是一个简单的不能再简单逆向实验,也仅仅只是针对于逆向比较简单的符号表恢复逆向支付宝掘金符号表历来是逆向工程中的必争之地,而应用在上线前都会裁去符号表,以避免被逆向分析。 分分钟让你在 微信运动 霸占榜首 - iOS - 掘金 为了纪念我失去的已越狱iPad, 不得不写点什么。 所以...以下内容 不需要越狱。 微信运动 6万步是什么概念,我不知道,因为我没走过,不过有朋友是...

    Karrdy 评论0 收藏0
  • AccessibilityService

    摘要:抢红包抢红包应该是火起来的最大因素。检查微信好友那么再比如去年比较火的一个方法,通过拉好友进群组来检查是否还有好友关系。 AccessibilityService从入门到出轨 AccessibilityService根据官方的介绍,是指开发者通过增加类似contentDescription的属性,从而在不修改代码的情况下,让残障人士能够获得使用体验的优化,大家可以打开Accessibi...

    wh469012917 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<