Impl invite chatroom member. Close #69

This commit is contained in:
Changhua 2023-12-06 22:05:27 +08:00
parent 350d426fee
commit d0b8cc2305
10 changed files with 135 additions and 9 deletions

View File

@ -32,6 +32,7 @@ enum Functions {
FUNC_DECRYPT_IMAGE = 0x60; FUNC_DECRYPT_IMAGE = 0x60;
FUNC_ADD_ROOM_MEMBERS = 0x70; FUNC_ADD_ROOM_MEMBERS = 0x70;
FUNC_DEL_ROOM_MEMBERS = 0x71; FUNC_DEL_ROOM_MEMBERS = 0x71;
FUNC_INV_ROOM_MEMBERS = 0x72;
} }
message Request message Request
@ -45,7 +46,7 @@ message Request
PathMsg file = 5; PathMsg file = 5;
DbQuery query = 6; DbQuery query = 6;
Verification v = 7; Verification v = 7;
AddMembers m = 8; MemberMgmt m = 8; //
XmlMsg xml = 9; XmlMsg xml = 9;
DecPath dec = 10; DecPath dec = 10;
Transfer tf = 11; Transfer tf = 11;
@ -160,7 +161,7 @@ message Verification
int32 scene = 3; // 17 30 int32 scene = 3; // 17 30
} }
message AddMembers message MemberMgmt
{ {
string roomid = 1; // ID string roomid = 1; // ID
string wxids = 2; // string wxids = 2; //

View File

@ -114,3 +114,67 @@ int DelChatroomMember(string roomid, string wxids)
} }
return rv; return rv;
} }
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;
}

View File

@ -4,3 +4,4 @@
int AddChatroomMember(std::string roomid, std::string wxids); int AddChatroomMember(std::string roomid, std::string wxids);
int DelChatroomMember(std::string roomid, std::string wxids); int DelChatroomMember(std::string roomid, std::string wxids);
int InviteChatroomMember(std::string roomid, std::string wxids);

View File

@ -35,7 +35,9 @@ WxCalls_t wxCalls = {
/* call1, call2, call3, call4, call5*/ /* call1, call2, call3, call4, call5*/
{0x76E630, 0x76AE20, 0xF59E40, 0xB73000, 0x76E350}, {0x76E630, 0x76AE20, 0xF59E40, 0xB73000, 0x76E350},
/* call1, call2, call3 */ /* call1, call2, call3 */
{0x931730, 0x1D58751, 0x1421940} {0x931730, 0x1D58751, 0x1421940},
/* call1, call2, call3, call4, call5, call6, call7, call8*/
{0x78CB40, 0x7F99D0, 0x78CF20, 0x78CEF0, 0xF59E40, 0xBD1A00, 0x7FA980, 0x755060}
}; };
int LoadCalls(const wchar_t *version, WxCalls_t *calls) int LoadCalls(const wchar_t *version, WxCalls_t *calls)

View File

