GetChatRoomMembers.cpp 2.3 KB
Newer Older
L
ljc545w 已提交
1 2 3 4 5 6 7
#include "pch.h"

struct ChatRoomInfoStruct {
	DWORD members;
	DWORD length;
};

L
ljc545w 已提交
8 9
SAFEARRAY* GetChatRoomMembers(DWORD pid,wchar_t* chatroomid) {
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
L
ljc545w 已提交
10 11
	if (!hProcess)
		return NULL;
L
ljc545w 已提交
12 13 14 15 16
    DWORD WeChatRobotBase = GetWeChatRobotBase(pid);
    if (!WeChatRobotBase) {
        CloseHandle(hProcess);
        return NULL;
    }
L
ljc545w 已提交
17 18 19 20 21 22 23
    DWORD dwId = 0;
    DWORD dwWriteSize = 0;
    DWORD dwHandle = 0;
    HRESULT hr = S_OK;
    ChatRoomInfoStruct chatroominfo = { 0 };
    LPVOID chatroomidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
    if (!chatroomidaddr || !WeChatRobotBase) {
L
ljc545w 已提交
24
        CloseHandle(hProcess);
L
ljc545w 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37
        return NULL;
    }
    else {
        WriteProcessMemory(hProcess, chatroomidaddr, chatroomid, wcslen(chatroomid) * 2 + 2, &dwWriteSize);
    }

    DWORD GetChatRoomMembersRemoteAddr = WeChatRobotBase + GetChatRoomMembersRemoteOffset;
    HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetChatRoomMembersRemoteAddr, (LPVOID)chatroomidaddr, 0, &dwId);
    if (hThread) {
        WaitForSingleObject(hThread, INFINITE);
        GetExitCodeThread(hThread, &dwHandle);
    }
    else {
L
ljc545w 已提交
38
        CloseHandle(hProcess);
L
ljc545w 已提交
39 40
        return NULL;
    }
L
ljc545w 已提交
41 42
    if (!dwHandle) {
        CloseHandle(hProcess);
L
ljc545w 已提交
43
        return NULL;
L
ljc545w 已提交
44
    }
L
ljc545w 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
    ReadProcessMemory(hProcess,(LPCVOID)dwHandle,&chatroominfo,sizeof(ChatRoomInfoStruct),0);
    wchar_t* members = new wchar_t[chatroominfo.length + 1];
    ZeroMemory(members, (chatroominfo.length + 1) * 2);
    ReadProcessMemory(hProcess, (LPCVOID)chatroominfo.members, members, chatroominfo.length * 2, 0);
    cout << members << endl;
    SAFEARRAYBOUND rgsaBound[2] = { {2,0},{2,0} };
    SAFEARRAY* psaValue = SafeArrayCreate(VT_VARIANT, 2, rgsaBound);
    long keyIndex[2] = { 0,0 };
    keyIndex[0] = 0; keyIndex[1] = 0;
    hr = SafeArrayPutElement(psaValue, keyIndex, &(_variant_t)L"chatroomid");
    keyIndex[0] = 0; keyIndex[1] = 1;
    hr = SafeArrayPutElement(psaValue, keyIndex, &(_variant_t)chatroomid);
    keyIndex[0] = 1; keyIndex[1] = 0;
    hr = SafeArrayPutElement(psaValue, keyIndex, &(_variant_t)L"members");
    keyIndex[0] = 1; keyIndex[1] = 1;
    hr = SafeArrayPutElement(psaValue, keyIndex, &(_variant_t)members);
    delete[] members;
    members = NULL;
L
ljc545w 已提交
63
    CloseHandle(hProcess);
L
ljc545w 已提交
64 65
    return psaValue;
}