diff --git a/Spy/get_contacts.cpp b/Spy/get_contacts.cpp index 5f43cc5..8282e2c 100644 --- a/Spy/get_contacts.cpp +++ b/Spy/get_contacts.cpp @@ -9,21 +9,21 @@ std::vector GetContacts() { int gender = 0; vector vContacts; - DWORD baseAddr = g_WeChatWinDllAddr + 0x23638F4; + DWORD baseAddr = g_WeChatWinDllAddr + g_WxCalls.contact.base; DWORD tempAddr = GET_DWORD(baseAddr); - DWORD head = GET_DWORD(tempAddr + 0x4C); + DWORD head = GET_DWORD(tempAddr + g_WxCalls.contact.head); DWORD node = GET_DWORD(head); while (node != head) { RpcContact_t rpcContact = { 0 }; - rpcContact.wxId = GetBstrByAddress(node + 0x30); - rpcContact.wxCode = GetBstrByAddress(node + 0x44); - rpcContact.wxName = GetBstrByAddress(node + 0x8C); - rpcContact.wxCountry = GetBstrByAddress(node + 0x1D0); - rpcContact.wxProvince = GetBstrByAddress(node + 0x1E4); - rpcContact.wxCity = GetBstrByAddress(node + 0x1F8); + rpcContact.wxId = GetBstrByAddress(node + g_WxCalls.contact.wxId); + rpcContact.wxCode = GetBstrByAddress(node + g_WxCalls.contact.wxCode); + rpcContact.wxName = GetBstrByAddress(node + g_WxCalls.contact.wxName); + rpcContact.wxCountry = GetBstrByAddress(node + g_WxCalls.contact.wxCountry); + rpcContact.wxProvince = GetBstrByAddress(node + g_WxCalls.contact.wxProvince); + rpcContact.wxCity = GetBstrByAddress(node + g_WxCalls.contact.wxCity); - gender = GET_DWORD(node + 0x184); + gender = GET_DWORD(node + g_WxCalls.contact.wxGender); if (gender == 1) rpcContact.wxGender = SysAllocString(L"男"); else if (gender == 2) diff --git a/Spy/load_calls.cpp b/Spy/load_calls.cpp index 18ee717..0145286 100644 --- a/Spy/load_calls.cpp +++ b/Spy/load_calls.cpp @@ -4,17 +4,18 @@ #include "load_calls.h" #define SUPPORT_VERSION L"3.7.0.29" -WxCalls_t wxCalls = { - 0x23631D0, // Login Status - { 0x236307C, 0x23630F4, 0x2363128 }, // User Info: wxid, nickname, mobile - 0x521D30, // Send Message - /* Receive Message: - Hook, call, type, self, id, msgXml, roomId, wxId, content */ - { 0x550F4C, 0xA94A50, 0x38, 0x3C, 0x184, 0x1EC, 0x48, 0x170, 0x70 }, - { 0xBD780, 0x770120, 0x521640 } // Send Image Message -}; +WxCalls_t wxCalls = { 0x23631D0, // Login Status + { 0x236307C, 0x23630F4, 0x2363128 }, // User Info: wxid, nickname, mobile + 0x521D30, // Send Message + /* Receive Message: + Hook, call, type, self, id, msgXml, roomId, wxId, content */ + { 0x550F4C, 0xA94A50, 0x38, 0x3C, 0x184, 0x1EC, 0x48, 0x170, 0x70 }, + { 0xBD780, 0x770120, 0x521640 }, // Send Image Message + /* Get Contacts: + Base, head, wxId, Code, Name, Gender, Country, Province, City*/ + { 0x23638F4, 0x4C, 0x30, 0x44, 0x8C, 0x184, 0x1D0, 0x1E4, 0x1F8 } }; -int LoadCalls(const wchar_t* version, WxCalls_t* calls) +int LoadCalls(const wchar_t *version, WxCalls_t *calls) { if (wcscmp(version, SUPPORT_VERSION) != 0) { return -1; diff --git a/Spy/spy_types.h b/Spy/spy_types.h index 6c98504..a565153 100644 --- a/Spy/spy_types.h +++ b/Spy/spy_types.h @@ -29,12 +29,25 @@ typedef struct SendImg { DWORD call3; } SendImg_t; +typedef struct Contact { + DWORD base; + DWORD head; + DWORD wxId; + DWORD wxCode; + DWORD wxName; + DWORD wxGender; + DWORD wxCountry; + DWORD wxProvince; + DWORD wxCity; +} Contact_t; + typedef struct WxCalls { DWORD login; // 登录状态 UserInfoCall_t ui; // 用户信息 DWORD sendTextMsg; // 发送消息 RecvMsg_t recvMsg; // 接收消息 SendImg_t sendImg; // 发送图片 + Contact_t contact; // 获取联系人 } WxCalls_t; typedef struct TextStruct {