提交 7fc9898a 编写于 作者: L ljc545w

fix known bugs

上级 0d67151c
...@@ -65,6 +65,7 @@ DWORD GetDbHandlesRemote() ...@@ -65,6 +65,7 @@ DWORD GetDbHandlesRemote()
vector<void *> GetDbHandles() vector<void *> GetDbHandles()
{ {
dbs.clear(); dbs.clear();
dbmap.clear();
DWORD WeChatWinBase = GetWeChatWinBase(); DWORD WeChatWinBase = GetWeChatWinBase();
DWORD SqlHandleBaseAddr = WeChatWinBase + SqlHandleMicroMsgOffset; DWORD SqlHandleBaseAddr = WeChatWinBase + SqlHandleMicroMsgOffset;
DWORD SqlHandleBeginAddr = 0x0; DWORD SqlHandleBeginAddr = 0x0;
......
...@@ -23,9 +23,9 @@ using namespace std; ...@@ -23,9 +23,9 @@ using namespace std;
#define SendMessageNextCallOffset 0x78AA8170 - 0x786A0000 #define SendMessageNextCallOffset 0x78AA8170 - 0x786A0000
// 撤回消息的HOOK地址偏移 // 撤回消息的HOOK地址偏移
#define RevokeMessageHookOffset 0x5D6D8A4C - 0x5D1F0000 #define UpdateMessageHookOffset 0x5D6D8A4C - 0x5D1F0000
// 撤回消息HOOK的CALL偏移 // 撤回消息HOOK的CALL偏移
#define RevokeMessageNextCallOffset 0x5D6D3430 - 0x5D1F0000 #define UpdateMessageNextCallOffset 0x5D6D3430 - 0x5D1F0000
#define READ_WSTRING(addr, offset) ((*(DWORD *)(addr + offset + 0x4) == 0) ? wstring(L"") : wstring((wchar_t *)(*(DWORD *)(addr + offset)), *(DWORD *)(addr + offset + 0x4))) #define READ_WSTRING(addr, offset) ((*(DWORD *)(addr + offset + 0x4) == 0) ? wstring(L"") : wstring((wchar_t *)(*(DWORD *)(addr + offset)), *(DWORD *)(addr + offset + 0x4)))
...@@ -36,7 +36,7 @@ BOOL ReceiveMessageHooked = false; ...@@ -36,7 +36,7 @@ BOOL ReceiveMessageHooked = false;
// 保存HOOK前的字节码,用于恢复 // 保存HOOK前的字节码,用于恢复
static char OldReceiveMessageAsmCode[5] = {0}; static char OldReceiveMessageAsmCode[5] = {0};
static char OldSendMessageAsmCode[5] = {0}; static char OldSendMessageAsmCode[5] = {0};
static char OldRevokeMessageAsmCode[5] = {0}; static char OldUpdateMessageAsmCode[5] = {0};
static DWORD WeChatWinBase = GetWeChatWinBase(); static DWORD WeChatWinBase = GetWeChatWinBase();
// 接收消息HOOK地址 // 接收消息HOOK地址
static DWORD ReceiveMessageHookAddress = WeChatWinBase + ReceiveMessageHookOffset; static DWORD ReceiveMessageHookAddress = WeChatWinBase + ReceiveMessageHookOffset;
...@@ -51,11 +51,11 @@ static DWORD SendMessageNextCall = WeChatWinBase + SendMessageNextCallOffset; ...@@ -51,11 +51,11 @@ static DWORD SendMessageNextCall = WeChatWinBase + SendMessageNextCallOffset;
// 发送HOOK的跳转地址 // 发送HOOK的跳转地址
static DWORD SendMessageJmpBackAddress = SendMessageHookAddress + 0x5; static DWORD SendMessageJmpBackAddress = SendMessageHookAddress + 0x5;
// 撤回消息HOOK地址 // 撤回消息HOOK地址
static DWORD RevokeMessageHookAddress = WeChatWinBase + RevokeMessageHookOffset; static DWORD UpdateMessageHookAddress = WeChatWinBase + UpdateMessageHookOffset;
// 撤回消息HOOK的CALL地址 // 撤回消息HOOK的CALL地址
static DWORD RevokeMessageNextCall = WeChatWinBase + RevokeMessageNextCallOffset; static DWORD UpdateMessageNextCall = WeChatWinBase + UpdateMessageNextCallOffset;
// 撤回HOOK的跳转地址 // 撤回HOOK的跳转地址
static DWORD RevokeMessageJmpBackAddress = RevokeMessageHookAddress + 0x5; static DWORD UpdateMessageJmpBackAddress = UpdateMessageHookAddress + 0x5;
struct SocketMessageStruct struct SocketMessageStruct
{ {
...@@ -136,12 +136,6 @@ void SendSocketMessageInThread(SocketMessageStruct *param) ...@@ -136,12 +136,6 @@ void SendSocketMessageInThread(SocketMessageStruct *param)
{ {
return; return;
} }
/*int dbIndex;
while (jMsg["localId"].get<unsigned int>() == 0)
{
jMsg["localId"] = GetLocalIdByMsgId(jMsg["msgid"].get<ULONG64>(),dbIndex);
Sleep(200);
}*/
string jstr = jMsg.dump() + "\n"; string jstr = jMsg.dump() + "\n";
#ifdef USE_COM #ifdef USE_COM
// 通过连接点,将消息广播给客户端;将广播过程放在线程中完成,客户端才可以等待图片、语音落地 // 通过连接点,将消息广播给客户端;将广播过程放在线程中完成,客户端才可以等待图片、语音落地
...@@ -174,8 +168,6 @@ static void dealMessage(DWORD messageAddr) ...@@ -174,8 +168,6 @@ static void dealMessage(DWORD messageAddr)
if (jMsg["type"].get<int>() != 10000) if (jMsg["type"].get<int>() != 10000)
{ {
jMsg["filepath"] = unicode_to_utf8((wchar_t *)READ_WSTRING(messageAddr, 0x1AC).c_str()); jMsg["filepath"] = unicode_to_utf8((wchar_t *)READ_WSTRING(messageAddr, 0x1AC).c_str());
/*string extrabuf = base64_encode((BYTE *)(*(DWORD *)(messageAddr + 0x8C)), *(DWORD *)(messageAddr + 0x8C + 0x4));
jMsg["extrainfo"] = extrabuf;*/
jMsg["extrainfo"] = unicode_to_utf8((wchar_t *)READ_WSTRING(messageAddr, 0x1EC).c_str()); jMsg["extrainfo"] = unicode_to_utf8((wchar_t *)READ_WSTRING(messageAddr, 0x1EC).c_str());
} }
else else
...@@ -199,11 +191,9 @@ static void dealMessage(DWORD messageAddr) ...@@ -199,11 +191,9 @@ static void dealMessage(DWORD messageAddr)
} }
/* /*
* 消息处理函数,根据消息缓冲区组装结构并存入容器 * 处理从网络同步的消息(他人发送或使用手机发送的消息)
* messageAddr:保存消息的缓冲区地址
* return:void
*/ */
VOID ReceiveMessage(DWORD messagesAddr) void OnReceiveMessage(DWORD messagesAddr)
{ {
DWORD *messages = (DWORD *)messagesAddr; DWORD *messages = (DWORD *)messagesAddr;
for (DWORD messageAddr = messages[0]; messageAddr < messages[1]; messageAddr += 0x298) for (DWORD messageAddr = messages[0]; messageAddr < messages[1]; messageAddr += 0x298)
...@@ -212,6 +202,26 @@ VOID ReceiveMessage(DWORD messagesAddr) ...@@ -212,6 +202,26 @@ VOID ReceiveMessage(DWORD messagesAddr)
} }
} }
/*
* 处理本地发送的消息
*/
void OnSendMessage(DWORD messageAddr)
{
BOOL isSendMsg = *(BOOL *)(messageAddr + 0x3C);
if (!isSendMsg)
return;
dealMessage(messageAddr);
}
/*
* 处理更新的消息,目前只处理撤回的消息
*/
void OnUpdateMessage(DWORD messageAddr)
{
// DWORD type = *(DWORD *)(messageAddr + 0x38);
dealMessage(messageAddr);
}
/* /*
* HOOK的具体实现,接收到消息后调用处理函数 * HOOK的具体实现,接收到消息后调用处理函数
*/ */
...@@ -221,7 +231,7 @@ _declspec(naked) void dealReceiveMessage() ...@@ -221,7 +231,7 @@ _declspec(naked) void dealReceiveMessage()
pushad; pushad;
pushfd; pushfd;
push edi; push edi;
call ReceiveMessage; call OnReceiveMessage;
add esp, 0x4; add esp, 0x4;
popfd; popfd;
popad; popad;
...@@ -239,7 +249,7 @@ _declspec(naked) void dealSendMessage() ...@@ -239,7 +249,7 @@ _declspec(naked) void dealSendMessage()
pushad; pushad;
pushfd; pushfd;
push edi; push edi;
call dealMessage; call OnSendMessage;
add esp, 0x4; add esp, 0x4;
popfd; popfd;
popad; popad;
...@@ -257,12 +267,12 @@ _declspec(naked) void dealRevokeMessage() ...@@ -257,12 +267,12 @@ _declspec(naked) void dealRevokeMessage()
pushad; pushad;
pushfd; pushfd;
push edi; push edi;
call dealMessage; call OnUpdateMessage;
add esp, 0x4; add esp, 0x4;
popfd; popfd;
popad; popad;
call RevokeMessageNextCall; call UpdateMessageNextCall;
jmp RevokeMessageJmpBackAddress; jmp UpdateMessageJmpBackAddress;
} }
} }
...@@ -282,12 +292,12 @@ VOID HookReceiveMessage(int port) ...@@ -282,12 +292,12 @@ VOID HookReceiveMessage(int port)
SendMessageHookAddress = WeChatWinBase + SendMessageHookOffset; SendMessageHookAddress = WeChatWinBase + SendMessageHookOffset;
SendMessageNextCall = WeChatWinBase + SendMessageNextCallOffset; SendMessageNextCall = WeChatWinBase + SendMessageNextCallOffset;
SendMessageJmpBackAddress = SendMessageHookAddress + 0x5; SendMessageJmpBackAddress = SendMessageHookAddress + 0x5;
RevokeMessageHookAddress = WeChatWinBase + RevokeMessageHookOffset; UpdateMessageHookAddress = WeChatWinBase + UpdateMessageHookOffset;
RevokeMessageNextCall = WeChatWinBase + RevokeMessageNextCallOffset; UpdateMessageNextCall = WeChatWinBase + UpdateMessageNextCallOffset;
RevokeMessageJmpBackAddress = RevokeMessageHookAddress + 0x5; UpdateMessageJmpBackAddress = UpdateMessageHookAddress + 0x5;
HookAnyAddress(ReceiveMessageHookAddress, (LPVOID)dealReceiveMessage, OldReceiveMessageAsmCode); HookAnyAddress(ReceiveMessageHookAddress, (LPVOID)dealReceiveMessage, OldReceiveMessageAsmCode);
HookAnyAddress(SendMessageHookAddress, (LPVOID)dealSendMessage, OldSendMessageAsmCode); HookAnyAddress(SendMessageHookAddress, (LPVOID)dealSendMessage, OldSendMessageAsmCode);
HookAnyAddress(RevokeMessageHookAddress, (LPVOID)dealRevokeMessage, OldRevokeMessageAsmCode); HookAnyAddress(UpdateMessageHookAddress, (LPVOID)dealRevokeMessage, OldUpdateMessageAsmCode);
ReceiveMessageHooked = TRUE; ReceiveMessageHooked = TRUE;
} }
...@@ -302,6 +312,6 @@ VOID UnHookReceiveMessage() ...@@ -302,6 +312,6 @@ VOID UnHookReceiveMessage()
return; return;
UnHookAnyAddress(ReceiveMessageHookAddress, OldReceiveMessageAsmCode); UnHookAnyAddress(ReceiveMessageHookAddress, OldReceiveMessageAsmCode);
UnHookAnyAddress(SendMessageHookAddress, OldSendMessageAsmCode); UnHookAnyAddress(SendMessageHookAddress, OldSendMessageAsmCode);
UnHookAnyAddress(RevokeMessageHookAddress, OldRevokeMessageAsmCode); UnHookAnyAddress(UpdateMessageHookAddress, OldUpdateMessageAsmCode);
ReceiveMessageHooked = FALSE; ReceiveMessageHooked = FALSE;
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册