Skip to content

Commit ff28874

Browse files
committed
3.9.10.19 init
1. Support WeChat version 3.9.10.19 2. Support list - getMyselfInfo - sendMsg - recvMsg
1 parent 2e8b70f commit ff28874

7 files changed

+179
-158
lines changed

README.md

+8
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,14 @@ puppet-xp|wechat|npm install|
102102

103103
## HISTORY
104104

105+
### v2.0.0
106+
107+
1. Support WeChat version 3.9.10.19
108+
2. Support list
109+
- getMyselfInfo
110+
- sendMsg
111+
- recvMsg
112+
105113
### v1.13.12
106114

107115
1. Fixed the bug where the system crashes upon receiving a message before successful startup

examples/raw-sidecar-hook.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,12 @@ async function main () {
7878
console.info('text:', text)
7979
if (talkerId && text === 'ding') {
8080
console.info('叮咚测试: ding found, reply dong')
81-
await sidecar.sendMsg(talkerId || toId, 'dong')
82-
// await sidecar.sendAtMsg(toId, 'dong',talkerId)
81+
try {
82+
await sidecar.sendMsg(talkerId || toId, 'dong')
83+
// await sidecar.sendAtMsg(toId, 'dong',talkerId)
84+
} catch (e) {
85+
console.error('发送消息失败:', e)
86+
}
8387
}
8488
}
8589

examples/raw-sidecar.ts

+44-44
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,17 @@ async function main () {
3737

3838
console.info('WeChat Sidecar started.')
3939

40-
const ver = await sidecar.getWeChatVersion()
41-
const verStr = await sidecar.getWechatVersionString()
42-
const isSupported = await sidecar.checkSupported()
43-
console.info(`\nWeChat Version: ${ver} -> ${verStr} , Supported: ${isSupported}\n`)
40+
// const ver = await sidecar.getWeChatVersion()
41+
// const verStr = await sidecar.getWechatVersionString()
42+
// const isSupported = await sidecar.checkSupported()
43+
// console.info(`\nWeChat Version: ${ver} -> ${verStr} , Supported: ${isSupported}\n`)
4444

45-
const isLoggedIn = await sidecar.isLoggedIn()
45+
// const isLoggedIn = await sidecar.isLoggedIn()
4646
const myselfInfo = await sidecar.getMyselfInfo()
4747
console.info(`当前登陆账号信息: ${myselfInfo}`)
4848

49-
const loginUrl = await sidecar.getLoginUrl()
50-
console.info(`登陆二维码地址loginUrl: ${loginUrl}`)
49+
// const loginUrl = await sidecar.getLoginUrl()
50+
// console.info(`登陆二维码地址loginUrl: ${loginUrl}`)
5151

5252
// const contact = await sidecar.getChatroomMemberInfo()
5353
// //console.log(contact)
@@ -74,18 +74,18 @@ async function main () {
7474
void onScan(args)
7575
break
7676
case 'loginEvent':{
77-
if (!isLoggedIn) {
78-
let loginRes = false
79-
sidecar.isLoggedIn().then(res => {
80-
loginRes = res
81-
if (loginRes) {
82-
void onLogin()
83-
}
84-
return res
85-
}).catch(e => {
86-
console.error('登录状态检查失败:', e)
87-
})
88-
}
77+
// if (!isLoggedIn) {
78+
// let loginRes = false
79+
// sidecar.isLoggedIn().then(res => {
80+
// loginRes = res
81+
// if (loginRes) {
82+
// void onLogin()
83+
// }
84+
// return res
85+
// }).catch(e => {
86+
// console.error('登录状态检查失败:', e)
87+
// })
88+
// }
8989
break
9090
}
9191
case 'agentReady':
@@ -100,31 +100,31 @@ async function main () {
100100
}
101101
})
102102

