2022-12-21 20:30:44 +08:00
|
|
|
#include "pch.h"
|
|
|
|
#include "self_info.h"
|
|
|
|
|
|
|
|
#include "common.h"
|
|
|
|
|
|
|
|
#include "wechat_data.h"
|
2023-02-06 11:21:13 +08:00
|
|
|
using namespace std;
|
2022-12-21 20:30:44 +08:00
|
|
|
|
2023-02-09 15:47:55 +08:00
|
|
|
#define WX_SELF_NAME_OFFSET 0x2E2CE48
|
|
|
|
#define WX_SELF_MOBILE_OFFSET 0x2E2CDB8
|
|
|
|
#define WX_SELF_CITY_OFFSET 0x2E2CE18
|
|
|
|
#define WX_SELF_PROVINCE_OFFSET 0x2E2CE00
|
|
|
|
#define WX_SELF_COUNTRY_OFFSET 0x2E2CDE8
|
|
|
|
#define WX_SELF_ACCOUNT_OFFSET 0x2e2d1d0
|
|
|
|
#define WX_SELF_ID_OFFSET 0x2E2CD3C
|
|
|
|
#define WX_SELF_SMALL_IMG_OFFSET 0x2E2D014
|
|
|
|
#define WX_SELF_BIG_IMG_OFFSET 0x2E2CFFC
|
|
|
|
#define WX_LOGIN_STATUS_OFFSET 0x2E2D1C0
|
|
|
|
#define WX_APP_DATA_ROOT_PATH_OFFSET 0x2E73010
|
|
|
|
#define WX_APP_DATA_SAVE_PATH_OFFSET 0x2E52DB0
|
|
|
|
#define WX_CURRENT_DATA_PATH_OFFSET 0x2E4F290
|
2022-12-21 20:30:44 +08:00
|
|
|
|
2023-02-09 15:47:55 +08:00
|
|
|
#define WX_LOGOUT_OFFSET 0xdd5c90
|
|
|
|
#define WX_ACCOUT_SERVICE_OFFSET 0x707960
|
2022-12-21 20:30:44 +08:00
|
|
|
|
|
|
|
int GetSelfInfo(SelfInfoInner &out) {
|
|
|
|
DWORD base = GetWeChatWinBase();
|
|
|
|
#ifdef _DEBUG
|
|
|
|
cout << "mobile:" << (char *)(base + WX_SELF_MOBILE_OFFSET) << endl;
|
|
|
|
cout << "name:" << (char *)(base + WX_SELF_NAME_OFFSET) << endl;
|
|
|
|
cout << "city:" << (char *)(base + WX_SELF_CITY_OFFSET) << endl;
|
|
|
|
cout << "city:" << (char *)(base + WX_SELF_CITY_OFFSET) << endl;
|
|
|
|
cout << "province:" << (char *)(base + WX_SELF_PROVINCE_OFFSET) << endl;
|
|
|
|
cout << "country:" << (char *)(base + WX_SELF_COUNTRY_OFFSET) << endl;
|
|
|
|
cout << "account:" << (char *)(base + WX_SELF_ACCOUNT_OFFSET) << endl;
|
|
|
|
cout << "wxid:" << (char *)(base + WX_SELF_ID_OFFSET) << endl;
|
|
|
|
cout << "small_img:" << (char *)(base + WX_SELF_SMALL_IMG_OFFSET) << endl;
|
|
|
|
cout << "big_img:" << (char *)(base + WX_SELF_BIG_IMG_OFFSET) << endl;
|
|
|
|
#endif
|
|
|
|
if (*(DWORD *)(base + WX_SELF_NAME_OFFSET) == 0 ||
|
|
|
|
*(DWORD *)(base + WX_SELF_NAME_OFFSET + 0x10) == 0) {
|
|
|
|
out.name = string();
|
|
|
|
} else {
|
|
|
|
out.name = string((char *)(base + WX_SELF_NAME_OFFSET),
|
|
|
|
*(DWORD *)(base + WX_SELF_NAME_OFFSET + 0x10));
|
|
|
|
}
|
|
|
|
if (*(DWORD *)(base + WX_SELF_MOBILE_OFFSET) == 0 ||
|
|
|
|
*(DWORD *)(base + WX_SELF_MOBILE_OFFSET + 0x10) == 0) {
|
|
|
|
out.mobile = string();
|
|
|
|
} else {
|
|
|
|
out.mobile = string((char *)(base + WX_SELF_MOBILE_OFFSET),
|
|
|
|
*(DWORD *)(base + WX_SELF_MOBILE_OFFSET + 0x10));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*(DWORD *)(base + WX_SELF_CITY_OFFSET) == 0 ||
|
|
|
|
*(DWORD *)(base + WX_SELF_CITY_OFFSET + 0x10) == 0) {
|
|
|
|
out.city = string();
|
|
|
|
} else {
|
|
|
|
out.city = string((char *)(base + WX_SELF_CITY_OFFSET),
|
|
|
|
*(DWORD *)(base + WX_SELF_CITY_OFFSET + 0x10));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*(DWORD *)(base + WX_SELF_PROVINCE_OFFSET) == 0 ||
|
|
|
|
*(DWORD *)(base + WX_SELF_PROVINCE_OFFSET + 0x10) == 0) {
|
|
|
|
out.province = string();
|
|
|
|
} else {
|
|
|
|
out.province = string((char *)(base + WX_SELF_PROVINCE_OFFSET),
|
|
|
|
*(DWORD *)(base + WX_SELF_PROVINCE_OFFSET + 0x10));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*(DWORD *)(base + WX_SELF_COUNTRY_OFFSET) == 0 ||
|
|
|
|
*(DWORD *)(base + WX_SELF_COUNTRY_OFFSET + 0x10) == 0) {
|
|
|
|
out.country = string();
|
|
|
|
} else {
|
|
|
|
out.country = string((char *)(base + WX_SELF_COUNTRY_OFFSET),
|
|
|
|
*(DWORD *)(base + WX_SELF_COUNTRY_OFFSET + 0x10));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*(DWORD *)(base + WX_SELF_ACCOUNT_OFFSET) == 0 ||
|
|
|
|
*(DWORD *)(base + WX_SELF_ACCOUNT_OFFSET + 0x10) == 0) {
|
|
|
|
out.account = string();
|
|
|
|
} else {
|
|
|
|
out.account = string(*(char **)(base + WX_SELF_ACCOUNT_OFFSET),
|
|
|
|
*(DWORD *)(base + WX_SELF_ACCOUNT_OFFSET + 0x10));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*(DWORD *)(base + WX_SELF_ID_OFFSET) == 0 ||
|
|
|
|
*(DWORD *)(base + WX_SELF_ID_OFFSET + 0x10) == 0) {
|
|
|
|
out.wxid = string();
|
|
|
|
} else {
|
|
|
|
out.wxid = string(*(char **)(base + WX_SELF_ID_OFFSET),
|
|
|
|
*(DWORD *)(base + WX_SELF_ID_OFFSET + 0x10));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*(DWORD *)(base + WX_SELF_SMALL_IMG_OFFSET) == 0 ||
|
|
|
|
*(DWORD *)(base + WX_SELF_SMALL_IMG_OFFSET + 0x10) == 0) {
|
|
|
|
out.small_img = string();
|
|
|
|
} else {
|
|
|
|
out.small_img = string(*(char **)(base + WX_SELF_SMALL_IMG_OFFSET),
|
|
|
|
*(DWORD *)(base + WX_SELF_SMALL_IMG_OFFSET + 0x10));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*(DWORD *)(base + WX_SELF_BIG_IMG_OFFSET) == 0 ||
|
|
|
|
*(DWORD *)(base + WX_SELF_BIG_IMG_OFFSET + 0x10) == 0) {
|
|
|
|
out.big_img = string();
|
|
|
|
} else {
|
|
|
|
out.big_img = string(*(char **)(base + WX_SELF_BIG_IMG_OFFSET),
|
|
|
|
*(DWORD *)(base + WX_SELF_BIG_IMG_OFFSET + 0x10));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*(DWORD *)(base + WX_APP_DATA_ROOT_PATH_OFFSET) == 0 ||
|
|
|
|
*(DWORD *)(base + WX_APP_DATA_ROOT_PATH_OFFSET + 0x4) == 0) {
|
|
|
|
out.data_root_path = string();
|
|
|
|
} else {
|
|
|
|
out.data_root_path = Wstring2String(wstring(*(wchar_t **)(base + WX_APP_DATA_ROOT_PATH_OFFSET),
|
|
|
|
*(DWORD *)(base + WX_APP_DATA_ROOT_PATH_OFFSET + 0x4)));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*(DWORD *)(base + WX_APP_DATA_SAVE_PATH_OFFSET) == 0 ||
|
|
|
|
*(DWORD *)(base + WX_APP_DATA_SAVE_PATH_OFFSET + 0x4) == 0) {
|
|
|
|
out.data_save_path = string();
|
|
|
|
} else {
|
|
|
|
out.data_save_path = Wstring2String(wstring(*(wchar_t **)(base + WX_APP_DATA_SAVE_PATH_OFFSET),
|
|
|
|
*(DWORD *)(base + WX_APP_DATA_SAVE_PATH_OFFSET + 0x4)));
|
|
|
|
}
|
|
|
|
if (*(DWORD *)(base + WX_CURRENT_DATA_PATH_OFFSET) == 0 ||
|
|
|
|
*(DWORD *)(base + WX_CURRENT_DATA_PATH_OFFSET + 0x4) == 0) {
|
|
|
|
out.current_data_path = string();
|
|
|
|
} else {
|
|
|
|
out.current_data_path = Wstring2String(wstring(*(wchar_t **)(base + WX_CURRENT_DATA_PATH_OFFSET),
|
|
|
|
*(DWORD *)(base + WX_CURRENT_DATA_PATH_OFFSET + 0x4)));
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CheckLogin(){
|
|
|
|
DWORD base = GetWeChatWinBase();
|
|
|
|
return *(DWORD*) (base + WX_LOGIN_STATUS_OFFSET);
|
2023-01-02 11:45:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int Logout(){
|
|
|
|
int success = 0;
|
|
|
|
if(!CheckLogin()){
|
|
|
|
return success;
|
|
|
|
}
|
|
|
|
DWORD base = GetWeChatWinBase();
|
|
|
|
DWORD account_service_addr = base + WX_ACCOUT_SERVICE_OFFSET;
|
|
|
|
DWORD logout_addr = base + WX_LOGOUT_OFFSET;
|
|
|
|
__asm{
|
|
|
|
PUSHAD
|
|
|
|
CALL account_service_addr
|
|
|
|
PUSH 0x0
|
|
|
|
MOV ECX,EAX
|
|
|
|
CALL logout_addr
|
|
|
|
MOV success,EAX
|
|
|
|
POPAD
|
|
|
|
}
|
|
|
|
return success;
|
2022-12-21 20:30:44 +08:00
|
|
|
}
|