mirror of
https://github.com/ttttupup/wxhelper.git
synced 2025-05-06 19:58:43 +08:00
244 lines
7.6 KiB
C++
244 lines
7.6 KiB
C++
#include "pch.h"
|
|
#include "account_mgr.h"
|
|
#include "wechat_function.h"
|
|
|
|
using namespace std;
|
|
namespace wxhelper {
|
|
AccountMgr::AccountMgr(DWORD base) : BaseMgr(base) {}
|
|
AccountMgr::~AccountMgr() {}
|
|
int AccountMgr::GetSelfInfo(SelfInfoInner &out) {
|
|
DWORD accout_service_addr = base_addr_ + WX_ACCOUNT_SERVICE_OFFSET;
|
|
DWORD get_app_save_addr = base_addr_ + WX_GET_APP_DATA_SAVE_PATH_OFFSET;
|
|
DWORD get_current_data_path_addr =
|
|
base_addr_ + WX_GET_CURRENT_DATA_PATH_OFFSET;
|
|
DWORD service_addr = NULL;
|
|
__asm {
|
|
PUSHAD
|
|
CALL accout_service_addr
|
|
MOV service_addr,EAX
|
|
POPAD
|
|
}
|
|
if (service_addr) {
|
|
if (*(DWORD *)(service_addr + 0x44) == 0 ||
|
|
*(DWORD *)(service_addr + 0x44 + 0x10) == 0) {
|
|
out.wxid = string();
|
|
} else {
|
|
if (*(DWORD *)(service_addr + 0x44 + 0x14) == 0xF) {
|
|
out.wxid = string((char *)(service_addr + 0x44),
|
|
*(DWORD *)(service_addr + 0x44 + 0x10));
|
|
} else {
|
|
out.wxid = string(*(char **)(service_addr + 0x44),
|
|
*(DWORD *)(service_addr + 0x44 + 0x10));
|
|
}
|
|
}
|
|
|
|
if (*(DWORD *)(service_addr + 0xA8) == 0 ||
|
|
*(DWORD *)(service_addr + 0xA8 + 0x10) == 0) {
|
|
out.account = string();
|
|
} else {
|
|
if (*(DWORD *)(service_addr + 0xA8 + 0x14) == 0xF) {
|
|
out.account = string((char *)(service_addr + 0xA8),
|
|
*(DWORD *)(service_addr + 0xA8 + 0x10));
|
|
} else {
|
|
out.account = string(*(char **)(service_addr + 0xA8),
|
|
*(DWORD *)(service_addr + 0xA8 + 0x10));
|
|
}
|
|
}
|
|
|
|
if (*(DWORD *)(service_addr + 0xC0) == 0 ||
|
|
*(DWORD *)(service_addr + 0xC0 + 0x10) == 0) {
|
|
out.mobile = string();
|
|
} else {
|
|
if (*(DWORD *)(service_addr + 0xC0 + 0x14) == 0xF) {
|
|
out.mobile = string((char *)(service_addr + 0xC0),
|
|
*(DWORD *)(service_addr + 0xC0 + 0x10));
|
|
} else {
|
|
out.mobile = string(*(char **)(service_addr + 0xC0),
|
|
*(DWORD *)(service_addr + 0xC0 + 0x10));
|
|
}
|
|
}
|
|
|
|
if (*(DWORD *)(service_addr + 0xD8) == 0 ||
|
|
*(DWORD *)(service_addr + 0xD8 + 0x10) == 0) {
|
|
out.signature = string();
|
|
} else {
|
|
if (*(DWORD *)(service_addr + 0xD8 + 0x14) == 0xF) {
|
|
out.signature = string((char *)(service_addr + 0xD8),
|
|
*(DWORD *)(service_addr + 0xD8 + 0x10));
|
|
} else {
|
|
out.signature = string(*(char **)(service_addr + 0xD8),
|
|
*(DWORD *)(service_addr + 0xD8 + 0x10));
|
|
}
|
|
}
|
|
|
|
if (*(DWORD *)(service_addr + 0xF0) == 0 ||
|
|
*(DWORD *)(service_addr + 0xF0 + 0x10) == 0) {
|
|
out.country = string();
|
|
} else {
|
|
if (*(DWORD *)(service_addr + 0xF0 + 0x14) == 0xF) {
|
|
out.country = string((char *)(service_addr + 0xF0),
|
|
*(DWORD *)(service_addr + 0xF0 + 0x10));
|
|
} else {
|
|
out.country = string(*(char **)(service_addr + 0xF0),
|
|
*(DWORD *)(service_addr + 0xF0 + 0x10));
|
|
}
|
|
}
|
|
|
|
if (*(DWORD *)(service_addr + 0x108) == 0 ||
|
|
*(DWORD *)(service_addr + 0x108 + 0x10) == 0) {
|
|
out.province = string();
|
|
} else {
|
|
if (*(DWORD *)(service_addr + 0x108 + 0x14) == 0xF) {
|
|
out.province = string((char *)(service_addr + 0x108),
|
|
*(DWORD *)(service_addr + 0x108 + 0x10));
|
|
} else {
|
|
out.province = string(*(char **)(service_addr + 0x108),
|
|
*(DWORD *)(service_addr + 0x108 + 0x10));
|
|
}
|
|
}
|
|
|
|
if (*(DWORD *)(service_addr + 0x120) == 0 ||
|
|
*(DWORD *)(service_addr + 0x120 + 0x10) == 0) {
|
|
out.city = string();
|
|
} else {
|
|
if (*(DWORD *)(service_addr + 0x120 + 0x14) == 0xF) {
|
|
out.city = string((char *)(service_addr + 0x120),
|
|
*(DWORD *)(service_addr + 0x120 + 0x10));
|
|
} else {
|
|
out.city = string(*(char **)(service_addr + 0x120),
|
|
*(DWORD *)(service_addr + 0x120 + 0x10));
|
|
}
|
|
}
|
|
|
|
if (*(DWORD *)(service_addr + 0x150) == 0 ||
|
|
*(DWORD *)(service_addr + 0x150 + 0x10) == 0) {
|
|
out.name = string();
|
|
} else {
|
|
if (*(DWORD *)(service_addr + 0x150 + 0x14) == 0xF) {
|
|
out.name = string((char *)(service_addr + 0x150),
|
|
*(DWORD *)(service_addr + 0x150 + 0x10));
|
|
} else {
|
|
out.name = string(*(char **)(service_addr + 0x150),
|
|
*(DWORD *)(service_addr + 0x150 + 0x10));
|
|
}
|
|
}
|
|
|
|
if (*(DWORD *)(service_addr + 0x31C) == 0 ||
|
|
*(DWORD *)(service_addr + 0x31C + 0x10) == 0) {
|
|
out.head_img = string();
|
|
} else {
|
|
if (*(DWORD *)(service_addr + 0x31C + 0x14) == 0xF) {
|
|
out.head_img = string((char *)(service_addr + 0x31C),
|
|
*(DWORD *)(service_addr + 0x31C + 0x10));
|
|
} else {
|
|
out.head_img = string(*(char **)(service_addr + 0x31C),
|
|
*(DWORD *)(service_addr + 0x31C + 0x10));
|
|
}
|
|
}
|
|
|
|
if (*(DWORD *)(service_addr + 0x4CC) == 0 ||
|
|
*(DWORD *)(service_addr + 0x4D0) == 0) {
|
|
out.db_key = string();
|
|
} else {
|
|
DWORD byte_addr = *(DWORD *)(service_addr + 0x4CC);
|
|
DWORD len = *(DWORD *)(service_addr + 0x4D0);
|
|
out.db_key = Utils::Bytes2Hex((BYTE *)byte_addr, len);
|
|
}
|
|
}
|
|
|
|
WeChatString data_save_path;
|
|
WeChatString current_data_path;
|
|
|
|
__asm {
|
|
PUSHAD
|
|
LEA ECX,data_save_path
|
|
CALL get_app_save_addr
|
|
LEA ECX,current_data_path
|
|
CALL get_current_data_path_addr
|
|
POPAD
|
|
}
|
|
|
|
if (data_save_path.ptr) {
|
|
out.data_save_path = Utils::WstringToUTF8(
|
|
wstring(data_save_path.ptr, data_save_path.length));
|
|
}
|
|
else {
|
|
out.data_save_path = string();
|
|
}
|
|
|
|
if (current_data_path.ptr) {
|
|
out.current_data_path = Utils::WstringToUTF8(
|
|
wstring(current_data_path.ptr, current_data_path.length));
|
|
} else {
|
|
out.current_data_path = string();
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int AccountMgr::CheckLogin() {
|
|
int success = -1;
|
|
DWORD accout_service_addr = base_addr_ + WX_ACCOUNT_SERVICE_OFFSET;
|
|
DWORD service_addr = NULL;
|
|
__asm {
|
|
PUSHAD
|
|
CALL accout_service_addr
|
|
MOV service_addr,EAX
|
|
POPAD
|
|
}
|
|
if (service_addr) {
|
|
success = *(DWORD *)(service_addr + 0x4E0);
|
|
}
|
|
return success;
|
|
}
|
|
|
|
int AccountMgr::Logout() {
|
|
int success = -1;
|
|
if (!CheckLogin()) {
|
|
return success;
|
|
}
|
|
DWORD account_service_addr = base_addr_ + WX_ACCOUNT_SERVICE_OFFSET;
|
|
DWORD logout_addr = base_addr_ + WX_LOGOUT_OFFSET;
|
|
__asm {
|
|
PUSHAD
|
|
CALL account_service_addr
|
|
PUSH 0x0
|
|
MOV ECX,EAX
|
|
CALL logout_addr
|
|
MOV success,EAX
|
|
POPAD
|
|
}
|
|
return success;
|
|
}
|
|
|
|
/// @brief 根据 502647092 提供的偏移 获取二维码url
|
|
/// @return
|
|
std::string AccountMgr::GetQRCodeUrl() {
|
|
DWORD qr_code_login_addr = base_addr_ + WX_QR_CODE_LOGIN_MGR_OFFSET ;
|
|
DWORD get_qr_code_img_addr = base_addr_ + WX_GET_QR_CODE_IMAGE_OFFSET ;
|
|
|
|
DWORD temp;
|
|
__asm {
|
|
PUSHAD
|
|
PUSHFD
|
|
CALL qr_code_login_addr
|
|
MOV temp,EAX
|
|
POPFD
|
|
POPAD
|
|
}
|
|
std::string pre("https://weixin.qq.com/x/");
|
|
DWORD ptr = temp + 0x8;
|
|
DWORD len = *(DWORD*)(ptr+0x10);
|
|
if (*(DWORD *)(ptr) == 0) {
|
|
return std::string();
|
|
} else {
|
|
if( *(DWORD*) (temp+0x1c) > 0xf){
|
|
std::string suff(*(char **)ptr,len);
|
|
return pre + suff;
|
|
}else{
|
|
std::string suff((char *)ptr,len);
|
|
return pre + suff;
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace wxhelper
|