From cdd00d665d5d21cbd03dc1e2a7fd191154d5e082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sat, 12 Oct 2024 19:51:29 +0800 Subject: [PATCH] fix: packet send/recv --- src/common/lru-cache.ts | 4 +++- src/core/apis/group.ts | 25 ++++++++++++++++++------- src/core/apis/packet.ts | 11 +---------- src/core/helper/packet.ts | 16 +++++++++------- 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/common/lru-cache.ts b/src/common/lru-cache.ts index 1cb54212c..0e537b6ab 100644 --- a/src/common/lru-cache.ts +++ b/src/common/lru-cache.ts @@ -24,7 +24,9 @@ export class LRUCache { } else if (this.cache.size >= this.capacity) { // If the cache is full, remove the least recently used key (the first one in the map) const firstKey = this.cache.keys().next().value; - this.cache.delete(firstKey); + if (firstKey !== undefined) { + this.cache.delete(firstKey); + } } this.cache.set(key, value); } diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 84f0f2c16..2ea0b540d 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -15,7 +15,16 @@ import { NTEventWrapper } from '@/common/event'; import { encodeGroupPoke } from '../proto/Poke'; import { randomUUID } from 'crypto'; import { RequestUtil } from '@/common/request'; - +interface recvPacket +{ + type: string,//仅recv + trace_id_md5?: string, + data: { + seq: number, + hex_data: string, + cmd: string + } +} export class NTQQGroupApi { context: InstanceContext; core: NapCatCore; @@ -39,12 +48,9 @@ export class NTQQGroupApi { this.context.logger.logDebug(`加载${this.groups.length}个群组缓存完成`); console.log('pid', process.pid); // this.session = await frida.attach(process.pid); - // setTimeout(async () => { - // let data = Buffer.from('089601', 'hex').toString('utf-8');//optional int32 a = 1; - // console.log('data', Buffer.from(data).toString('hex')); - // let ret = await this.core.context.session.getMsgService().sendSsoCmdReqByContend("OidbSvcTrpcTcp.0xfe1_2", data); - // console.log('sendSsoCmdReqByContend', ret); - // }, 20000); + setTimeout(async () => { + this.sendPocketRkey(); + }, 10000); } async getCoreAndBaseInfo(uids: string[]) { return await this.core.eventWrapper.callNoListenerEvent( @@ -53,6 +59,11 @@ export class NTQQGroupApi { uids, ); } + async sendPocketRkey() { + let hex = '08E7A00210CA01221D0A130A05080110CA011206A80602B006011A0208022206080A081408022A006001'; + let ret = await this.core.apis.PacketApi.sendPacket('OidbSvcTrpcTcp.0x9067_202', hex, true); + console.log('ret: ', ret); + } async sendPacketPoke(group: number, peer: number) { let data = encodeGroupPoke(group, peer); let hex = Buffer.from(data).toString('hex'); diff --git a/src/core/apis/packet.ts b/src/core/apis/packet.ts index 62e78f101..6666b8718 100644 --- a/src/core/apis/packet.ts +++ b/src/core/apis/packet.ts @@ -53,16 +53,7 @@ export class NTQQPacketApi { async sendPacket(cmd: string, data: string, rsp = false) { // wtfk tx // 校验失败和异常 可能返回undefined - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { if (!this.isInit || !this.PacketClient?.isConnected) { this.core.context.logger.logError('PacketClient is not init'); return undefined; diff --git a/src/core/helper/packet.ts b/src/core/helper/packet.ts index 05b7b7104..9f2944219 100644 --- a/src/core/helper/packet.ts +++ b/src/core/helper/packet.ts @@ -1,13 +1,15 @@ import { LogWrapper } from "@/common/log"; import { LRUCache } from "@/common/lru-cache"; import WebSocket from "ws"; +import { createHash } from "crypto"; export class PacketClient { private websocket: WebSocket | undefined; public isConnected: boolean = false; private reconnectAttempts: number = 0; private maxReconnectAttempts: number = 5; - private cb = new LRUCache(500); + //trace_id-type callback + private cb = new LRUCache(500); constructor(private url: string, public logger: LogWrapper) { } connect(): Promise { @@ -51,7 +53,7 @@ export class PacketClient { } } async registerCallback(trace_id: string, type: string, callback: any): Promise { - this.cb.put(trace_id, { type: type, callback: callback }); + this.cb.put(createHash('md5').update(trace_id).digest('hex') + type, callback); } async init(pid: number, recv: string, send: string): Promise { @@ -79,7 +81,6 @@ export class PacketClient { data: data, trace_id: trace_id }; - this.websocket.send(JSON.stringify(commandMessage)); if (rsp) { this.registerCallback(trace_id, 'recv', (json: any) => { @@ -103,10 +104,11 @@ export class PacketClient { try { let json = JSON.parse(message.toString()); - let trace_id = json.trace_id; - let event = this.cb.get(trace_id); - if (event?.type == 'all' || event?.type == json.type) { - await event?.callback(json.data); + let trace_id_md5 = json.trace_id_md5; + let action = json?.type ?? 'init'; + let event = this.cb.get(trace_id_md5 + action); + if (event) { + await event(json.data); } //console.log("Received message:", json); } catch (error) {