Impl WX logging
This commit is contained in:
parent
a1a94d946c
commit
ec2ad71ccf
@ -13,18 +13,22 @@
|
||||
#include "util.h"
|
||||
|
||||
// Defined in rpc_server.cpp
|
||||
extern bool gIsListening, gIsListeningPyq;
|
||||
extern bool gIsLogging, gIsListening, gIsListeningPyq;
|
||||
extern mutex gMutex;
|
||||
extern condition_variable gCV;
|
||||
extern queue<WxMsg_t> gMsgQueue;
|
||||
|
||||
// Defined in spy.cpp
|
||||
extern WxCalls_t g_WxCalls;
|
||||
extern UINT64 g_WeChatWinDllAddr;
|
||||
extern QWORD g_WeChatWinDllAddr;
|
||||
|
||||
typedef QWORD (*funcRecvMsg_t)(QWORD, QWORD);
|
||||
typedef QWORD (*funcWxLog_t)(QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD);
|
||||
|
||||
typedef UINT64 (*funcRecvMsg_t)(UINT64, UINT64);
|
||||
static funcRecvMsg_t funcRecvMsg = nullptr;
|
||||
static funcRecvMsg_t realRecvMsg = nullptr;
|
||||
static funcWxLog_t funcWxLog = nullptr;
|
||||
static funcWxLog_t realWxLog = nullptr;
|
||||
|
||||
MsgTypes_t GetMsgTypes()
|
||||
{
|
||||
@ -67,7 +71,7 @@ MsgTypes_t GetMsgTypes()
|
||||
return m;
|
||||
}
|
||||
|
||||
static UINT64 DispatchMsg(UINT64 arg1, UINT64 arg2)
|
||||
static QWORD DispatchMsg(QWORD arg1, QWORD arg2)
|
||||
{
|
||||
WxMsg_t wxMsg = { 0 };
|
||||
try {
|
||||
@ -123,6 +127,70 @@ static UINT64 DispatchMsg(UINT64 arg1, UINT64 arg2)
|
||||
return realRecvMsg(arg1, arg2);
|
||||
}
|
||||
|
||||
static QWORD PrintWxLog(QWORD a1, QWORD a2, QWORD a3, QWORD a4, QWORD a5, QWORD a6, QWORD a7, QWORD a8, QWORD a9,
|
||||
QWORD a10, QWORD a11, QWORD a12)
|
||||
{
|
||||
QWORD p = realWxLog(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
|
||||
if (p == 0 || p == 1) {
|
||||
return p;
|
||||
}
|
||||
|
||||
LOG_INFO("【WX】\n{}", GB2312ToUtf8((char *)p));
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
void EnableLog()
|
||||
{
|
||||
MH_STATUS status = MH_UNKNOWN;
|
||||
if (g_WeChatWinDllAddr == 0) {
|
||||
LOG_WARN("g_WeChatWinDllAddr == 0");
|
||||
return;
|
||||
}
|
||||
funcWxLog_t funcWxLog = (funcWxLog_t)(g_WeChatWinDllAddr + 0x26DA2D0);
|
||||
|
||||
status = MH_Initialize();
|
||||
if (status != MH_OK) {
|
||||
LOG_ERROR("MH_Initialize failed: {}", to_string(status));
|
||||
return;
|
||||
}
|
||||
|
||||
status = MH_CreateHook(funcWxLog, &PrintWxLog, reinterpret_cast<LPVOID *>(&realWxLog));
|
||||
if (status != MH_OK) {
|
||||
LOG_ERROR("MH_CreateHook failed: {}", to_string(status));
|
||||
return;
|
||||
}
|
||||
|
||||
status = MH_EnableHook(funcWxLog);
|
||||
if (status != MH_OK) {
|
||||
LOG_ERROR("MH_EnableHook failed: {}", to_string(status));
|
||||
return;
|
||||
}
|
||||
gIsLogging = true;
|
||||
}
|
||||
|
||||
void DisableLog()
|
||||
{
|
||||
MH_STATUS status = MH_UNKNOWN;
|
||||
if (!gIsLogging) {
|
||||
return;
|
||||
}
|
||||
|
||||
status = MH_DisableHook(funcWxLog);
|
||||
if (status != MH_OK) {
|
||||
LOG_ERROR("MH_DisableHook failed: {}", to_string(status));
|
||||
return;
|
||||
}
|
||||
|
||||
status = MH_Uninitialize();
|
||||
if (status != MH_OK) {
|
||||
LOG_ERROR("MH_Uninitialize failed: {}", to_string(status));
|
||||
return;
|
||||
}
|
||||
|
||||
gIsLogging = false;
|
||||
}
|
||||
|
||||
void ListenMessage()
|
||||
{
|
||||
MH_STATUS status = MH_UNKNOWN;
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
#include "pb_types.h"
|
||||
|
||||
void EnableLog();
|
||||
void DisableLog();
|
||||
void ListenPyq();
|
||||
void UnListenPyq();
|
||||
void ListenMessage();
|
||||
|
@ -40,6 +40,7 @@
|
||||
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
bool gIsLogging = false;
|
||||
bool gIsListening = false;
|
||||
bool gIsListeningPyq = false;
|
||||
mutex gMutex;
|
||||
@ -1067,7 +1068,9 @@ int RpcStartServer(int port)
|
||||
if (rpcThread != 0) {
|
||||
CloseHandle(rpcThread);
|
||||
}
|
||||
|
||||
#if ENABLE_WX_LOG
|
||||
EnableLog();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1081,5 +1084,8 @@ int RpcStopServer()
|
||||
Sleep(1000);
|
||||
LOG_INFO("Server stoped.");
|
||||
}
|
||||
#if ENABLE_WX_LOG
|
||||
DisableLog();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user