|
1 | | -# QQImpl |
2 | | -## 项目说明 |
3 | | -本项目为通过逆向QQNT,将QQ封装的Mojo IPC模块独立出来,可以在任何项目中集成此模块,利用QQ Mojo IPC进行IPC通信。 |
4 | | -同时逆向出调用WeChatOCR的方法,集成此模块也可以方便的调用WeChatOCR。 |
5 | | - |
6 | | -QQIMPL_TEST.7z是测试使用的, ParentIpc和ChildIpc用于测试Mojio IPC功能, OcrTest用于测试WeChatOCR功能 |
7 | | - |
8 | | -## 使用说明 |
9 | | -### 1. DLL版 |
10 | | -DLL版为将调用WeChatOCR的操作封装成了DLL, 请在Release下载编译好的DLL。 |
11 | | -并在QQImplDLL\\UsageExample下载调用示例, 包括c++与python的调用示例。 |
12 | | - |
13 | | -### 2. 文件版 |
14 | | -> 假设你的项目结构是这样的: |
15 | | -> . |
16 | | -> ├─Bin |
17 | | -> ├─YourProject |
18 | | -> ├─QQImpl |
19 | | -
|
20 | | -#### IPC |
21 | | -> 32位程序依赖parent-ipc-core-x86.dll |
22 | | -> 64位程序依赖parent-ipc-core-x64.dll |
23 | | -
|
24 | | -1. 在vs项目中添加文件: QQIpc.cpp |
25 | | -2. 附加包含目录添加: \$(SolutionDir)..\\QQImpl\\QQIPC |
| 1 | +# 项目说明 |
| 2 | +本项目通过逆向QQNT 逆向出调用QQ Mojo IPC的方法, 使用QQMojoIPC可以调用QQNT的插件并与之通信。 |
| 3 | +并在此基础上逆向出调用微信MMMojo.dll的方法, 通过调用MMMojo可以调用WeChat的插件并与之通信。 |
26 | 4 |
|
27 | | -如果是x64则还需要: |
28 | | -1. 在vs项目中新添加文件: QQIpcAsm.asm |
29 | | -2. 右键项目->生成依赖项->生成自定义->将masm勾上 |
30 | | -3. 右键QQIpcAsm.asm属性->项类型改为 Microsoft Macro Assembler |
31 | | - |
32 | | -#### OCR |
33 | | -> 在QQImpl\\QQOCR\\ocr_lib中有编译好的libprotobuf (3.20.3), 可以自己编译protobuf, 再用protoc.exe编译一下QQImpl\\QQOCR\\ocr_protobuf\\ocr_protobuf.proto即可生成ocr_protobuf.pb.h与ocr_protobuf.pb.cc |
34 | | -1. 在vs项目中添加文件: QQOcr.cpp ocr_protobuf.pb.cc |
35 | | -2. 附加包含目录添加: |
36 | | -\$(SolutionDir)..\\QQImpl\\QQOCR |
37 | | -\$(SolutionDir)..\\QQImpl\\QQOCR\\ocr_protobuf\\ |
38 | | -3. 在链接器附加依赖库添加: \$(SolutionDir)..\\QQImpl\\QQOCR\\ocr_lib\\对应的lib |
39 | | -4. 如果想要使用dll版的libprotobuf, 需要在预处理器定义里添加PROTOBUF_USE_DLLS |
40 | | - |
41 | | -如果是x64则还需要: |
42 | | -1. 在vs项目中新添加文件: QQOcrAsm.asm |
43 | | -2. 右键项目->生成依赖项->生成自定义->将masm勾上 |
44 | | -3. 右键QQOcrAsm.asm属性->项类型改为 Microsoft Macro Assembler |
| 5 | +**目前可以调用QQNT的如下组件:** |
| 6 | +- [x] QQScreenShot |
| 7 | + |
| 8 | +**目前可以调用WeChat的如下组件:** |
| 9 | +1. WeChatOCR.exe: |
| 10 | +- [x] OCR功能 |
| 11 | + |
| 12 | +2. WeChatUtility.exe: |
| 13 | +- [x] QRScan功能 (二维码扫描) |
| 14 | +- [x] TextScan功能 (可能是用来判断图片上有没有文字的) |
| 15 | +- [ ] ResampleImage功能 |
| 16 | +- [ ] DecodeImage功能 |
| 17 | + |
| 18 | +3. WeChatPlayer.exe: |
| 19 | +- [ ] 视频播放功能 |
| 20 | + |
| 21 | +# 项目结构 |
| 22 | +├─3rdparty |
| 23 | +├─examples |
| 24 | +├─proto |
| 25 | +├─src |
| 26 | +│ ├─include |
| 27 | +│ │ ├─mmmojo_source |
| 28 | +│ │ ├─qq_mojoipc |
| 29 | +│ │ └─xplugin_protobuf |
| 30 | +│ ├─qq_mojoipc |
| 31 | +│ └─wrapper |
| 32 | +└─swig |
| 33 | + |
| 34 | +(此版本根据微信的mmmojo源码再次重构, 逻辑更清晰) |
| 35 | +其中3rdparty是编译好的libprotobuf库, examples里是调用方法的示例, proto里是WeChat与组件之间的Protobuf通信协议的定义文件。 |
| 36 | +src文件夹里 include中mmmojo_source是微信MMMojo的源代码中的一些定义, qq_mojoipc是实现QQMojoIPC的头文件, xplugin_protobuf是使用protoc编译后的头文件。 |
| 37 | +qq_mojoipc文件夹是实现QQMojoIPC的实现文件, wrapper里是实现调用微信XPlugin组件的实现文件, 其中mmmojo_call.cpp是基础的调用XPlugin的方法, mmmojo_ocr.cpp和mmmojo_utility.cpp是封装了对应组件通信协议的文件。 |
| 38 | + |
| 39 | +~~swig文件夹里是swig的接口文件, 本来是想通过swig让其他语言也可以调用, 但是还没有写好, 不知道怎么在其他语言中将函数转为void\*传给c++~~ |
| 40 | + |
| 41 | +# 编译说明 |
| 42 | +本项目使用cmake, 以下为cmake选项说明: |
| 43 | +| Option | 说明 | |
| 44 | +| ---- | ---- | |
| 45 | +| XPLUGIN_WRAPPER | 编译封装好WeChat通信协议的实现文件(mmmojo_ocr.cpp/mmmojo_utility.cpp以及pb协议文件) 默认为ON | |
| 46 | +| BUILD_QQIPC | 编译QQMojoIPC的实现文件 默认为OFF | |
| 47 | +| BUILD_CPPEXAMPLE | 编译调用方法示例项目 默认为OFF | |
| 48 | +| BUILD_WITH_SWIG_PY | 使用SWIG编译为Python可用的.pyd 默认为OFF (还未实现)| |
| 49 | + |
| 50 | +## 快速上手 |
| 51 | +> 在编译前请先解压3rdparty下的压缩文件(或者自己编译一下protobuf) 以及src/include/xplugin_protobuf下的压缩的头文件 |
| 52 | +
|
| 53 | +使用如下命令行: |
| 54 | +``` |
| 55 | +cmake -B build -G "Visual Studio 17 2022" -A x64 -DBUILD_CPPEXAMPLE=ON |
| 56 | +``` |
| 57 | +然后在build文件夹里编译生成visual studio项目即可 |
| 58 | + |
| 59 | +# WeChat MMMojo说明 |
| 60 | +微信通过mmmojo_64.dll启动其组件并与组件通信。 |
| 61 | +mmmojo就是对谷歌mojo ipc的一层封装, 有如下几种通信方式(具体请查看mmmojo.h) : |
| 62 | +``` |
| 63 | +typedef enum { |
| 64 | + kMMNone = 0, |
| 65 | + kMMPush, |
| 66 | + kMMPullReq, |
| 67 | + kMMPullResp, |
| 68 | + kMMShared, |
| 69 | +} MMMojoInfoMethod; |
| 70 | +``` |
| 71 | +在与组件通信过程中,请求操作与回复都是通过发送 **request_id + pb数据** |
| 72 | + |
| 73 | +其中request_id表明了请求的操作类型(具体请查看mmmojo_call.h), 例如: |
| 74 | +(request_id 没有逆向全, 大体就是这么多了) |
| 75 | +``` |
| 76 | +//WeChatUtility组件 |
| 77 | +enum RequestIdUtility |
| 78 | +{ |
| 79 | + UtilityHiPush = 10001, //是Utility启动发送的 |
| 80 | + UtilityInitPullReq = 10002, //初始化请求 |
| 81 | + UtilityInitPullResp = 10003, //回复创建的都是Shared类型的info, 但是调用了SwapMMMojoWriteInfoCallback, 所以回调的还是Pull |
| 82 | + UtilityResampleImagePullReq = 10010, |
| 83 | + UtilityResampleImagePullResp = 10011, |
| 84 | + UtilityDecodeImagePullReq = 10020, |
| 85 | + UtilityDecodeImagePullResp = 10021, |
| 86 | + UtilityPicQRScanPullReq = 10030, //10030是点击OCR时(也是打开图片时)发送的请求, 参数是图片路径 |
| 87 | + UtilityQRScanPullReq = 10031, //10031是截图框选时发送的请求, 参数应该是某种编码后的图片数据 |
| 88 | + UtilityQRScanPullResp = 10032, //这两种请求的返回ID都是10032 |
| 89 | + UtilityTextScanPushResp = 10040 //TextScan具体在扫什么不是很清楚 可能是用来判断图片上是否有文字 |
| 90 | +}; |
| 91 | +``` |
| 92 | +pb数据就是对应的序列化后的protobuf数据(具体请查看proto文件夹下的定义文件), 例如: |
| 93 | +``` |
| 94 | +message QRScanReqMessage { |
| 95 | + string origin_pic = 1; //原始图片路径 可选 |
| 96 | + string decode_pic = 2; //解码后的图片路径 可选 |
| 97 | + int32 unknown_0 = 3; //未知 可选 一般为0 |
| 98 | + bytes encode_pic_data = 4; //某种编码后的图片数据 可选 |
| 99 | + int32 encode_pic_x = 5; //编码图片长 可选 |
| 100 | + int32 encode_pic_y = 6; //编码图片宽 可选 |
| 101 | + int32 unknown_1 = 7; //未知 一般为1 |
| 102 | + int32 text_scan_id = 8; //可能是 |
| 103 | + int32 unknown_3 = 9; //未知 一般为1 |
| 104 | +} |
| 105 | +
|
| 106 | +``` |
| 107 | + |
| 108 | + |
0 commit comments