逆向WeChat (二)
本篇在博客园的地址https://www.cnblogs.com/bbqzsl/p/18187099
回顾一下现时网上的资源。
原生 https://github.com/duilib,
Ultimate https://github.com/qdtroy/DuiLib_Ultimate
腾讯 https://github.com/tencentyun/TIMSDK/tree/master/cross-platform/Windows/IMApp/Basic/duilib
网易 https://github.com/netease-im/NIM_Duilib_Framework/tree/master/duilib
主体框架2019年截止。
腾讯cross-platform/Windows/IMApp/Basic/duilib止于2019年开放的5.4.666版的TIMSDK。只能通过tag切换旧旧旧版。
最后一个开放的5.6.12版在路径Windows/Demo/Basic/duilib,时间止于2021年8月31日。
网易开源版也止于2019年。
比较了一下,网易版对原生 改动很大,去除了CDuiString,全部用std::wstring。腾讯在TIMSDK的版本是基于DuiLib_Ultimate而不是原生的duilib。根据我逆向的CControlUI结构,现在WeChat使用的duilib是基于原生版的。DuiLib_Ultimate与原生两个版区别的最大特征在于,CControlUI结构使用了5个EventSource还是7个EventSource。
通过WeChat的日志跟踪路径,WeChat不与其它产品共享代码,他们有一个专门子项目WeUIEngine,而非TIMSDK。架构应该可以参考网易的NIM_Duilib_Framework框架。注意是框架设计不是代码。
WeChat版的duilib,改动CControlUI成一个大而累赘的庞物,从CContainerUI的RTTI信息可以看到,CControlUI是一个2816字节的大基类。CDuiString的确是一个累赘,尤其Unicode下,大小是132字节。而且这个基类一共使用了17个CDuiString。大厂的我不懂。后面的继承类如CLabelUI就更加趋向于使用std::wstring。反正现在的电脑没有16GB内存都不算电脑。

经过逆向后就可以对UI进行操作了。


