逆向WeChat(三)

本篇在博客园地址https://www.cnblogs.com/bbqzsl/p/18198572

上篇回顾,对象是WEUIEngine。WeUIEngine使用了chrome::base框架,但只用来实现了单一的功能,只为了DUI的动画计时器。

chrome::base框架没有用作主线程的dispatcher,所有多线程并不向chrome::base框架投递执行代码。win32线程的消息队列是一个优先级队列,PostMessage除了manual文档的官方用途外,往往也用作deferred队列来使用。chrome::base框架使用的也就是这个队列,只是用了一个专门的窗口。既然chrome::base在wechat中只是一个花架子,那么一定需要一个等价物。

是的,这就是EventCenter。看名字,我就情不自禁地想起iOS的NSNotificationCenter defaultCenter。两个主要的函数\[NSNotificationCenter defaultCenter addObserverForName:object:queue:usingBlock:]注册, \[NSNotificationCenter defaultCenter postNotificationName:userInfo:]发送事件。

事实也是这样,WeChat定义了一个EventCenter,依附在UI主线程。项目之初应该是这个设计思路的。因为在早期的事件,会在一个专门的表注册它的名字,这样就可以通过名字来注册观察者或发送事件。但是根据逆向分析,实际应用却将名字搁置在一边,不知道是多年来改版后搁置的,还是一开始就没有在用。后面的开发见没有用,就干脆不注册名字了。

观察者必须使用EventHandler接口来注册到EventCenter。EventCenter依附在UI主线程的一个deferred队列,有独立的窗口,作用就是依附在线程的消息队列。如字面意思,EventCenter在UI主线程分派事件处理器。EventCenter作为全局单件,任意线程的任意代码都可以使用它postEvent来发送事件。

下面是一些逆向的佐证。

通过列出当前EventCenter在案登记了处理器的事件,比对事件名字表,可以发现,每个类别早期编号的事件,都遵从起名字,并注册名字。后期就懒得这样做了。

下图是通过LoginWnd向EventCenter查询在案登记的事件。然后再向名字表查询事件的名字。高兴的是,早期的事件还可以知道名字。可惜的是,后期的事件没有名字可以查。

下图演示一个应用场景,在点重新扫描后,跟踪发送事件。可以看到是WinMarsWrap::OnTaskEnd在发送事件ON_SCENE_NET_RESPONSE。既然事件发送者已经引出来了,后面自然就是会对Mars进行逆向一下。

下图演示,通过EventCenter列出所在在案登记的处理器对象,并列出它们的类名字。每个处理器对应着独立的功能,基本上所有功能都依赖了这个EventCenter。到这里wechat的基本结构脈胳也有了一个比较清晰的图了。

综上所述,将EventCenter的应用场景换作iOS,就是

\[NSNotificationCenter defaultCenter\] addObserverForName:@"ON_SCENE_NET_RESPONSE" object:nil queue:\[NSOperationQueue mainQueue\] usingBlock:\^{ loginwnd-\>processEvent(); }

\[NSNotificationCenter defaultCenter\] postNotificationName:@"ON_SCENE_NET_RESPONSE" userInfo:response

本篇到这里,下一篇再见。

我还有逆向通达信系列

我还有一个K线技术工具项目KTL可以用C++14进行公式,QT,数据分析等开发。

相关推荐
郝学胜-神的一滴39 分钟前
Horse3D 游戏引擎研发笔记(七):Clydesdale——从流式日志到多输出订阅
c++·qt·unity·游戏引擎·图形渲染·unreal engine·opengl
码匠许师傅9 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
Chengbei1110 小时前
DSH渗透测试插件dsh-pentest全新升级!适配DeepSeek Harness,可视化探索链路,一键搭建轻量化AI渗透测试环境。
人工智能·web安全·网络安全·微信·小程序·系统安全·安全架构
夜不会漫长14 小时前
C++入门(1)
开发语言·c++·算法
旖旎夜光16 小时前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
..Dauntless..16 小时前
【C++】继承——基类和派生类的配合
开发语言·c++·算法
程与留16 小时前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt
buhuizhiyuci17 小时前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
冻柠檬飞冰走茶20 小时前
《数据结构实验指导-C++语言版》 求单链表list中的元素个数,即表长
开发语言·数据结构·c++·算法·list
_Narcissus_20 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径