mirror of
https://github.com/ttttupup/wxhelper.git
synced 2024-11-05 18:09:24 +08:00
新增搜索微信
This commit is contained in:
parent
9e5dce93f0
commit
3ed52a7dbc
275
src/search_contact.cc
Normal file
275
src/search_contact.cc
Normal file
@ -0,0 +1,275 @@
|
||||
#include "pch.h"
|
||||
#include "search_contact.h"
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include "wechat_data.h"
|
||||
|
||||
#define WX_SEARCH_CONTACT_ERROR_CODE_HOOK_OFFSeT 0xd94d1e
|
||||
#define WX_SEARCH_CONTACT_ERROR_CODE_HOOK_NEXT_OFFSeT 0xed13a0
|
||||
#define WX_SEARCH_CONTACT_DETAIL_HOOK_OFFSeT 0xa2a260
|
||||
#define WX_SEARCH_CONTACT_DETAIL_HOOK_NEXT_OFFSeT 0xa2a4c0
|
||||
|
||||
|
||||
#define WX_SEARCH_CONTACT_OFFSeT 0xc5bb00
|
||||
#define WX_SEARCH_CONTACT_MGR_OFFSeT 0xa0d550
|
||||
|
||||
|
||||
|
||||
static BOOL kSearchContactHooked = false;
|
||||
static char kHookSearchContactErrcodeOldAsm[5] = {0};
|
||||
static char kHookUserInfoOldAsm[5] = {0};
|
||||
static DWORD kWeChatWinBase = GetWeChatWinBase();
|
||||
|
||||
static DWORD kHookSearchContactErrcodeNextAddr =
|
||||
kWeChatWinBase + WX_SEARCH_CONTACT_ERROR_CODE_HOOK_NEXT_OFFSeT;
|
||||
static DWORD kHookSearchContactErrcodeAddr =
|
||||
kWeChatWinBase + WX_SEARCH_CONTACT_ERROR_CODE_HOOK_OFFSeT;
|
||||
static DWORD kHookSearchContactErrcodeJmpBackAddr =
|
||||
kHookSearchContactErrcodeAddr + 0x5;
|
||||
|
||||
static DWORD kHookUserInfoNextAddr =
|
||||
kWeChatWinBase + WX_SEARCH_CONTACT_DETAIL_HOOK_NEXT_OFFSeT;
|
||||
static DWORD kHookUserInfoAddr =
|
||||
kWeChatWinBase + WX_SEARCH_CONTACT_DETAIL_HOOK_OFFSeT;
|
||||
static DWORD kHookUserInfoJmpBackAddr = kHookUserInfoAddr + 0x5;
|
||||
|
||||
static UserInfo userinfo;
|
||||
|
||||
void SetErrorCode(int code) { userinfo.error_code = code; }
|
||||
|
||||
void SetUserInfoDetail(DWORD address) {
|
||||
DWORD length = *(DWORD *)(address + 0x8);
|
||||
userinfo.keyword = new wchar_t[length + 1];
|
||||
userinfo.keyword_len = length;
|
||||
if (length) {
|
||||
memcpy(userinfo.keyword, (wchar_t *)(*(DWORD *)(address + 0x4)),
|
||||
(length + 1) * sizeof(wchar_t));
|
||||
} else {
|
||||
ZeroMemory(userinfo.keyword, (length + 1) * sizeof(wchar_t));
|
||||
}
|
||||
|
||||
length = *(DWORD *)(address + 0x1C);
|
||||
userinfo.v3 = new wchar_t[length + 1];
|
||||
userinfo.v3_len = length;
|
||||
if (length) {
|
||||
memcpy(userinfo.v3, (wchar_t *)(*(DWORD *)(address + 0x18)),
|
||||
(length + 1) * sizeof(wchar_t));
|
||||
}else {
|
||||
ZeroMemory(userinfo.v3, (length + 1) * sizeof(wchar_t));
|
||||
}
|
||||
|
||||
length = *(DWORD *)(address + 0x30);
|
||||
userinfo.big_image = new wchar_t[length + 1];
|
||||
userinfo.big_image_len = length;
|
||||
if (length) {
|
||||
memcpy(userinfo.big_image, (wchar_t *)(*(DWORD *)(address + 0x2C)),
|
||||
(length + 1) * sizeof(wchar_t));
|
||||
} else {
|
||||
ZeroMemory(userinfo.big_image, (length + 1) * sizeof(wchar_t));
|
||||
}
|
||||
|
||||
length = *(DWORD *)(address + 0xC8);
|
||||
userinfo.nickname = new wchar_t[length + 1];
|
||||
userinfo.nickname_len = length;
|
||||
if (length) {
|
||||
memcpy(userinfo.nickname, (wchar_t *)(*(DWORD *)(address + 0xC4)),
|
||||
(length + 1) * sizeof(wchar_t));
|
||||
}else {
|
||||
ZeroMemory(userinfo.nickname, (length + 1) * sizeof(wchar_t));
|
||||
}
|
||||
|
||||
length = *(DWORD *)(address + 0x108);
|
||||
userinfo.v2 = new wchar_t[length + 1];
|
||||
userinfo.v2_len = length;
|
||||
if (length) {
|
||||
memcpy(userinfo.v2, (wchar_t *)(*(DWORD *)(address + 0x104)),
|
||||
(length + 1) * sizeof(wchar_t));
|
||||
}else {
|
||||
ZeroMemory(userinfo.v2, (length + 1) * sizeof(wchar_t));
|
||||
}
|
||||
|
||||
length = *(DWORD *)(address + 0x16C);
|
||||
userinfo.small_image = new wchar_t[length + 1];
|
||||
userinfo.small_image_len = length;
|
||||
if (length) {
|
||||
memcpy(userinfo.small_image, (wchar_t *)(*(DWORD *)(address + 0x168)),
|
||||
(length + 1) * sizeof(wchar_t));
|
||||
}else {
|
||||
ZeroMemory(userinfo.small_image, (length + 1) * sizeof(wchar_t));
|
||||
}
|
||||
|
||||
length = *(DWORD *)(address + 0x1F8);
|
||||
userinfo.signature = new wchar_t[length + 1];
|
||||
userinfo.signature_len = length;
|
||||
if (length) {
|
||||
memcpy(userinfo.signature, (wchar_t *)(*(DWORD *)(address + 0x1F4)),
|
||||
(length + 1) * sizeof(wchar_t));
|
||||
} else {
|
||||
ZeroMemory(userinfo.signature, (length + 1) * sizeof(wchar_t));
|
||||
}
|
||||
|
||||
length = *(DWORD *)(address + 0x20C);
|
||||
userinfo.nation = new wchar_t[length + 1];
|
||||
userinfo.nation_len = length;
|
||||
if (length) {
|
||||
memcpy(userinfo.nation, (wchar_t *)(*(DWORD *)(address + 0x208)),
|
||||
(length + 1) * sizeof(wchar_t));
|
||||
} else {
|
||||
ZeroMemory(userinfo.nation, (length + 1) * sizeof(wchar_t));
|
||||
}
|
||||
|
||||
length = *(DWORD *)(address + 0x220);
|
||||
userinfo.province = new wchar_t[length + 1];
|
||||
userinfo.province_len = length;
|
||||
if (length) {
|
||||
memcpy(userinfo.province, (wchar_t *)(*(DWORD *)(address + 0x21C)),
|
||||
(length + 1) * sizeof(wchar_t));
|
||||
} else {
|
||||
ZeroMemory(userinfo.province, (length + 1) * sizeof(wchar_t));
|
||||
}
|
||||
|
||||
length = *(DWORD *)(address + 0x234);
|
||||
userinfo.city = new wchar_t[length + 1];
|
||||
userinfo.city_len = length;
|
||||
if (length) {
|
||||
memcpy(userinfo.city, (wchar_t *)(*(DWORD *)(address + 0x230)),
|
||||
(length + 1) * sizeof(wchar_t));
|
||||
} else {
|
||||
ZeroMemory(userinfo.city, (length + 1) * sizeof(wchar_t));
|
||||
}
|
||||
|
||||
userinfo.sex = *(DWORD *)(address + 0x1BC);
|
||||
userinfo.over = true;
|
||||
}
|
||||
|
||||
static void DeleteUserInfoCache() {
|
||||
if (userinfo.keyword) {
|
||||
delete userinfo.keyword;
|
||||
}
|
||||
if (userinfo.v2) {
|
||||
delete userinfo.v2;
|
||||
}
|
||||
if (userinfo.v3) {
|
||||
delete userinfo.v3;
|
||||
}
|
||||
if (userinfo.nickname) {
|
||||
delete userinfo.nickname;
|
||||
}
|
||||
if (userinfo.nation) {
|
||||
delete userinfo.nation;
|
||||
}
|
||||
if (userinfo.province) {
|
||||
delete userinfo.province;
|
||||
}
|
||||
if (userinfo.city) {
|
||||
delete userinfo.city;
|
||||
}
|
||||
if (userinfo.signature) {
|
||||
delete userinfo.signature;
|
||||
}
|
||||
if (userinfo.small_image) {
|
||||
delete userinfo.small_image;
|
||||
}
|
||||
if (userinfo.big_image) {
|
||||
delete userinfo.big_image;
|
||||
}
|
||||
ZeroMemory(&userinfo, sizeof(UserInfo));
|
||||
userinfo.error_code = 1;
|
||||
}
|
||||
|
||||
__declspec(naked) void HandleErrorCode() {
|
||||
__asm {
|
||||
pushad;
|
||||
pushfd;
|
||||
push edi;
|
||||
call SetErrorCode;
|
||||
add esp, 0x4;
|
||||
popfd;
|
||||
popad;
|
||||
call kHookSearchContactErrcodeNextAddr;
|
||||
jmp kHookSearchContactErrcodeJmpBackAddr;
|
||||
}
|
||||
}
|
||||
|
||||
__declspec(naked) void HandleUserInfoDetail() {
|
||||
__asm {
|
||||
pushad;
|
||||
pushfd;
|
||||
push dword ptr [ebp + 0x14];
|
||||
call SetUserInfoDetail;
|
||||
add esp, 0x4;
|
||||
popfd;
|
||||
popad;
|
||||
call kHookUserInfoNextAddr;
|
||||
jmp kHookUserInfoJmpBackAddr;
|
||||
}
|
||||
}
|
||||
|
||||
int SearchContactNetScene(wchar_t *keyword,UserInfo ** user) {
|
||||
int success = -1;
|
||||
HookSearchContact();
|
||||
DeleteUserInfoCache();
|
||||
DWORD base = GetWeChatWinBase();
|
||||
DWORD search_contact_mgr_addr = base + WX_SEARCH_CONTACT_MGR_OFFSeT;
|
||||
DWORD search_contact_addr = base + WX_SEARCH_CONTACT_OFFSeT;
|
||||
WeChatString key(keyword);
|
||||
|
||||
__asm {
|
||||
pushad;
|
||||
pushfd;
|
||||
call search_contact_mgr_addr;
|
||||
lea ebx, key;
|
||||
push ebx;
|
||||
mov ecx, eax;
|
||||
call search_contact_addr;
|
||||
popfd;
|
||||
popad;
|
||||
}
|
||||
success = 1;
|
||||
while (userinfo.error_code == 1 && kSearchContactHooked) {
|
||||
Sleep(20);
|
||||
}
|
||||
if (userinfo.error_code == 0) {
|
||||
while (userinfo.over == false && kSearchContactHooked) {
|
||||
Sleep(20);
|
||||
}
|
||||
}
|
||||
*user= &userinfo;
|
||||
return success;
|
||||
}
|
||||
|
||||
int HookSearchContact() {
|
||||
kWeChatWinBase = GetWeChatWinBase();
|
||||
if (!kWeChatWinBase) {
|
||||
return -1;
|
||||
}
|
||||
if (kSearchContactHooked) {
|
||||
return 2;
|
||||
}
|
||||
kHookSearchContactErrcodeNextAddr =
|
||||
kWeChatWinBase + WX_SEARCH_CONTACT_ERROR_CODE_HOOK_NEXT_OFFSeT;
|
||||
kHookSearchContactErrcodeAddr =
|
||||
kWeChatWinBase + WX_SEARCH_CONTACT_ERROR_CODE_HOOK_OFFSeT;
|
||||
kHookSearchContactErrcodeJmpBackAddr = kHookSearchContactErrcodeAddr + 0x5;
|
||||
|
||||
kHookUserInfoNextAddr =
|
||||
kWeChatWinBase + WX_SEARCH_CONTACT_DETAIL_HOOK_NEXT_OFFSeT;
|
||||
kHookUserInfoAddr = kWeChatWinBase + WX_SEARCH_CONTACT_DETAIL_HOOK_OFFSeT;
|
||||
kHookUserInfoJmpBackAddr = kHookUserInfoAddr + 0x5;
|
||||
HookAnyAddress(kHookSearchContactErrcodeAddr,
|
||||
(LPVOID)HandleErrorCode,
|
||||
kHookSearchContactErrcodeOldAsm);
|
||||
HookAnyAddress(kHookUserInfoAddr, (LPVOID)HandleUserInfoDetail, kHookUserInfoOldAsm);
|
||||
kSearchContactHooked = true;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int UnHookSearchContact() {
|
||||
if (!kSearchContactHooked) return 2;
|
||||
UnHookAnyAddress(kHookSearchContactErrcodeAddr,
|
||||
kHookSearchContactErrcodeOldAsm);
|
||||
UnHookAnyAddress(kHookUserInfoAddr, kHookUserInfoOldAsm);
|
||||
kSearchContactHooked = false;
|
||||
return 1;
|
||||
}
|
8
src/search_contact.h
Normal file
8
src/search_contact.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef SEARCH_CONTACT_H_
|
||||
#define SEARCH_CONTACT_H_
|
||||
#include "wechat_data.h"
|
||||
int SearchContactNetScene(wchar_t *keyword,UserInfo ** user);
|
||||
|
||||
int HookSearchContact();
|
||||
int UnHookSearchContact();
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user