Add PYQ control flag

This commit is contained in:
Changhua 2023-07-16 18:35:53 +08:00
parent fed3143b19
commit 2d5097ee3d
6 changed files with 69 additions and 58 deletions

View File

@ -44,6 +44,7 @@ message Request
DecPath dec = 10; DecPath dec = 10;
Transfer tf = 11; Transfer tf = 11;
uint64 ui64 = 12; // 64 uint64 ui64 = 12; // 64
bool flag = 13;
} }
} }

View File

@ -1,8 +1,10 @@
#include "framework.h" #include "framework.h"
#include "log.h"
#include "spy_types.h" #include "spy_types.h"
#include "util.h" #include "util.h"
extern bool gIsListeningPyq;
extern WxCalls_t g_WxCalls; extern WxCalls_t g_WxCalls;
extern DWORD g_WeChatWinDllAddr; extern DWORD g_WeChatWinDllAddr;
@ -62,6 +64,11 @@ static int GetNextPage(uint64_t id)
int RefreshPyq(uint64_t id) int RefreshPyq(uint64_t id)
{ {
if (!gIsListeningPyq) {
LOG_ERROR("没有启动朋友圈消息接收参考enable_receiving_msg");
return -1;
}
if (id == 0) { if (id == 0) {
return GetFirstPage(); return GetFirstPage();
} }

View File

@ -12,7 +12,7 @@
#include "util.h" #include "util.h"
// Defined in rpc_server.cpp // Defined in rpc_server.cpp
extern bool gIsListening; extern bool gIsListening, gIsListeningPyq;
extern mutex gMutex; extern mutex gMutex;
extern condition_variable gCV; extern condition_variable gCV;
extern queue<WxMsg_t> gMsgQueue; extern queue<WxMsg_t> gMsgQueue;
@ -31,7 +31,6 @@ static DWORD recvPyqHookAddr = 0;
static DWORD recvPyqCallAddr = 0; static DWORD recvPyqCallAddr = 0;
static DWORD recvPyqJumpBackAddr = 0; static DWORD recvPyqJumpBackAddr = 0;
static CHAR recvPyqBackupCode[5] = { 0 }; static CHAR recvPyqBackupCode[5] = { 0 };
static bool gIsListeningPyq = false;
MsgTypes_t GetMsgTypes() MsgTypes_t GetMsgTypes()
{ {
@ -172,7 +171,6 @@ void ListenMessage()
HookAddress(recvMsgHookAddr, RecieveMsgFunc, recvMsgBackupCode); HookAddress(recvMsgHookAddr, RecieveMsgFunc, recvMsgBackupCode);
gIsListening = true; gIsListening = true;
ListenPyq();
} }
void UnListenMessage() void UnListenMessage()
@ -182,7 +180,6 @@ void UnListenMessage()
} }
UnHookAddress(recvMsgHookAddr, recvMsgBackupCode); UnHookAddress(recvMsgHookAddr, recvMsgBackupCode);
gIsListening = false; gIsListening = false;
UnListenPyq();
} }
void DispatchPyq(DWORD reg) void DispatchPyq(DWORD reg)

View File

