FriendList.cpp 2.1 KB
Newer Older
L
ljc545w 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
#include "pch.h"
#include <vector> 
using namespace std;
#define LeftTreeOffset 0x222F3BC


struct WxFriendStructW {
	DWORD wxIdAddr;
	DWORD wxNumberAddr;
	DWORD wxNickNameAddr;
	DWORD wxRemarkAddr;
	WxFriendStructW(DWORD wxIdAddr, DWORD wxNumberAddr, DWORD wxNickNameAddr, DWORD wxRemarkAddr) {
		this->wxIdAddr = wxIdAddr;
		this->wxNumberAddr = wxNumberAddr;
		this->wxNickNameAddr = wxNickNameAddr;
		this->wxRemarkAddr = wxRemarkAddr;
	}
};

vector<WxFriendStructW> WxFriendList;

int GetFriendListInit() {
	GetFriendList();
#ifdef _DEBUG
	cout << WxFriendList.size() << endl;
#endif
	return WxFriendList.size();
}

DWORD GetFriendListRemote() {
	if (WxFriendList.size() == 0)
		return 0;
#ifdef _DEBUG
	printf("0x%08X\n", (DWORD)&WxFriendList[0]);
	printf("0x%08X\n", (DWORD)&(WxFriendList[0].wxIdAddr));
#endif
	return (DWORD)&WxFriendList[0].wxIdAddr;
}

void GetFriendListFinish() {
	WxFriendList.clear();
	cout << WxFriendList.size() << endl;
}

void __stdcall GetFriendList() {
L
ljc545w 已提交
46 47 48
#ifdef _DEBUG
	wcout.imbue(locale("chs"));
#endif
L
ljc545w 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
	DWORD WeChatWinBase = GetWeChatWinBase();
	DWORD LeftTreeAddr = 0;
	DWORD RightTreeAddr = 0;
	DWORD LeftTreeHead = 0;
	DWORD baseAddr = WeChatWinBase + LeftTreeOffset;
	__asm {
		pushad;
		mov eax, dword ptr[baseAddr];
		mov eax, dword ptr[eax];
		mov eax, dword ptr[eax + 0x4C];
		mov ecx, dword ptr[eax];
		mov LeftTreeAddr, ecx;
		mov LeftTreeHead, eax;
		mov ecx, dword ptr[eax + 0x4];
		mov RightTreeAddr, ecx;
		popad;
	}
	
	while (1) {
		DWORD wxIdAddr = 0;
		DWORD wxNumberAddr = 0;
		DWORD wxNickNameAddr = 0;
		DWORD wxRemarkAddr = 0;

		__asm {
			pushad;
			mov eax, dword ptr [LeftTreeAddr];
			mov ecx, eax;
			add ecx, 0x30;
			mov wxIdAddr, ecx;
			mov ecx, eax;
			add ecx, 0x44;
			mov wxNumberAddr, ecx;
			mov ecx, eax;
			add ecx, 0x8C;
			mov wxNickNameAddr, ecx;
			mov ecx, eax;
			add ecx, 0x78;
			mov wxRemarkAddr, ecx;
			mov ecx, dword ptr [eax];
			mov LeftTreeAddr, ecx;
			popad;
		}
		WxFriendStructW p(wxIdAddr, wxNumberAddr, wxNickNameAddr, wxRemarkAddr);
		WxFriendList.push_back(p);
L
ljc545w 已提交
94 95 96
#ifdef _DEBUG
		wcout << (wchar_t*)(*(DWORD*)p.wxIdAddr) << endl;
#endif
L
ljc545w 已提交
97 98 99 100
		if (LeftTreeAddr == LeftTreeHead) {
			break;
		}
	}
L
ljc545w 已提交
101
}