2023-11-23 22:58:29 +08:00
|
|
|
|
#include "framework.h"
|
2023-02-28 20:14:22 +08:00
|
|
|
|
#include <sstream>
|
2023-06-29 11:00:05 +08:00
|
|
|
|
#include <vector>
|
2023-02-28 20:14:22 +08:00
|
|
|
|
|
2023-06-13 07:40:38 +08:00
|
|
|
|
#include "chatroom_mgmt.h"
|
2023-02-28 20:14:22 +08:00
|
|
|
|
#include "load_calls.h"
|
|
|
|
|
#include "log.h"
|
|
|
|
|
#include "util.h"
|
|
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
extern WxCalls_t g_WxCalls;
|
2024-06-26 22:37:52 +08:00
|
|
|
|
extern QWORD g_WeChatWinDllAddr;
|
|
|
|
|
|
|
|
|
|
typedef QWORD (*funcGetChatRoomMgr_t)();
|
|
|
|
|
typedef QWORD (*funcAddMemberToChatRoom_t)(QWORD, QWORD, QWORD, QWORD);
|
|
|
|
|
|
2023-02-28 20:14:22 +08:00
|
|
|
|
int AddChatroomMember(string roomid, string wxids)
|
|
|
|
|
{
|
2024-06-26 22:37:52 +08:00
|
|
|
|
int status = -1;
|
|
|
|
|
|
2023-02-28 20:41:52 +08:00
|
|
|
|
if (roomid.empty() || wxids.empty()) {
|
|
|
|
|
LOG_ERROR("Empty roomid or wxids.");
|
2024-06-26 22:37:52 +08:00
|
|
|
|
return status;
|
2023-02-28 20:41:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-27 21:06:08 +08:00
|
|
|
|
funcGetChatRoomMgr_t GetChatRoomMgr = (funcGetChatRoomMgr_t)(g_WeChatWinDllAddr + g_WxCalls.arm.call1);
|
|
|
|
|
funcAddMemberToChatRoom_t AddMembers = (funcAddMemberToChatRoom_t)(g_WeChatWinDllAddr + g_WxCalls.arm.call2);
|
2023-02-28 20:14:22 +08:00
|
|
|
|
|
|
|
|
|
vector<wstring> vMembers;
|
2023-12-06 22:06:16 +08:00
|
|
|
|
vector<WxString> vWxMembers;
|
2023-02-28 20:41:52 +08:00
|
|
|
|
wstringstream wss(String2Wstring(wxids));
|
|
|
|
|
while (wss.good()) {
|
|
|
|
|
wstring wstr;
|
|
|
|
|
getline(wss, wstr, L',');
|
|
|
|
|
vMembers.push_back(wstr);
|
2024-06-26 22:37:52 +08:00
|
|
|
|
WxString wxMember(vMembers.back());
|
|
|
|
|
vWxMembers.push_back(wxMember);
|
2023-02-28 20:14:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-26 22:37:52 +08:00
|
|
|
|
QWORD temp[2] = { 0 };
|
|
|
|
|
WxString *pWxRoomid = NewWxStringFromStr(roomid);
|
|
|
|
|
QWORD pMembers = (QWORD) & ((RawVector_t *)&vWxMembers)->start;
|
|
|
|
|
|
2024-06-27 21:06:08 +08:00
|
|
|
|
QWORD mgr = GetChatRoomMgr();
|
|
|
|
|
status = (int)AddMembers(mgr, pMembers, (QWORD)pWxRoomid, (QWORD)temp);
|
2024-06-26 22:37:52 +08:00
|
|
|
|
return status;
|
2023-02-28 20:14:22 +08:00
|
|
|
|
}
|
2023-06-29 11:00:05 +08:00
|
|
|
|
|
|
|
|
|
int DelChatroomMember(string roomid, string wxids)
|
|
|
|
|
{
|
2024-06-27 21:08:37 +08:00
|
|
|
|
int status = -1;
|
|
|
|
|
|
2023-06-29 11:00:05 +08:00
|
|
|
|
if (roomid.empty() || wxids.empty()) {
|
|
|
|
|
LOG_ERROR("Empty roomid or wxids.");
|
2024-06-27 21:08:37 +08:00
|
|
|
|
return status;
|
2023-06-29 11:00:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-27 21:08:37 +08:00
|
|
|
|
funcGetChatRoomMgr_t GetChatRoomMgr = (funcGetChatRoomMgr_t)(g_WeChatWinDllAddr + g_WxCalls.drm.call1);
|
|
|
|
|
funcDelMemberFromChatRoom_t DelMembers = (funcDelMemberFromChatRoom_t)(g_WeChatWinDllAddr + g_WxCalls.drm.call2);
|
2023-06-29 11:00:05 +08:00
|
|
|
|
|
|
|
|
|
vector<wstring> vMembers;
|
2023-12-06 22:06:16 +08:00
|
|
|
|
vector<WxString> vWxMembers;
|
2023-06-29 11:00:05 +08:00
|
|
|
|
wstringstream wss(String2Wstring(wxids));
|
|
|
|
|
while (wss.good()) {
|
|
|
|
|
wstring wstr;
|
|
|
|
|
getline(wss, wstr, L',');
|
|
|
|
|
vMembers.push_back(wstr);
|
2024-06-27 21:08:37 +08:00
|
|
|
|
WxString wxMember(vMembers.back());
|
|
|
|
|
vWxMembers.push_back(wxMember);
|
2023-06-29 11:00:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-27 21:08:37 +08:00
|
|
|
|
WxString *pWxRoomid = NewWxStringFromStr(roomid);
|
|
|
|
|
QWORD pMembers = (QWORD) & ((RawVector_t *)&vWxMembers)->start;
|
|
|
|
|
|
|
|
|
|
QWORD mgr = GetChatRoomMgr();
|
|
|
|
|
status = (int)DelMembers(mgr, pMembers, (QWORD)pWxRoomid);
|
|
|
|
|
return status;
|
2023-06-29 11:00:05 +08:00
|
|
|
|
}
|
2023-12-06 22:05:27 +08:00
|
|
|
|
|
2024-06-27 21:08:37 +08:00
|
|
|
|
#if 0
|
2023-12-06 22:05:27 +08:00
|
|
|
|
int InviteChatroomMember(string roomid, string wxids)
|
|
|
|
|
{
|
|
|
|
|
wstring wsRoomid = String2Wstring((roomid));
|
|
|
|
|
WxString wxRoomid(wsRoomid);
|
|
|
|
|
|
|
|
|
|
vector<wstring> vMembers;
|
|
|
|
|
vector<WxString> vWxMembers;
|
|
|
|
|
wstringstream wss(String2Wstring(wxids));
|
|
|
|
|
while (wss.good()) {
|
|
|
|
|
wstring wstr;
|
|
|
|
|
getline(wss, wstr, L',');
|
|
|
|
|
vMembers.push_back(wstr);
|
|
|
|
|
WxString wxMember(vMembers.back());
|
|
|
|
|
vWxMembers.push_back(wxMember);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LOG_DEBUG("Inviting {} members[{}] to {}", vWxMembers.size(), wxids.c_str(), roomid.c_str());
|
|
|
|
|
|
|
|
|
|
DWORD irmCall1 = g_WeChatWinDllAddr + g_WxCalls.irm.call1;
|
|
|
|
|
DWORD irmCall2 = g_WeChatWinDllAddr + g_WxCalls.irm.call2;
|
|
|
|
|
DWORD irmCall3 = g_WeChatWinDllAddr + g_WxCalls.irm.call3;
|
|
|
|
|
DWORD irmCall4 = g_WeChatWinDllAddr + g_WxCalls.irm.call4;
|
|
|
|
|
DWORD irmCall5 = g_WeChatWinDllAddr + g_WxCalls.irm.call5;
|
|
|
|
|
DWORD irmCall6 = g_WeChatWinDllAddr + g_WxCalls.irm.call6;
|
|
|
|
|
DWORD irmCall7 = g_WeChatWinDllAddr + g_WxCalls.irm.call7;
|
|
|
|
|
DWORD irmCall8 = g_WeChatWinDllAddr + g_WxCalls.irm.call8;
|
|
|
|
|
|
|
|
|
|
DWORD sys_addr = (DWORD)GetModuleHandleA("win32u.dll") + 0x116C;
|
|
|
|
|
DWORD addr[2] = { sys_addr, 0 };
|
|
|
|
|
__asm {
|
|
|
|
|
pushad;
|
|
|
|
|
pushfd;
|
|
|
|
|
call irmCall1;
|
|
|
|
|
lea ecx, addr;
|
|
|
|
|
push ecx;
|
|
|
|
|
mov ecx, eax;
|
|
|
|
|
call irmCall2;
|
|
|
|
|
call irmCall3;
|
|
|
|
|
sub esp, 0x8;
|
|
|
|
|
lea eax, addr;
|
|
|
|
|
mov ecx, esp;
|
|
|
|
|
push eax;
|
|
|
|
|
call irmCall4;
|
|
|
|
|
sub esp, 0x14;
|
|
|
|
|
mov ecx, esp;
|
|
|
|
|
lea eax, wxRoomid;
|
|
|
|
|
push eax;
|
|
|
|
|
call irmCall5;
|
|
|
|
|
lea eax, vWxMembers;
|
|
|
|
|
push eax;
|
|
|
|
|
call irmCall6;
|
|
|
|
|
call irmCall1;
|
|
|
|
|
push 0x0;
|
|
|
|
|
push 0x1;
|
|
|
|
|
mov ecx, eax;
|
|
|
|
|
call irmCall7;
|
|
|
|
|
lea ecx, addr;
|
|
|
|
|
call irmCall8;
|
|
|
|
|
popfd;
|
|
|
|
|
popad;
|
|
|
|
|
}
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
2024-04-15 21:42:04 +08:00
|
|
|
|
#endif
|