Skip to content

Commit fa218f1

Browse files
authored
Update README.md
1 parent 27c048f commit fa218f1

1 file changed

Lines changed: 107 additions & 43 deletions

File tree

README.md

Lines changed: 107 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,108 @@
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的插件并与之通信。
264

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

Comments
 (0)