逆向调用QQ截图NT与WeChatOCR
已逆出64位的QQ Mojo Ipc通信过程, 请点击下方链接下载QQImpl项目, 此项目将QQ的Mojo Ipc和WeChatOCR独立了出来, 可以在任何项目中使用:
037K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6q4c8f1g2q4K9r3g2^5i4K6u0r3f1g2q4u0L8i4m8D9
采用QQImpl的成品在下方链接下载:
链接:QQScreenShotNT-Plus
提取码:ctjs
QQ出Electron版了, 将截图独立出来了(应该是个过渡, 之后感觉会采用Electron重写), 并且使用的OCR改成了TencentOCR(低版本的WeChatOCR)
本文将重点介绍如何逆向调用WeChatOCR
0x00 逆向调用QQ截图NT
0x01 前期调研
先把QQ运行起来, 看看QQ NT的截图是什么情况的:

注意到 有一个--pcqq-platform-channel-handle的命令行参数, 并且存在一个有mojo字样的命名管道
那就搜索一下, 可以在 这篇文章 里发现, mojo是Chrome实现的一套IPC机制, 并且想要简单使用的话, mojo IPC有一套Invitation机制。
Invitation简单来说就是创建子进程, 并给它传命令行--mojo-platform-channel-handle=xxx。
显然QQ就是从这个基础上改了一个命令行参数, 本质就是采用Mojo IPC进行通信。
那就开逆! (一开始分析的是QQNT 64位版本的, 后面为了方便分析用的是9.9.0.14619 x86版本的, 可能地址会变化)
0x02 分析QQScreenshot.exe
先从被调用端分析, 直接分析QQ太大了, 先小看一下main函数:

这个main函数跟我以前逆的结果差不多哇, 总的来说就是启动QQ截图的环境, 图上画框的函数是启动IPC的, 进去看看:

还是COM的形式, 这里碍于篇幅不再介绍child ipc的过程, 直接看parent ipc的过程
(其实可以发现parent-ipc-core-x86.dll和child-ipc-core-x86.dll是同一个代码编译的DLL)
既然QQScreenshot是通过加载child-ipc-core-x86.dll再通过DllGetClassObject获取COM对象.
那QQ也很有可能是通过加载parent-ipc-core再动态获取COM对象实现的
那就动调一下QQ.exe, 搜索一下这种情况的代码:
1 |
DllGetClassObject = GetProcAddress(LibraryA, "DllGetClassObject" );
|
0x03 分析parent-ipc-core-x86.dll
定位到DllGetClassObject字符串:

可以看到和QQScreenshot.exe里初始化IPC的过程一模一样, 从parent-ipc-core-x86.dll中获取了一个COM对象
看一下这个COM对象的实现了哪些方法:

前三个函数是实现的IUnknown接口不用管, 其他的方法都可以通过字符串猜出来, 只要确定他们的参数类型就好了, 这里碍于篇幅省略掉(动调能直接看出来)
只介绍一下pCOM->LaunchChildProcess(...)方法:
0x04 LaunchChildProcess方法
通过动调可以发现LaunchChildProcess方法的第5个参数是用来设置接收IPC MSG函数的
在LaunchChildProcess方法里, 会调用base::Thread::task_runner新起一个线程来创建截图子进程↓
怎么确定的这些函数呢?, 因为新版QQ本身就是一个Chrome嘛, 直接通过字符串去搜Chrome的源代码就OK了。
下面进LaunchQQScreenShot函数看看:

整个函数完全就是参考文章[1]里面介绍的Invitation机制。
这个函数其实是LaunchChildProcessInternal, 是LaunchChildProcess的内部函数,用来创建子进程:
1 |
pIMojoIpc - >LaunchChildProcess(wchar_t * path, (char * )[] cmdlines, DWORD64 cmdlines_num, LPVOID callback, LPVOID lpClass); / / 最后一个参数是callback的第一个参数 是一个类指针
|
而LaunchChildProcess的最后一个参数是接收IPC消息回调函数的第一个参数。
之后就是仿写一遍就能调用了, 详细信息还是请见QQImpl64.cpp:

0x10 逆向调用WeChatOCR
QQ采用的TencetnOCR就是低版本的WeChatOCR, 他们也是采用Mojo IPC进行通信
0x11 前期调研
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2023-9-8 11:33
被0xEEEE编辑
,原因: 新增QQImpl代码与NTPlus版本