103-
const onLogin = async () => {
104-
console.info('登陆事件触发')
105-
console.info(`登陆状态: ${isLoggedIn}`)
106-
// await sidecar.sendMsg('filehelper', 'Sidecar is ready!')
107-
const contacts = await sidecar.getContact()
108-
// console.log(`contacts: ${contacts}`)
109-
const contactsJSON = JSON.parse(contacts)
110-
console.log('contacts列表:', contactsJSON.length)
111-
112-
for (const contact of contactsJSON) {
113-
if (!contact.name) {
114-
console.info('好友:', JSON.stringify(contact))
115-
}
116-
}
103+
// const onLogin = async () => {
104+
// console.info('登陆事件触发')
105+
// console.info(`登陆状态: ${isLoggedIn}`)
106+
// await sidecar.sendMsg('filehelper', 'Sidecar is ready!')
107+
// const contacts = await sidecar.getContact()
108+
// console.log(`contacts: ${contacts}`)
109+
// const contactsJSON = JSON.parse(contacts)
110+
// console.log('contacts列表:', contactsJSON.length)
111+
112+
// for (const contact of contactsJSON) {
113+
// if (!contact.name) {
114+
// console.info('好友:', JSON.stringify(contact))
115+
// }
116+
// }
117117

118-
const roomList = await sidecar.getChatroomMemberInfo()
119-
// console.log(`roomList: ${roomList}`)
120-
const roomListJSON = JSON.parse(roomList)
121-
console.log('roomList列表:', roomListJSON.length)
122-
// for (const room of roomListJSON) {
123-
// console.info('room:', room)
124-
// }
125-
// await sidecar.sendAtMsg('21341182572@chatroom', new Date().toLocaleString(), 'atorber', '超哥');
118+
// const roomList = await sidecar.getChatroomMemberInfo()
119+
// console.log(`roomList: ${roomList}`)
120+
// const roomListJSON = JSON.parse(roomList)
121+
// console.log('roomList列表:', roomListJSON.length)
122+
// for (const room of roomListJSON) {
123+
// console.info('room:', room)
124+
// }
125+
// await sidecar.sendAtMsg('21341182572@chatroom', new Date().toLocaleString(), 'atorber', '超哥');
126126

127-
}
127+
// }
128128

