HookVoiceMessage.cpp 3.1 KB
Newer Older
L
ljc545w 已提交
1 2
#include "pch.h"

L
ljc545w 已提交
3 4
#define HookVoiceMsgAddrOffset 0x105728DA - 0x10000000
#define HookVoiceMsgNextCallOffset 0x11612540 - 0x10000000
L
ljc545w 已提交
5 6 7 8 9 10

BOOL VoiceMsgHooked = false;
static DWORD WeChatWinBase = GetWeChatWinBase();
static DWORD HookVoiceMsgAddr = WeChatWinBase + HookVoiceMsgAddrOffset;
static DWORD HookVoiceMsgNextCall = WeChatWinBase + HookVoiceMsgNextCallOffset;
static DWORD HookVoiceMsgJmpBackAddr = HookVoiceMsgAddr + 0x5;
L
ljc545w 已提交
11
static char VoiceMsgOldAsm[5] = {0};
L
ljc545w 已提交
12
static wstring global_save_path = L"";
L
ljc545w 已提交
13

L
ljc545w 已提交
14 15
void SaveVoiceMsg(unsigned char *buffer, int length, DWORD msgHandle)
{
L
ljc545w 已提交
16 17 18 19 20
    wstring save_path = global_save_path + GetSelfWxid();
    if (!FindOrCreateDirectory(save_path.c_str()))
    {
        return;
    }
L
ljc545w 已提交
21
    wchar_t *temp;
L
ljc545w 已提交
22

L
ljc545w 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35
    int wxid_length = *(DWORD *)(msgHandle + 0x174);
    temp = new wchar_t[wxid_length + 1];
    memcpy(temp, (void *)(*(DWORD *)(msgHandle + 0x170)), (wxid_length + 1) * 2);
    wstring sender(temp);
    delete[] temp;
    temp = NULL;

    int clientmsg_length = *(DWORD *)(msgHandle + 0x188);
    temp = new wchar_t[clientmsg_length + 1];
    memcpy(temp, (void *)(*(DWORD *)(msgHandle + 0x184)), (clientmsg_length + 1) * 2);
    wstring clientmsgid(temp);
    delete[] temp;
    temp = NULL;
L
ljc545w 已提交
36 37
    wstring file_path = save_path + L"\\" + clientmsgid + L".amr";
    HANDLE hFile = CreateFile(file_path.c_str(), GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
L
ljc545w 已提交
38 39 40 41 42 43 44
    if (hFile == INVALID_HANDLE_VALUE)
    {
        return;
    }
    DWORD dwWrite = 0;
    WriteFile(hFile, (LPCVOID)buffer, length, &dwWrite, 0);
    CloseHandle(hFile);
L
ljc545w 已提交
45 46
}

L
ljc545w 已提交
47 48 49
__declspec(naked) void dealVoiceMsg()
{
    __asm {
L
ljc545w 已提交
50 51 52 53 54 55 56 57 58 59 60
		pushad;
		pushfd;
		push edi;
		push esi;
		push eax;
		call SaveVoiceMsg;
		add esp, 0xC;
		popfd;
		popad;
		call HookVoiceMsgNextCall;
		jmp HookVoiceMsgJmpBackAddr;
L
ljc545w 已提交
61
    }
L
ljc545w 已提交
62 63
}

L
ljc545w 已提交
64 65 66 67 68
void __stdcall HookVoiceMsg()
{
    WeChatWinBase = GetWeChatWinBase();
    if (VoiceMsgHooked || !WeChatWinBase)
        return;
L
ljc545w 已提交
69
    SetDownloadTime();
L
ljc545w 已提交
70 71 72 73 74
    HookVoiceMsgAddr = WeChatWinBase + HookVoiceMsgAddrOffset;
    HookVoiceMsgNextCall = WeChatWinBase + HookVoiceMsgNextCallOffset;
    HookVoiceMsgJmpBackAddr = HookVoiceMsgAddr + 0x5;
    HookAnyAddress(HookVoiceMsgAddr, dealVoiceMsg, VoiceMsgOldAsm);
    VoiceMsgHooked = true;
L
ljc545w 已提交
75 76
}

L
ljc545w 已提交
77 78 79 80 81 82
void UnHookVoiceMsg()
{
    if (!VoiceMsgHooked)
        return;
    UnHookAnyAddress(HookVoiceMsgAddr, VoiceMsgOldAsm);
    VoiceMsgHooked = false;
L
ljc545w 已提交
83 84
}

85
#ifndef USE_SOCKET
L
ljc545w 已提交
86 87
BOOL HookVoiceMsgRemote(LPVOID lpParameter)
{
L
ljc545w 已提交
88 89
    global_save_path = (wstring)(wchar_t *)lpParameter;
    if (global_save_path.back() != '\\')
L
ljc545w 已提交
90
    {
L
ljc545w 已提交
91
        global_save_path += L"\\";
L
ljc545w 已提交
92
    }
L
ljc545w 已提交
93
    if (!FindOrCreateDirectory(global_save_path.c_str()))
L
ljc545w 已提交
94 95 96 97 98 99 100
    {
        return false;
    }
    HookVoiceMsg();
    return true;
}
#else
L
ljc545w 已提交
101
BOOL __stdcall HookVoiceMsg(wstring save_path)
L
ljc545w 已提交
102
{
L
ljc545w 已提交
103 104
    global_save_path = save_path;
    if (global_save_path.back() != '\\')
L
ljc545w 已提交
105
    {
L
ljc545w 已提交
106
        global_save_path += L"\\";
L
ljc545w 已提交
107
    }
L
ljc545w 已提交
108
    wstring createpath = global_save_path.substr(0, global_save_path.length() - 1);
L
ljc545w 已提交
109 110 111 112 113 114
    if (!FindOrCreateDirectory(createpath.c_str()))
    {
        return false;
    }
    HookVoiceMsg();
    return true;
115
}
L
ljc545w 已提交
116
#endif