@ -39,7 +39,8 @@
extern int IsLogin(void); // Defined in spy.cpp extern int IsLogin(void); // Defined in spy.cpp
bool gIsListening; bool gIsListening = false;
bool gIsListeningPyq = false;
mutex gMutex; mutex gMutex;
condition_variable gCV; condition_variable gCV;
queue<WxMsg_t> gMsgQueue; queue<WxMsg_t> gMsgQueue;
@ -377,7 +378,7 @@ static void PushMessage()
nng_close(msg_sock); nng_close(msg_sock);
} }
bool func_enable_recv_txt(uint8_t *out, size_t *len) bool func_enable_recv_txt(bool pyq, uint8_t *out, size_t *len)
{ {
Response rsp = Response_init_default; Response rsp = Response_init_default;
rsp.func = Functions_FUNC_ENABLE_RECV_TXT; rsp.func = Functions_FUNC_ENABLE_RECV_TXT;
@ -385,6 +386,9 @@ bool func_enable_recv_txt(uint8_t *out, size_t *len)
rsp.msg.status = -1; rsp.msg.status = -1;
ListenMessage(); ListenMessage();
if (pyq) {
ListenPyq();
}
HANDLE msgThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)PushMessage, NULL, NULL, NULL); HANDLE msgThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)PushMessage, NULL, NULL, NULL);
if (msgThread != 0) { if (msgThread != 0) {
CloseHandle(msgThread); CloseHandle(msgThread);
@ -408,6 +412,7 @@ bool func_disable_recv_txt(uint8_t *out, size_t *len)
rsp.which_msg = Response_status_tag; rsp.which_msg = Response_status_tag;
rsp.msg.status = 0; rsp.msg.status = 0;
UnListenPyq();
UnListenMessage(); // 可能需要1秒之后才能退出见 PushMessage UnListenMessage(); // 可能需要1秒之后才能退出见 PushMessage
pb_ostream_t stream = pb_ostream_from_buffer(out, *len); pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
@ -650,7 +655,8 @@ static bool dispatcher(uint8_t *in, size_t in_len, uint8_t *out, size_t *out_len
#endif #endif
case Functions_FUNC_ENABLE_RECV_TXT: { case Functions_FUNC_ENABLE_RECV_TXT: {
LOG_DEBUG("[Functions_FUNC_ENABLE_RECV_TXT]"); LOG_DEBUG("[Functions_FUNC_ENABLE_RECV_TXT]");
ret = func_enable_recv_txt(out, out_len); LOG_BUFFER(in, in_len);
ret = func_enable_recv_txt(req.msg.flag, out, out_len);
break; break;
} }
case Functions_FUNC_DISABLE_RECV_TXT: { case Functions_FUNC_DISABLE_RECV_TXT: {

View File

@ -358,7 +358,7 @@ class Wcf():
""" """
return self.msgQ.get(block, timeout=1) return self.msgQ.get(block, timeout=1)
def enable_receiving_msg(self) -> bool: def enable_receiving_msg(self, pyq=False) -> bool:
"""允许接收消息,成功后通过 `get_msg` 读取消息""" """允许接收消息,成功后通过 `get_msg` 读取消息"""
def listening_msg(): def listening_msg():
rsp = wcf_pb2.Response() rsp = wcf_pb2.Response()
@ -379,13 +379,14 @@ class Wcf():
req = wcf_pb2.Request() req = wcf_pb2.Request()
req.func = wcf_pb2.FUNC_ENABLE_RECV_TXT # FUNC_ENABLE_RECV_TXT req.func = wcf_pb2.FUNC_ENABLE_RECV_TXT # FUNC_ENABLE_RECV_TXT
req.flag = pyq
rsp = self._send_request(req) rsp = self._send_request(req)
if rsp.status != 0: if rsp.status != 0:
return False return False
self._is_receiving_msg = True self._is_receiving_msg = True
# 阻塞,把控制权交给用户 # 阻塞,把控制权交给用户
# self._rpc_get_message(callback) # self.listening_msg(callback)
# 不阻塞,启动一个新的线程来接收消息 # 不阻塞,启动一个新的线程来接收消息
Thread(target=listening_msg, name="GetMessage", daemon=True).start() Thread(target=listening_msg, name="GetMessage", daemon=True).start()
@ -541,7 +542,6 @@ class Wcf():
rsp = self._send_request(req) rsp = self._send_request(req)
return rsp.status return rsp.status
def decrypt_image(self, src: str, dst: str) -> bool: def decrypt_image(self, src: str, dst: str) -> bool:
"""解密图片: """解密图片:

File diff suppressed because one or more lines are too long