@ -717,6 +717,30 @@ bool func_del_room_members(char *roomid, char *wxids, uint8_t *out, size_t *len)
return true; return true;
} }
bool func_invite_room_members(char *roomid, char *wxids, uint8_t *out, size_t *len)
{
Response rsp = Response_init_default;
rsp.func = Functions_FUNC_INV_ROOM_MEMBERS;
rsp.which_msg = Response_status_tag;
rsp.msg.status = 0;
if ((roomid == NULL) || (wxids == NULL)) {
LOG_ERROR("Empty roomid or wxids.");
rsp.msg.status = -1;
} else {
rsp.msg.status = InviteChatroomMember(roomid, wxids);
}
pb_ostream_t stream = pb_ostream_from_buffer(out, *len);
if (!pb_encode(&stream, Response_fields, &rsp)) {
LOG_ERROR("Encoding failed: {}", PB_GET_ERROR(&stream));
return false;
}
*len = stream.bytes_written;
return true;
}
static bool dispatcher(uint8_t *in, size_t in_len, uint8_t *out, size_t *out_len) static bool dispatcher(uint8_t *in, size_t in_len, uint8_t *out, size_t *out_len)
{ {
bool ret = false; bool ret = false;
@ -868,6 +892,11 @@ static bool dispatcher(uint8_t *in, size_t in_len, uint8_t *out, size_t *out_len
ret = func_del_room_members(req.msg.m.roomid, req.msg.m.wxids, out, out_len); ret = func_del_room_members(req.msg.m.roomid, req.msg.m.wxids, out, out_len);
break; break;
} }
case Functions_FUNC_INV_ROOM_MEMBERS: {
LOG_DEBUG("[Functions_FUNC_INV_ROOM_MEMBERS]");
ret = func_invite_room_members(req.msg.m.roomid, req.msg.m.wxids, out, out_len);
break;
}
default: { default: {
LOG_ERROR("[UNKNOW FUNCTION]"); LOG_ERROR("[UNKNOW FUNCTION]");
break; break;

Binary file not shown.

View File

@ -51,7 +51,7 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 39,0,9,0 FILEVERSION 39,0,10,0
PRODUCTVERSION 3,9,2,23 PRODUCTVERSION 3,9,2,23
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
@ -69,7 +69,7 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "WeChatFerry" VALUE "CompanyName", "WeChatFerry"
VALUE "FileDescription", "WeChatFerry" VALUE "FileDescription", "WeChatFerry"
VALUE "FileVersion", "39.0.9.0" VALUE "FileVersion", "39.0.10.0"
VALUE "InternalName", "spy.dll" VALUE "InternalName", "spy.dll"
VALUE "LegalCopyright", "Copyright (C) 2023" VALUE "LegalCopyright", "Copyright (C) 2023"
VALUE "OriginalFilename", "spy.dll" VALUE "OriginalFilename", "spy.dll"

View File

@ -134,6 +134,17 @@ typedef struct CallPatMsg {
DWORD call3; DWORD call3;
} CallPatMsg_t; } CallPatMsg_t;
typedef struct CallInviteCM {
DWORD call1;
DWORD call2;
DWORD call3;
DWORD call4;
DWORD call5;
DWORD call6;
DWORD call7;
DWORD call8;
} CallInviteCM_t;
typedef struct WxCalls { typedef struct WxCalls {
DWORD login; // 登录状态 DWORD login; // 登录状态
UserInfoCall_t ui; // 用户信息 UserInfoCall_t ui; // 用户信息
@ -154,6 +165,7 @@ typedef struct WxCalls {
RevokeMsg_t rm; // 撤回消息 RevokeMsg_t rm; // 撤回消息
CallRichText_t rt; // 发送消息卡片 CallRichText_t rt; // 发送消息卡片
CallPatMsg_t pm; // 发送拍一拍消息 CallPatMsg_t pm; // 发送拍一拍消息
CallInviteCM_t irm; // 邀请群成员
} WxCalls_t; } WxCalls_t;
struct WxString { struct WxString {

View File

@ -815,6 +815,23 @@ class Wcf():
rsp = self._send_request(req) rsp = self._send_request(req)
return rsp.status return rsp.status
def invite_chatroom_members(self, roomid: str, wxids: str) -> int:
"""邀请群成员
Args:
roomid (str): 群的 id
wxids (str): 要邀请成员的 wxid, 多个用逗号`,`分隔
Returns:
int: 1 为成功其他失败
"""
req = wcf_pb2.Request()
req.func = wcf_pb2.FUNC_INV_ROOM_MEMBERS # FUNC_INV_ROOM_MEMBERS
req.m.roomid = roomid
req.m.wxids = wxids.replace(" ", "")
rsp = self._send_request(req)
return rsp.status
def get_chatroom_members(self, roomid: str) -> Dict: def get_chatroom_members(self, roomid: str) -> Dict:
"""获取群成员 """获取群成员

File diff suppressed because one or more lines are too long