## 微信小程序协议
先抓包一个小程序进程的返回数据 pkg
大概如下格式
17 //协议状态位
03 03 //协议类型 小程序
07 99 //content 长度
BB 81 24 B3 67 12 D2 34 F9 31 F4 95 46 D9 83 C1
9D E3 7C 5B B6 6F B2 E6 F0 AC 1A FE 9E 02 CD B6
67 EA E9 2D 5B C3 7A 26 7C 34 B5 EF 8D B2 30 C3
BA 90 BB 8E 81 BB A7 A9 58 A3 C9 A7 62 14 4D 14
39 EF 8D 17 FB B9 AB 02 CB 85 8F 9A 84 15 94 40
21 15 DB 40 18 82 2F 83 D2 6A 2D 8F 2C 28 FC 67
FC 88 32 D6 6D A1 27 95 36 76 C2 84 3D 26 20 48
66 CC 88 53 88 38 3E 95 F0 32 F6 2A 53 A3 28 DD
26 5A 82 2A C8 88 03 5F FB F9 FC 7C 95 AB AB F0
71 3A 99 C5 7A 30 A0 BC 81 9D 7B E9 D3 99 2E 7E
7C D2 50 2B AC E0 64 6A 8B 48 00 36 70 13 10 AC
EF CB 2E AB 23 AA AD D3 9D 5B 88 //content
其中第一个字节是状态位 分别有 14 15 16 17这几种 16 17 是业务正常数据。15应该是失败。
小程序第一次会读取pkg的前5个字节。并从中读取后两位作为下一次读取时的参数(content长度)
读取到content数据后。会从中读取前8位作为head处理。剩余数据作为body处理。
BB 81 24 B3 67 12 D2 34 //head
F9 31 F4 95 46 D9 83 C1 9D E3 7C 5B B6 6F B2 E6
F0 AC 1A FE 9E 02 CD B6 67 EA E9 2D 5B C3 7A 26
7C 34 B5 EF 8D B2 30 C3 BA 90 BB 8E 81 BB A7 A9
58 A3 C9 A7 62 14 4D 14 39 EF 8D 17 FB B9 AB 02
CB 85 8F 9A 84 15 94 40 21 15 DB 40 18 82 2F 83
D2 6A 2D 8F 2C 28 FC 67 FC 88 32 D6 6D A1 27 95
36 76 C2 84 3D 26 20 48 66 CC 88 53 88 38 3E 95
F0 32 F6 2A 53 A3 28 DD 26 5A 82 2A C8 88 03 5F
FB F9 FC 7C 95 AB AB F0 71 3A 99 C5 7A 30 A0 BC
81 9D 7B E9 D3 99 2E 7E 7C D2 50 2B AC E0 64 6A
8B 48 00 36 70 13 10 AC EF CB 2E AB 23 AA AD D3
9D 5B 88 //body
对body进行一次解密后得到response数据。
从解密的参数来看应该是aes-128-gcm算法
解密后的数据长度为body长度-0x10.
解密后的数据如下,我将其分为了两部分。第一部分为协议头。第二部分为response.
00 00 31 01 04 00 00 00 0F 88 61 96 D0 7A BE 94 03 AA 69 3F 75 04 01 09 40 82 E3 6C DC 10 54 C5 A3 7F 5F 96 1D 75 D0 62 0D 26 3D 4C 74 41 EA FB 24 E3 B1 05 4C 1C 37 E1
59 EF 00 07 3E 00 00 00 00 00 0F
7B 22 72 65 74 5F 6D 6F 64 75 6C 65 22 3A 7B 22 63 6F 75 6E 74 22 3A ... //response
其中response的数据可以直接转文本就是明文字符了。
{"ret_module":{"count":50,"data":[{"slot_num":7,"device_id":100031366,"order_id":31359415,"name":"千惠便利店","coins":3,"create_time":"2022-08-09 09:52:36","stack_id":26507501,"status":1,"refundCoins":null},{"order_id":28234418,"slot_num":7,"device_id":100031366,"name":"千惠便利店","coins":2,"s...略
如果数据走的HTTP协议的话。解密后的数据则大概如下 其中包含协议头和raw。
48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D 0A 53 65 72 76 65 72 3A 20 6E 67 69 6E 78 0D 0A 44 61 74 65 3A 20 4D 6F 6E 2C 20 30 37 20 4E 6F 76 20 32 30 32 32 20 31 31 3A 32 38 3A 31 32 20 47 4D 54 0D 0A 43 6F 6E 74 65 6E 74 2D 54 79 70 65 3A 20 61 70 70 6C 69 63 61 74 69 6F 6E 2F 6A 73 6F 6E 0D 0A 54 72 61 6E 73 66 65 72 2D 45 6E 63 6F 64 69 6E 67 3A 20 63 68 75 6E 6B 65 64 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 6B 65 65 70 2D 61 6C 69 76 65 0D 0A 58 2D 50 65 72 6D 69 74 74 65 64 2D 43 72 6F 73 73 2D 44 6F 6D 61 69 6E 2D 50 6F 6C 69 63 69 65 73 3A 20 61 6C 6C 0D 0A 58 2D 44 6F 77 6E 6C 6F 61 64 2D 4F 70 74 69 6F 6E 73 3A 20 76 61 6C 75 65 0D 0A 58 2D 46 72 61 6D 65 2D 4F 70 74 69 6F 6E 73 3A 20 53 41 4D 45 4F 52 49 47 49 4E 0D 0A 58 2D 43 6F 6E 74 65 6E 74 2D 54 79 70 65 2D 4F 70 74 69 6F 6E 73 3A 20 6E 6F 73 6E 69 66 66 0D 0A 58 2D 58 53 53 2D 50 72 6F 74 65 63 74 69 6F 6E 3A 20 31 0D 0A 43 6F 6E 74 65 6E 74 2D 53 65 63 75 72 69 74 79 2D 50 6F 6C 69 63 79 3A 20 75 70 67 72 61 64 65 2D 69 6E 73 65 63 75 72 65 2D 72 65 71 75 65 73 74 73 3B 63 6F 6E 74 65 6E 74 20 2A 0D 0A 53 74 72 69 63 74 2D 54 72 61 6E 73 70 6F 72 74 2D 53 65 63 75 72 69 74 79 3A 20 6D 61 78 2D 61 67 65 3D 36 33 30 37 32 30 30 30 3B 20 69 6E 63 6C 75 64 65 53 75 62 64 6F 6D 61 69 6E 73 3B 20 70 72 65 6C 6F 61 64 0D 0A 52 65 66 65 72 72 65 72 2D 50 6F 6C 69 63 79 3A 20 6F 72 69 67 69 6E 2D 77 68 65 6E 2D 63 72 6F 73 73 6F 72 69 67 69 6E 0D 0A 0D 0A 36 31 0D 0A 7B 22 63 6F 64 65 22 3A 22 32 30 30 22 2C 22 6D 73 67 22 3A 22 E6 93 8D E4 BD 9C E6 88 90 E5 8A 9F 22 2C 22 64 61 74 61 22 3A 22 76 34 6E 50 62 75 33 62 55 70 71 6C 77 71 6D 64 7A 58 2B 36 74 51 3D 3D 22 2C 22 74 69 6D 65 53 74 61 6D 70 22 3A 22 31 36 36 37 38 32 30 34 39 32 31 32 37 22 7D
转字符串后如下:
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 07 Nov 2022 11:28:12 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
X-Permitted-Cross-Domain-Policies: all
X-Download-Options: value
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Content-Security-Policy: upgrade-insecure-requests;content *
Strict-Transport-Security: max-age=63072000; includeSubdomains; preload
Referrer-Policy: origin-when-crossorigin
61
{"code":"200","msg":"操作成功","data":"v4nPbu3bUpqlwqmdzX+6tQ==","timeStamp":"1667820492127"}
0
最终效果:
拦截小程序发包源码:
WeChat-Hook/PC微信协议/小程序相关算法 at main · snlie/WeChat-Hook · GitHub