129129
const onLogout = (bySrv: number) => {
130130
console.info('登出事件触发:', bySrv)
@@ -170,8 +170,8 @@ async function main () {
170170
// const nickname = await sidecar.GetContactOrChatRoomNickname(talkerId)
171171
// console.log('发言人昵称:', nickname)
172172

173-
const talker = await sidecar.getChatroomMemberNickInfo(talkerId, toId)
174-
console.log('发言人:', talker)
173+
// const talker = await sidecar.getChatroomMemberNickInfo(talkerId, toId)
174+
// console.log('发言人:', talker)
175175
if (talkerId && text === 'ding') {
176176
console.info('叮咚测试: ding found, reply dong')
177177
await sidecar.sendMsg(toId, 'dong')

package.json

+1-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "wechaty-puppet-xp",
3-
"version": "1.13.12",
3+
"version": "2.0.0",
44
"description": "Puppet XP for Wechaty",
55
"type": "module",
66
"exports": {
@@ -30,7 +30,6 @@
3030
"start:raw:nobuild": "cross-env BROLOG_LEVEL=info NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/raw-sidecar.ts",
3131
"start:raw:info": "npm run build:agent && cross-env BROLOG_LEVEL=info NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/raw-sidecar.ts",
3232
"start:raw:hook": "npm run build:agent && cross-env BROLOG_LEVEL=info NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/raw-sidecar-hook.ts",
33-
"start:xp:3.9.10.19": "frida -l src/init-agent-script.js WeChat.exe",
3433
"start:ripe": "cross-env WECHATY_LOG=verbose NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/ripe-wechaty.ts",
3534
"start:ripe:info": "npm run build:agent && cross-env WECHATY_LOG=info NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/ripe-wechaty.ts",
3635
"start:ripe:demo": "npm run build:agent && cross-env WECHATY_LOG=info NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/demo.ts",
@@ -102,10 +101,5 @@
102101
"publishConfig": {
103102
"access": "public",
104103
"tag": "latest"
105-
},
106-
"git": {
107-
"scripts": {
108-
"pre-push": "npx git-scripts-pre-push"
109-
}
110104
}
111105
}

src/init-agent-script.js

+30-25
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ var wxOffsets = {
232232
}
233233
};
234234
var moduleBaseAddress = Module.getBaseAddress('WeChatWin.dll');
235-
// console.info('moduleBaseAddress:', moduleBaseAddress)
235+
// console.log('moduleBaseAddress:', moduleBaseAddress)
236236
/* -----------------base------------------------- */
237237
var writeWStringPtr = function (str) {
238238
console.log("\u8F93\u5165\u5B57\u7B26\u4E32\u5185\u5BB9: ".concat(str));
@@ -544,62 +544,62 @@ var getMyselfInfoFunction = function () {
544544
out.private_key = serviceAddr.add(0x7D8).readPointer().readUtf8String(serviceAddr.add(0x7D8 + 0x10).readU32());
545545
}
546546
}
547-
// console.info('out:', JSON.stringify(out, null, 2))
547+
// console.log('out:', JSON.stringify(out, null, 2))
548548
var myself = {
549549
id: out.wxid,
550550
code: out.account,
551551
name: out.name,
552552
head_img_url: out.head_img
553553
};
554554
var myselfJson = JSON.stringify(myself, null, 2);
555-
// console.info('myselfJson:', myselfJson)
555+
// console.log('myselfJson:', myselfJson)
556556
return myselfJson;
557557
};
558-
// console.info('myselfInfo:', getMyselfInfoFunction())
559-
// 发送文本消息
560-
/**
561-
* @Call: sendMsgNativeFunction -> agentSendMsg
562-
*/
563558
var sendMsgNativeFunction = (function (contactId, text) {
564-
// console.log('\n\n');
559+
console.log('\n\n');
560+
console.log('sendMsgNativeFunction contactId:', contactId);
565561
var to_user = null;
566562
var text_msg = null;
567563
// const to_user = Memory.alloc(wxid.length * 2 + 2)
568564
// to_user.writeUtf16String(wxid)
569565
// to_user = new WeChatString(wxid).getMemoryAddress();
570-
// console.info('wxid:', wxid)
566+
// console.log('wxid:', wxid)
571567
to_user = writeWStringPtr(contactId);
572-
console.info('to_user wxid :', readWStringPtr(to_user).readUtf16String());
568+
console.log('to_user wxid :', readWStringPtr(to_user).readUtf16String());
573569
// const text_msg = Memory.alloc(msg.length * 2 + 2)
574570
// text_msg.writeUtf16String(msg)
575571
// text_msg = new WeChatString(msg).getMemoryAddress();
576572
text_msg = writeWStringPtr(text);
577-
console.info('text_msg msg:', readWStringPtr(text_msg).readUtf16String());
573+
console.log('text_msg msg:', readWStringPtr(text_msg).readUtf16String());
578574
// console.log('\n\n');
579575
var send_message_mgr_addr = moduleBaseAddress.add(wxOffsets.kGetSendMessageMgr);
580576
var send_text_msg_addr = moduleBaseAddress.add(wxOffsets.kSendTextMsg);
581577
var free_chat_msg_addr = moduleBaseAddress.add(wxOffsets.kFreeChatMsg);
578+
console.log('send_message_mgr_addr:', send_message_mgr_addr);
582579
var chat_msg = Memory.alloc(0x460 * Process.pointerSize); // 在frida中分配0x460字节的内存
583580
chat_msg.writeByteArray(Array(0x460 * Process.pointerSize).fill(0)); // 清零分配的内存
581+
console.log('chat_msg:', chat_msg);
584582
var temp = Memory.alloc(3 * Process.pointerSize); // 分配临时数组内存
585583
temp.writeByteArray(Array(3 * Process.pointerSize).fill(0)); // 初始化数组
584+
console.log('temp:', temp);
586585
// 定义函数原型并实例化 NativeFunction 对象
587586
var mgr = new NativeFunction(send_message_mgr_addr, 'void', []);
588-
var send = new NativeFunction(send_text_msg_addr, 'uint64', ['pointer', 'pointer', 'pointer', 'pointer', 'int64', 'int64', 'int64', 'int64']);
587+
var sendMsg = new NativeFunction(send_text_msg_addr, 'uint64', ['pointer', 'pointer', 'pointer', 'pointer', 'int64', 'int64', 'int64', 'int64']);
589588
var free = new NativeFunction(free_chat_msg_addr, 'void', ['pointer']);
589+
console.log('mgr:', mgr);
590590
// 调用发送消息管理器初始化
591591
mgr();
592592
// 发送文本消息
593-
// console.info('chat_msg:', chat_msg);
594-
// console.info('to_user:', to_user);
595-
// console.info('text_msg:', text_msg);
596-
// console.info('temp:', temp);
597-
var success = send(chat_msg, to_user, text_msg, temp, 1, 1, 0, 0);
598-
console.info('sendText success:', success);
593+
// console.log('chat_msg:', chat_msg);
594+
// console.log('to_user:', to_user);
595+
// console.log('text_msg:', text_msg);
596+
// console.log('temp:', temp);
597+
var success = sendMsg(chat_msg, to_user, text_msg, temp, 1, 1, 0, 0);
598+
console.log('sendText success:', success);
599599
// 释放ChatMsg内存
600600
free(chat_msg);
601+
console.log('sendMsgNativeFunction success:', success);
601602
});
602-
// sendMsgNativeFunction('filehelper', 'hello world')
603603
// 接收消息回调
604604
/**
605605
* @Hook: recvMsg -> recvMsgNativeCallback
@@ -612,7 +612,7 @@ var recvMsgNativeCallback = (function () {
612612
onEnter: function (args) {
613613
try {
614614
// 参数打印
615-
console.log("doAddMsg called with args: " + args[0] + ", " + args[1] + ", " + args[2]);
615+
// console.log("doAddMsg called with args: " + args[0] + ", " + args[1] + ", " + args[2]);
616616
// 调用处理函数
617617
var msg = HandleSyncMsg(args[0], args[1], args[2]);
618618
// console.log("msg: " + JSON.stringify(msg, null, 2));
@@ -642,9 +642,6 @@ var recvMsgNativeCallback = (function () {
642642
talkerId = msg.fromUser;
643643
content = msg.content;
644644
}
645-
if (content === 'ding') {
646-
sendMsgNativeFunction(talkerId, 'dong');
647-
}
648645
var myContentPtr_1 = Memory.alloc(content.length * 2 + 1);
649646
myContentPtr_1.writeUtf16String(content);
650647
var myTalkerIdPtr_1 = Memory.alloc(talkerId.length * 2 + 1);
@@ -667,7 +664,7 @@ var recvMsgNativeCallback = (function () {
667664
}
668665
catch (e) {
669666
console.error('接收消息回调失败:', e);
670-
throw new Error(e);
667+
// throw new Error(e)
671668
}
672669
}
673670
});
@@ -678,3 +675,11 @@ var recvMsgNativeCallback = (function () {
678675
return null;
679676
}
680677
})();
678+
rpc.exports = {
679+
sendMsgNativeFunction: function (contactId, text) {
680+
return sendMsgNativeFunction(contactId, text);
681+
},
682+
getMyselfInfoFunction: function () {
683+
return getMyselfInfoFunction();
684+
}
685+
};

0 commit comments

Comments
 (0)