起因: 最近公司某个项目 需要根据用户在群里的聊天 处理OA工单状态 所以需要获取聊天数据 然后老板又不想花钱买聊天存档 所以只能让技术部做一个可以拦截企业微信聊天内容的插件 第一步 当然是解决登录问题 那就是获取登录二维码
然后我一个Java开发 开始学习逆向了 网上大部分都是 微信相关的教程 企业微信的很少 看到大佬的一篇文章[原创]Dump微信PC端的界面Duilib文件 就尝试在企业微信里面拦截试试
怎么学习 怎么踩坑的 暂时没时间写了 先直接上主要流程吧
企业微信的 duilib 是直接单独一个 dll 不是像微信一样打包在 WeChatWin.dll 里面的
企业微信的 XML 是存在 WxWorkResources.dll 里面的
打开 企业微信 用 x32dbg 附加上 根据大佬的文章 找到微信修改过的 Duilib 代码
Utils/WinImplBase.cpp
回到 x32dbg 找到 duilib.dll 模块 然后在当前模块搜索字符串

右键 转到反汇编

可以看到 这里反汇编的代码 和 Github 上面的代码并不是一致的 但是大致逻辑差不多
往上几行反汇编代码 可以看到
由于连C++都没怎么写过 所以只能根据 Java 的经验猜测 这是一个 类的方法
看到上面有一行 lea ecx,dword ptr ss:[ebp-1A8]
尝试在这里下了断点(老手应该看出来 这个是 this 指针(应该) 但是刚开始我反汇编都没咋学过 所以不知道)
下了断点之后重新启动一下微信
运行之后 在断点处停下来了 然后 F7 执行一下 lea 指令

可以看到 ECX 是一个地址 然后跳到这个地址
然后用 看到有 xml 我就尝试换了一个编码加载 最后 UTF-16 可以加载出来
选中数据 Ctrl+E
切换到字符串界面

然后我尝试复制内容出来 结果 出现问题了 怎么都没办法复制内容出来
一开始我还以为是远程桌面的问题 后来发现 如果我只是选择中间几个单词 可以复制
大概这样子 蓝色是我复制的内容 记事本是我黏贴的内容

然后在这里卡了很久 因为有别的工作要做 所以暂时摆烂了
之后每天晚上到家 我就开始去B站看汇编和C++的基础教程 大概花了一周左右 期间也是一直卡在这里
偶然间还发现了这个看雪知识库
把可能用到的知识都看了看 然后我们回到上次那个位置 根据这几天学习的内容
我大概知道了 ecx 可能是一个 对象的 this 指针
那么上面应该有创建对象的相关内容 或者加载这个对象的内容

然后就发现了一个 XML 的文件名称 login\wechat_login.xml
往下几行看到了一个 感觉应该是 CDialogBuilder 的构造函数

高亮了一下 ecx 感觉应该是同一个对象
于是就在这里打了断点 然后进入调试

里面发了一个疑似加载XML的方法
执行到这里之后看了看堆栈和寄存器 发现就一个名称没有其他的数据 于是 F7 进入这个方法

根据反汇编的代码 看到一个 LoadContent 应该是加载XML的 下断点
执行到断点之后 发现在右侧 有 XML 内容 地址是 0019ED08

对比了一下地址 发现就是 EAX 存的指针
在 x64dbg 命令那边 执行一下 log {utf16@[eax]}

感觉是读取出来了 切换到日志页面看看

看起来像是正常的 XML 内容
右键 EAX 寄存器 跳转到内存窗口

然后在内存窗口 把内存窗口2转到这个地址

切换展示格式 文本->代码页 选择 UTF16

然后选择XML的内容 右键 二进制编辑->编辑

这个时候 发现这里的内容可以正常被复制出来了

经过上面的折腾 断点处拦截手动获取 XML 没问题了
但是会发现 刚启动的时候加载了很多 style/****.xml
的样式文件
这些文件不需要 所以 利用 x64dbg 的条件断点功能
往上几行 在call 了字符串处理的函数后 下条件断点 strstr(utf16([esp+4]),"login")

然后重复3里面的步骤 就可以手动把登录界面的XML都保存下来了(技术有限 还没学会怎么用代码拦截保存 希望大佬们可以指导一下)

CControlUI* pRoot = NULL;
if
(GetResourceType() == UILIB_RESOURCE)
{
STRINGorID xml(_ttoi(GetSkinFile().GetData()));
pRoot = builder.Create(xml, _T(
"xml"
),
this
, &m_pm);
}
else
{
pRoot = builder.Create(GetSkinFile().GetData(), (
UINT
)0,
this
, &m_pm);
}
ASSERT(pRoot);
if
(pRoot == NULL)
{
MessageBox(NULL, _T(
"加载资源文件失败"
), _T(
"Duilib"
), MB_OK | MB_ICONERROR);
ExitProcess(1);
return
0;
}
m_pm.AttachDialog(pRoot);
m_pm.AddNotifier(
this
);
CControlUI* pRoot = NULL;
if
(GetResourceType() == UILIB_RESOURCE)
{
STRINGorID xml(_ttoi(GetSkinFile().GetData()));
pRoot = builder.Create(xml, _T(
"xml"
),
this
, &m_pm);
}
else
{
pRoot = builder.Create(GetSkinFile().GetData(), (
UINT
)0,
this
, &m_pm);
}
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
最后于 2025-4-14 13:21
被MiaoWoo编辑
,原因: