前言
本文将介绍探索微信骰子控制点数的过程,并开源代码。本插件可以做到控制骰子点数和石头剪刀布的结果。
内容
众所周知,微信全局收发消息调用的是CMessageMgr类的- (void)AddMsg:(id)arg1 MsgWrap:(id)arg2函数,该函数arg1为收信人的微信id,arg2为消息CMessageWrap类的对象。如此说来我们只要拼接正确的CMessageWrap对象即可。
探索CMessageWrap类
- class-dump 得到CMessageWrap.h
- 使用MonkeyDev断点观察arg2
1.参考
2.全世界都在用MonkeyDev,我们用MonkeyDev编写代码hook并断点- (void)AddMsg:(id)arg1 MsgWrap:(id)arg2.
CHDeclareClass(CMessageMgr);
CHMethod(2, void, CMessageMgr, AsyncOnAddMsg, id, arg1, MsgWrap, id, arg2)
{
CHSuper(2, CMessageMgr, AsyncOnAddMsg, arg1, MsgWrap, arg2);
}
CHConstructor{
CHLoadLateClass(CMessageMgr);
CHClassHook(2, CMessageMgr, AsyncOnAddMsg, MsgWrap);
}
首先发送文字,探索最简单的CMessageWrap对象用到哪些字段,得:
wrap.m_uiMessageType = 1;//文字:1,表情:47
wrap.m_nsFromUsr = @"发信人微信id";
wrap.m_nsToUsr = @"收信人微信id";
wrap.m_uiCreateTime = date;//时间戳
wrap.m_uiStatus = 1;//固定1
以上为微信发消息必备字段。接下来,我们发一个石头剪刀布的表情,得到更多字段:
wrap.m_nsEmoticonMD5 = @"F790E342A02E0F99D34B316547F9AEAB";//猜拳md5
wrap.m_uiGameContent = 3;//猜拳内容
wrap.m_uiGameType = 1;//猜拳:1,骰子:2
wrap.m_uiEmoticonType = 1;//固定1
得到这些字段后,我么调用- (void)AddEmoticonMsg:(NSString *)arg1 MsgWrap:(CMessageWrap *)arg2;发送表情测试,发现每次的结果都是'布',由此可见,猜拳和骰子的结果不是由服务端控制,而是由发送的时刻即确定,所以我们可以控制结果。修改入参值不难得出:
1:m_nsEmoticonMD5:@"F790E342A02E0F99D34B316547F9AEAB",m_uiGameType:1,m_uiGameContent:1剪刀 2石头 3布
2:m_nsEmoticonMD5:@"9E3F303561566DC9342A3EA41E6552A6",m_uiGameType:2,m_uiGameContent:4-9为结果1-6
插件
WCGameEmoji,越狱非越狱都支持,越狱设备,修改源码里ip直接build到手机上。非越狱设备请自行build,注入,重签名打包。