DelChatRoomMember.cpp 2.9 KB
Newer Older
L
ljc545w 已提交
1 2 3 4 5 6 7 8 9
#include "pch.h"

struct DelChatRoomMemberStruct
{
    DWORD chatroomid;
    DWORD wxids;
    DWORD length;
};

L
ljc545w 已提交
10
BOOL DelChatRoomMember(DWORD pid,wchar_t* chatroomid, wchar_t* wxid) {
L
ljc545w 已提交
11 12 13 14
    WeChatProcess hp(pid);
    if (!hp.m_init) return 1;
    DWORD DelChatRoomMemberRemoteAddr = hp.GetProcAddr(DelChatRoomMemberRemote);
    if (DelChatRoomMemberRemoteAddr == 0)
L
ljc545w 已提交
15
        return 1;
L
ljc545w 已提交
16 17 18 19 20
    WeChatData<wchar_t*> r_chatroomid(hp.GetHandle(), chatroomid, TEXTLENGTH(chatroomid));
    WeChatData<wchar_t*> r_wxid(hp.GetHandle(), wxid, TEXTLENGTH(wxid));
    DelChatRoomMemberStruct params = { 0 };
    params.chatroomid = (DWORD)r_chatroomid.GetAddr();
    params.wxids = (DWORD)r_wxid.GetAddr();
L
ljc545w 已提交
21
    params.length = 1;
L
ljc545w 已提交
22 23
    WeChatData<DelChatRoomMemberStruct*> r_params(hp.GetHandle(), &params, sizeof(params));
    if (r_chatroomid.GetAddr() == 0 || r_wxid.GetAddr() == 0 || r_params.GetAddr() == 0)
L
ljc545w 已提交
24
        return 1;
L
ljc545w 已提交
25 26
    DWORD ret = CallRemoteFunction(hp.GetHandle(), DelChatRoomMemberRemoteAddr, r_params.GetAddr());
    return ret == 0;
L
ljc545w 已提交
27 28
}

L
ljc545w 已提交
29
BOOL DelChatRoomMember(DWORD pid,wchar_t* chatroomid, SAFEARRAY* psaValue) {
L
ljc545w 已提交
30 31 32 33 34 35 36 37 38
    VARIANT rgvar;
    rgvar.vt = VT_BSTR;
    HRESULT hr = S_OK;
    long lLbound = psaValue->rgsabound->lLbound;
    long cElements = psaValue->rgsabound->cElements;
    if (cElements == 1) {
        VariantInit(&rgvar);
        long pIndex = 0;
        hr = SafeArrayGetElement(psaValue, &pIndex, &rgvar);
L
ljc545w 已提交
39 40
        return DelChatRoomMember(pid,chatroomid, rgvar.bstrVal);
    }
L
ljc545w 已提交
41
    DWORD dwWriteSize = 0;
L
ljc545w 已提交
42 43 44 45
    WeChatProcess hp(pid);
    if (!hp.m_init) return 1;
    DWORD DelChatRoomMemberRemoteAddr = hp.GetProcAddr(DelChatRoomMemberRemote);
    if (DelChatRoomMemberRemoteAddr == 0)
L
ljc545w 已提交
46
        return 1;
L
ljc545w 已提交
47 48
    WeChatData<wchar_t*> r_chatroomid(hp.GetHandle(), chatroomid, TEXTLENGTH(chatroomid));
    vector<void*> wxidptrs;
L
ljc545w 已提交
49 50 51
    for (long i = lLbound; i < lLbound + cElements; i++) {
        VariantInit(&rgvar);
        hr = SafeArrayGetElement(psaValue, &i, &rgvar);
L
ljc545w 已提交
52
        LPVOID wxidaddr = VirtualAllocEx(hp.GetHandle(), NULL, 1, MEM_COMMIT, PAGE_READWRITE);
L
ljc545w 已提交
53
        if (wxidaddr) {
L
ljc545w 已提交
54
            WriteProcessMemory(hp.GetHandle(), wxidaddr, rgvar.bstrVal, wcslen(rgvar.bstrVal) * 2 + 2, &dwWriteSize);
L
ljc545w 已提交
55 56 57
            wxidptrs.push_back(wxidaddr);
        }
    }
L
ljc545w 已提交
58 59 60 61
    WeChatData<void**> r_wxids(hp.GetHandle(), &wxidptrs[0], wxidptrs.size() * sizeof(void*));
    DelChatRoomMemberStruct params = { 0 };
    params.chatroomid = (DWORD)r_chatroomid.GetAddr();
    params.wxids = (DWORD)r_wxids.GetAddr();
L
ljc545w 已提交
62
    params.length = wxidptrs.size();
L
ljc545w 已提交
63 64
    WeChatData<DelChatRoomMemberStruct*> r_params(hp.GetHandle(), &params, sizeof(params));
    if (r_chatroomid.GetAddr() == 0 || r_wxids.GetAddr() == 0 || r_params.GetAddr() == 0)
L
ljc545w 已提交
65
        return 1;
L
ljc545w 已提交
66
    DWORD ret = CallRemoteFunction(hp.GetHandle(), DelChatRoomMemberRemoteAddr, r_params.GetAddr());
L
ljc545w 已提交
67
    for (unsigned int i = 0; i < wxidptrs.size(); i++) {
L
ljc545w 已提交
68
        VirtualFreeEx(hp.GetHandle(), wxidptrs[i], 0, MEM_RELEASE);
L
ljc545w 已提交
69
    }
L
ljc545w 已提交
70
    return ret == 0;
L
ljc545w 已提交
71
}