WeChat使用了Chromium::base的MessagePumpForUI,简单来说就相当于用win32有窗口消息实现仿如iOS的dispatcher, 如我们熟悉的这个调用dispatch_async(dispatch_get_main_queue(), ^{ // update UI })。Chromium这项目,每个版本系列的代码都不同程序的重构,所以可以通过一些类来确认出WeChat所使用的版本是6系列的。也可以推断出WeUIEngine开发的年份。现在这年,Chromium或cef的多线程任务框架也应该是用到烂大街的了吧。
有这个东西,就等于方便我使用,于是我就不客气使用它向UI主线程投递代码执行。进行测试,运行MessageBox显示当前线程的ID。所以我已经先逆向了需要的东西。下面演示一下。

it works。消息框在主线程376中执行了。
那么WeChat是怎么用它的呢,我原本以为WeChat会用它大作为一下,我的意思是有多一点用途,没想到却只是为了完成一个单一的UI功能,动画,或者说是动画的计时器。
先来找出dispatch任务的地方,只要跟踪这里,就可是知道WeChat都向这里Post了些什么代码。无它,将DebugBreak作为任务PostTask到MessagePumpForUI。通过调用栈就可以找出来了。再通过逆向分析出绑定的执行地址。

绑定的执行地址是base::RepeatingTimer,全部都只有定时任务。下面再来逆向分析都是些什么定时任务。我也想知道刷新扫码,工作线程有没有使用MessagePumpForUI将请求结果更新到UI。

定时器任务只有一个, 就是CPaintManagerUI::DelayPaint,名字是我起的,功能就是Paint,目的是动画,还有增加或减少Paint的频度。即使我刷新了几次重新扫码,也没有收到别的任务。也就是工作线程没有通过Chromium::base的任务框架进行dispatch_async(ui_update)。
今期先到这里。
我还有逆向通达信系列。
逆向WeChat (二)的更多相关文章
- 微控工具xp模块-开发版[微信(wechat)二次开发模块]
http://repo.xposed.info/module/com.easy.wtool 微控工具xp模块-开发版[微信(wechat)二次开发模块] 基于xposed框架的微信二次开发模块,方 ...
- OD 实验(二十一) - 对反调试程序的逆向分析(二)
程序: 运行程序 点击“Verify” 关闭该程序,启动 OD 再运行程序 逆向: 用 OD 载入程序 按 F8 往下走 执行完这个 call 指令就弹出了对话框 这个 call 指令调用了 Dial ...
- Python逆向(二)—— pyc文件结构分析
一.前言 上一节我们知道了pyc文件是python在编译过程中出现的主要中间过程文件.pyc文件是二进制的,可以由python虚拟机直接执行的程序.分析pyc文件的文件结构对于实现python编译与反 ...
- 从零开始Android逆向教程(二)——什么是Xposed
前言在阅读本文之前,假设你的手机已经root,并且已经成功安装好了 XposedInstaller. Xposed是什么? Xposed 是一个 Android 平台上的动态劫持框架,通过 ...
- Node.js+Koa开发微信公众号个人笔记(二)响应事件
微信公众号中的事件有订阅事件/扫码事件/点击事件/跳转链接事件等等,具体可以查阅文档. 这里来实现一下订阅事件,其他的事件的实现过程也都类似. 当有人订阅了公众号后,微信服务器会向我们的服务器推送一个 ...
- x32下PsSetLoadImageNotifyRoutine的逆向
一丶简介 纯属兴趣爱好.特来逆向玩玩. PsSetLoadImageNotifyRoutine 是内核中用来监控模块加载.操作系统给我们提供的回调. 我们只需要填写对应的回调函数原型即可进行加监控. ...
- x32下逆向 PsSetCreateProcessNotifyRoutine 进程钩子
目录 一丶前言 二丶逆向过程 1.windbg挂载 win7 32位.定位到函数反汇编位置 2.逆向 PspSetCreateProcessNotifyRoutine 3.逆向 ExReference ...
- Python逆向(一)—— 前言及Python运行原理
一.前言 最近在学习Python逆向相关,涉及到python字节码的阅读,编译及反汇编一些问题.经过长时间的学习有了一些眉目,为了方便大家交流,特地将学习过程整理,形成了这篇专题.专题对python逆 ...
- python 全栈开发,Day103(微信消息推送,结算中心业务流程)
昨日内容回顾 第一部分:考试题(Python基础) 第二部分:路飞相关 1. 是否遇到bug?难解决的技术点?印象深刻的事? - orm操作费劲 - 最开始学习路由系统时候,匹配规则: 答案一: 有, ...
- Mysql高可用
一.二进制日志 二进制日志,记录所有对库的修改,如update.修改表结构等等 需要开启二进制日志的原因: 1.主从复制都是通过二进制日志进行.主库写二进制日志,传输到从库,从库replay二进制日志 ...
随机推荐
- OpenHarmony技术日探讨教育发展,聚焦开源人才培养
4 月 25 日,OpenAtom OpenHarmony (以下简称"OpenHarmony")技术日在深圳成功举办.作为 OpenHarmony 开源项目的年度盛会,大会以&q ...
- 6本值得推荐的MySQL学习书籍(有赠书福利)
前言 在DotNetGuide技术社区交流群和微信公众号后台经常收到小伙伴们的留言,让我出一期MySQL相关学习书籍的推荐文章.因此,今天我特意为大家精选了 6 本值得推荐的 MySQL 学习书籍,希 ...
- Docker 12 Dockerfile
简介 Dockerfile 是用来构建 Docker 镜像的文件,可以理解为命令参数脚本. Dockerfile 是面向开发的,想要打包项目,就要编写 Dockerfile 文件. 由于 Docker ...
- Spring源码 19 IOC getBean方法
前面实现了 ClassPathXmlApplicationContext 的构造,接下来分析其调用的 getBean 方法. 以 getBean(UserDao.class) 为例. 1 Abstra ...
- Python队列----queue
import queue # 官网文档:https://docs.python.org/3/library/queue.html a1 = queue.Queue() # 先进先出队列 a2 = qu ...
- 直播预告丨“Hello ArkUI:初识Slider组件(JS)”周三约起
12月1日 19:00-20:30,Hello HarmonyOS系列课程的第三节Hello ArkUI:初识Slider组件(JS)线上直播,将手把手教你熟悉最新的ArkUI,使用JS语言编写一个包 ...
- react native 使用typescript
前言 TypeScript作为JavaScript的一个富类型扩展语言,深受代码风格严谨的前端开发者欢迎.但在react-native下,因为packager的配置困难,使用TypeScript一直是 ...
- Oracle nullif函数使用
nullif函数使用 简单来说,就是表达式1的值和表达式2的值进行对比 可以使用''字符 select nullif('','1111') from dual 输出为空 不可以使用null字符 sel ...
- 力扣601(MySQL)-体育馆的人的流量(困难)
题目: 表:Stadium 编写一个 SQL 查询以找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录. 返回按 visit_date 升序排列 的结果表. 查询结果格式如下所示 示例 ...
- 链栈的实现 C语言/C++
堆栈的链式存储C/C++实现--链栈 与顺序栈相比,链栈的优点在于不存在栈满上溢的问题.链栈通常使用单链表实现,进栈.出栈操作就是在单链表表头的 插入.删除操作.用单链表实现链栈时,使用不带头结点的单 ...