WeChatFerry/WeChatFerry/spy/chatroom_mgmt.cpp

146 lines
4.1 KiB
C++
Raw Normal View History

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