mirror of
https://github.com/ttttupup/wxhelper.git
synced 2025-04-20 03:49:17 +08:00
438 lines
14 KiB
C++
438 lines
14 KiB
C++
#include "pch.h"
|
|
#include "chat_room_mgr.h"
|
|
|
|
#include "db.h"
|
|
|
|
using namespace std;
|
|
|
|
namespace wxhelper {
|
|
|
|
ChatRoomMgr::ChatRoomMgr(DWORD base) : BaseMgr(base) {}
|
|
|
|
ChatRoomMgr::~ChatRoomMgr() {}
|
|
|
|
int ChatRoomMgr::GetChatRoomDetailInfo(wchar_t* chat_room_id,
|
|
ChatRoomInfoInner& room_info) {
|
|
int success = -1;
|
|
WeChatString chat_room(chat_room_id);
|
|
DWORD get_chat_room_mgr_addr = base_addr_ + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD get_chat_room_detail_addr =
|
|
base_addr_ + WX_GET_CHAT_ROOM_DETAIL_INFO_OFFSET;
|
|
DWORD create_chat_room_info_addr = base_addr_ + WX_NEW_CHAT_ROOM_INFO_OFFSET;
|
|
DWORD free_chat_room_info_addr = base_addr_ + WX_FREE_CHAT_ROOM_INFO_OFFSET;
|
|
char chat_room_info[0xDC] = {0};
|
|
__asm {
|
|
PUSHAD
|
|
LEA ECX,chat_room_info
|
|
CALL create_chat_room_info_addr
|
|
CALL get_chat_room_mgr_addr
|
|
PUSH 0x0
|
|
LEA ECX,chat_room_info
|
|
PUSH ECX
|
|
LEA ECX,chat_room
|
|
PUSH ECX
|
|
MOV ECX,EAX
|
|
CALL get_chat_room_detail_addr
|
|
MOV success,EAX
|
|
POPAD
|
|
}
|
|
DWORD room_id_len = *(DWORD*)(chat_room_info + 0x8);
|
|
DWORD room_id_max_len = *(DWORD*)(chat_room_info + 0xC);
|
|
wchar_t* room_id = new wchar_t[room_id_len + 1];
|
|
wmemcpy(room_id, *(wchar_t**)(chat_room_info + 0x4), room_id_len + 1);
|
|
room_info.chat_room_id.ptr = room_id;
|
|
room_info.chat_room_id.length = room_id_len;
|
|
room_info.chat_room_id.max_length = room_id_max_len;
|
|
|
|
DWORD notice_len = *(DWORD*)(chat_room_info + 0x1C);
|
|
DWORD notice_max_len = *(DWORD*)(chat_room_info + 0x20);
|
|
wchar_t* notice_ptr = *(wchar_t**)(chat_room_info + 0x18);
|
|
if (notice_len <= 0) {
|
|
room_info.notice.ptr = nullptr;
|
|
} else {
|
|
wchar_t* notice = new wchar_t[notice_len + 1];
|
|
wmemcpy(notice, notice_ptr, notice_len + 1);
|
|
room_info.notice.ptr = notice;
|
|
}
|
|
room_info.notice.length = notice_len;
|
|
room_info.notice.max_length = notice_max_len;
|
|
|
|
DWORD admin_len = *(DWORD*)(chat_room_info + 0x30);
|
|
DWORD admin_max_len = *(DWORD*)(chat_room_info + 0x34);
|
|
wchar_t* admin_ptr = *(wchar_t**)(chat_room_info + 0x2C);
|
|
if (admin_len <= 0) {
|
|
room_info.admin.ptr = nullptr;
|
|
} else {
|
|
wchar_t* admin = new wchar_t[admin_len + 1];
|
|
wmemcpy(admin, admin_ptr, admin_len + 1);
|
|
room_info.admin.ptr = admin;
|
|
}
|
|
room_info.admin.length = admin_len;
|
|
room_info.admin.max_length = admin_max_len;
|
|
|
|
DWORD xml_len = *(DWORD*)(chat_room_info + 0x54);
|
|
DWORD xml_max_len = *(DWORD*)(chat_room_info + 0x58);
|
|
wchar_t* xml_ptr = *(wchar_t**)(chat_room_info + 0x50);
|
|
if (xml_len <= 0) {
|
|
room_info.xml.ptr = nullptr;
|
|
} else {
|
|
wchar_t* xml = new wchar_t[xml_len + 1];
|
|
wmemcpy(xml, xml_ptr, xml_len + 1);
|
|
room_info.xml.ptr = xml;
|
|
}
|
|
room_info.xml.length = xml_len;
|
|
room_info.xml.max_length = xml_max_len;
|
|
|
|
__asm {
|
|
PUSHAD
|
|
LEA ECX,chat_room_info
|
|
CALL free_chat_room_info_addr
|
|
POPAD
|
|
}
|
|
return success;
|
|
}
|
|
|
|
int ChatRoomMgr::DelMemberFromChatRoom(wchar_t* chat_room_id, wchar_t** wxids,
|
|
int len) {
|
|
int success = 0;
|
|
WeChatString chat_room(chat_room_id);
|
|
vector<WeChatString> members;
|
|
VectorInner* list = (VectorInner*)&members;
|
|
DWORD members_ptr = (DWORD)&list->start;
|
|
for (int i = 0; i < len; i++) {
|
|
WeChatString pwxid(wxids[i]);
|
|
members.push_back(pwxid);
|
|
}
|
|
DWORD get_chat_room_mgr_addr = base_addr_ + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD del_member_addr = base_addr_ + WX_DEL_CHAT_ROOM_MEMBER_OFFSET;
|
|
DWORD init_chat_msg_addr = base_addr_ + WX_INIT_CHAT_MSG_OFFSET;
|
|
__asm {
|
|
PUSHAD
|
|
PUSHFD
|
|
CALL get_chat_room_mgr_addr
|
|
SUB ESP,0x14
|
|
MOV ESI,EAX
|
|
MOV ECX,ESP
|
|
LEA EDI,chat_room
|
|
PUSH EDI
|
|
CALL init_chat_msg_addr
|
|
MOV ECX,ESI
|
|
MOV EAX,dword ptr[members_ptr]
|
|
PUSH EAX
|
|
CALL del_member_addr
|
|
MOV success,EAX
|
|
POPFD
|
|
POPAD
|
|
}
|
|
return success;
|
|
}
|
|
|
|
int ChatRoomMgr::AddMemberToChatRoom(wchar_t* chat_room_id, wchar_t** wxids,
|
|
int len) {
|
|
int success = -1;
|
|
WeChatString chat_room(chat_room_id);
|
|
vector<WeChatString> members;
|
|
VectorInner* list = (VectorInner*)&members;
|
|
DWORD members_ptr = (DWORD)&list->start;
|
|
for (int i = 0; i < len; i++) {
|
|
WeChatString pwxid(wxids[i]);
|
|
members.push_back(pwxid);
|
|
}
|
|
DWORD get_chat_room_mgr_addr = base_addr_ + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD add_member_addr = base_addr_ + WX_ADD_MEMBER_TO_CHAT_ROOM_OFFSET;
|
|
DWORD init_chat_msg_addr = base_addr_ + WX_INIT_CHAT_MSG_OFFSET;
|
|
DWORD temp = 0;
|
|
__asm {
|
|
PUSHAD
|
|
PUSHFD
|
|
CALL get_chat_room_mgr_addr
|
|
SUB ESP,0x8
|
|
MOV temp,EAX
|
|
MOV ECX,ESP
|
|
MOV dword ptr [ECX],0x0
|
|
MOV dword ptr [ECX + 4],0x0
|
|
TEST ESI,ESI
|
|
SUB ESP,0x14
|
|
MOV ECX,ESP
|
|
LEA EAX,chat_room
|
|
PUSH EAX
|
|
CALL init_chat_msg_addr
|
|
MOV ECX,temp
|
|
MOV EAX,dword ptr[members_ptr]
|
|
PUSH EAX
|
|
CALL add_member_addr
|
|
MOV success,EAX
|
|
POPFD
|
|
POPAD
|
|
}
|
|
return success;
|
|
}
|
|
|
|
int ChatRoomMgr::GetMemberFromChatRoom(wchar_t* chat_room_id,
|
|
ChatRoomInner& out) {
|
|
int success = -1;
|
|
WeChatString chat_room(chat_room_id);
|
|
DWORD chat_room_ptr = (DWORD)&chat_room;
|
|
char buffer[0x1D4] = {0};
|
|
DWORD get_member_addr = base_addr_ + WX_GET_MEMBER_FROM_CHAT_ROOM_OFFSET;
|
|
DWORD get_chat_room_mgr_addr = base_addr_ + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD create_chat_room_addr = base_addr_ + WX_INIT_CHAT_ROOM_OFFSET;
|
|
DWORD free_chat_room_addr = base_addr_ + WX_FREE_CHAT_ROOM_OFFSET;
|
|
__asm {
|
|
PUSHAD
|
|
LEA ECX,buffer
|
|
CALL create_chat_room_addr
|
|
CALL get_chat_room_mgr_addr
|
|
LEA EAX, buffer
|
|
PUSH EAX
|
|
PUSH chat_room_ptr
|
|
CALL get_member_addr
|
|
MOVZX EAX,AL
|
|
MOV success,EAX
|
|
POPAD
|
|
}
|
|
char* members = *(char**)(buffer + 0x1c);
|
|
wchar_t* room = *(wchar_t**)(buffer + 0x8);
|
|
wchar_t* admin = *(wchar_t**)(buffer + 0x4c);
|
|
|
|
out.members = new char[strlen(members) + 1];
|
|
memcpy(out.members, members, strlen(members) + 1);
|
|
|
|
out.chat_room = new wchar_t[wcslen(room) + 1];
|
|
wmemcpy(out.chat_room, room, wcslen(room) + 1);
|
|
|
|
out.admin = new wchar_t[wcslen(admin) + 1];
|
|
wmemcpy(out.admin, admin, wcslen(admin) + 1);
|
|
|
|
__asm {
|
|
LEA ECX,buffer
|
|
CALL free_chat_room_addr
|
|
}
|
|
return success;
|
|
}
|
|
|
|
int ChatRoomMgr::ModChatRoomMemberNickName(wchar_t* chat_room_id, wchar_t* wxid,
|
|
wchar_t* nick) {
|
|
int success = -1;
|
|
WeChatString chat_room(chat_room_id);
|
|
WeChatString self_wxid(wxid);
|
|
WeChatString new_nick(nick);
|
|
DWORD get_chat_room_mgr_addr = base_addr_ + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD mod_member_nick_name_addr =
|
|
base_addr_ + WX_MOD_CHAT_ROOM_MEMBER_NICK_NAME_OFFSET;
|
|
DWORD init_chat_msg_addr = base_addr_ + WX_INIT_CHAT_MSG_OFFSET;
|
|
__asm {
|
|
PUSHAD
|
|
CALL get_chat_room_mgr_addr
|
|
SUB ESP,0x14
|
|
MOV ECX,ESP
|
|
LEA EDI,new_nick
|
|
PUSH EDI
|
|
CALL init_chat_msg_addr
|
|
SUB ESP,0x14
|
|
LEA EAX,self_wxid
|
|
MOV ECX,ESP
|
|
PUSH EAX
|
|
CALL init_chat_msg_addr
|
|
SUB ESP,0x14
|
|
LEA EAX,chat_room
|
|
MOV ECX,ESP
|
|
PUSH EAX
|
|
CALL init_chat_msg_addr
|
|
CALL mod_member_nick_name_addr
|
|
MOVZX EAX,AL
|
|
MOV success,EAX
|
|
POPAD
|
|
}
|
|
return success;
|
|
}
|
|
|
|
int ChatRoomMgr::SetTopMsg(wchar_t* wxid, ULONG64 msg_id) {
|
|
int success = -1;
|
|
char chat_msg[0x2D8] = {0};
|
|
DWORD new_chat_msg_addr = base_addr_ + WX_NEW_CHAT_MSG_OFFSET;
|
|
DWORD get_chat_room_mgr_addr = base_addr_ + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD handle_top_msg_addr = base_addr_ + WX_TOP_MSG_OFFSET;
|
|
DWORD free_addr = base_addr_ + WX_FREE_CHAT_MSG_INSTANCE_COUNTER_OFFSET;
|
|
DWORD get_chat_mgr_addr = base_addr_ + WX_CHAT_MGR_OFFSET;
|
|
DWORD get_by_local_Id_addr = base_addr_ + WX_GET_MGR_BY_PREFIX_LOCAL_ID_OFFSET;
|
|
|
|
|
|
int db_index = 0;
|
|
int local_id = DB::GetInstance().GetLocalIdByMsgId(msg_id, db_index);
|
|
if (local_id < 1) {
|
|
return -2;
|
|
}
|
|
__asm{
|
|
PUSHAD
|
|
PUSHFD
|
|
LEA ECX,chat_msg
|
|
CALL new_chat_msg_addr
|
|
CALL get_chat_mgr_addr
|
|
PUSH dword ptr [db_index]
|
|
LEA ECX,chat_msg
|
|
PUSH dword ptr [local_id]
|
|
CALL get_by_local_Id_addr
|
|
ADD ESP,0x8
|
|
CALL get_chat_room_mgr_addr
|
|
PUSH 0x0
|
|
LEA EAX,chat_msg
|
|
PUSH EAX
|
|
CALL handle_top_msg_addr
|
|
MOV success,EAX
|
|
LEA ECX,chat_msg
|
|
PUSH 0x0
|
|
CALL free_addr
|
|
POPFD
|
|
POPAD
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
int ChatRoomMgr::RemoveTopMsg(wchar_t* chat_room_id, ULONG64 msg_id) {
|
|
int success = -1;
|
|
WeChatString chat_room(chat_room_id);
|
|
DWORD get_chat_room_mgr_addr = base_addr_ + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD new_chat_msg_addr = base_addr_ + WX_NEW_CHAT_MSG_OFFSET;
|
|
DWORD init_chat_msg_addr = base_addr_ + WX_INIT_CHAT_MSG_OFFSET;
|
|
DWORD remove_top_msg_addr = base_addr_ + WX_REMOVE_TOP_MSG_OFFSET;
|
|
|
|
__asm {
|
|
PUSHAD
|
|
CALL get_chat_room_mgr_addr
|
|
MOV EDI,dword ptr [msg_id]
|
|
LEA EAX,chat_room
|
|
MOV ESI,dword ptr [msg_id + 0x4]
|
|
SUB ESP,0x14
|
|
MOV ECX,ESP
|
|
PUSH EAX
|
|
CALL init_chat_msg_addr
|
|
PUSH ESI
|
|
PUSH EDI
|
|
CALL remove_top_msg_addr
|
|
MOV success,EAX
|
|
POPAD
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
std::wstring ChatRoomMgr::GetChatRoomMemberNickname(wchar_t* chat_room_id,
|
|
wchar_t* wxid) {
|
|
WeChatString chat_room(chat_room_id);
|
|
WeChatString member_id(wxid);
|
|
WeChatString nickname(NULL);
|
|
DWORD get_chat_room_mgr_addr = base_addr_ + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD get_nickname_addr = base_addr_ + WX_GET_MEMBER_NICKNAME_OFFSET;
|
|
DWORD contact_mgr_addr = base_addr_ + WX_CONTACT_MGR_OFFSET;
|
|
DWORD get_contact_addr = base_addr_ + WX_GET_CONTACT_OFFSET;
|
|
DWORD free_contact_addr = base_addr_ + WX_FREE_CONTACT_OFFSET;
|
|
__asm {
|
|
PUSHAD
|
|
PUSHFD
|
|
CALL get_chat_room_mgr_addr
|
|
LEA ECX,nickname
|
|
PUSH ECX
|
|
LEA ECX,member_id
|
|
PUSH ECX
|
|
LEA ECX,chat_room
|
|
PUSH ECX
|
|
MOV ECX,EAX
|
|
CALL get_nickname_addr
|
|
POPFD
|
|
POPAD
|
|
}
|
|
wstring name = L"";
|
|
if (nickname.ptr) {
|
|
name += wstring(nickname.ptr);
|
|
} else {
|
|
char buff[0x440] = {0};
|
|
__asm {
|
|
PUSHAD
|
|
PUSHFD
|
|
CALL contact_mgr_addr
|
|
LEA ECX,buff
|
|
PUSH ECX
|
|
LEA ECX,member_id
|
|
PUSH ECX
|
|
MOV ECX,EAX
|
|
CALL get_contact_addr
|
|
POPFD
|
|
POPAD
|
|
}
|
|
name += READ_WSTRING(buff, 0x6C);
|
|
|
|
__asm {
|
|
PUSHAD
|
|
PUSHFD
|
|
LEA ECX,buff
|
|
CALL free_contact_addr
|
|
POPFD
|
|
POPAD
|
|
}
|
|
}
|
|
return name;
|
|
}
|
|
|
|
int ChatRoomMgr::InviteMemberToChatRoom(wchar_t* chat_room_id, wchar_t** wxids, int len) {
|
|
int success = -1;
|
|
WeChatString chat_room(chat_room_id);
|
|
vector<WeChatString> members;
|
|
VectorInner* list = (VectorInner*)&members;
|
|
DWORD members_ptr = (DWORD)&list->start;
|
|
for (int i = 0; i < len; i++) {
|
|
WeChatString pwxid(wxids[i]);
|
|
members.push_back(pwxid);
|
|
}
|
|
DWORD get_chat_room_mgr_addr = base_addr_ + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD add_member_addr = base_addr_ + WX_ADD_MEMBER_TO_CHAT_ROOM_OFFSET;
|
|
DWORD init_chat_msg_addr = base_addr_ + WX_INIT_CHAT_MSG_OFFSET;
|
|
DWORD get_share_record_mgr_addr = base_addr_ + WX_SHARE_RECORD_MGR_OFFSET;
|
|
|
|
DWORD fn1 = base_addr_ + 0x7fa730;
|
|
DWORD fn2 = base_addr_ + 0x78d9a0;
|
|
DWORD fn3 = base_addr_ + 0x7fb6e0;
|
|
DWORD fn4 = base_addr_ + 0x755af0;
|
|
DWORD invite_addr = base_addr_ + 0xbd28a0;
|
|
|
|
DWORD sys_addr = (DWORD)GetModuleHandleA("win32u.dll") + 0x116C;
|
|
DWORD addr[2] = {sys_addr,0};
|
|
__asm {
|
|
PUSHAD
|
|
PUSHFD
|
|
CALL get_share_record_mgr_addr
|
|
LEA ECX,addr
|
|
PUSH ECX
|
|
MOV ECX,EAX
|
|
CALL fn1
|
|
CALL get_chat_room_mgr_addr
|
|
SUB ESP,0x8
|
|
LEA EAX,addr
|
|
MOV ECX,ESP
|
|
PUSH EAX
|
|
CALL fn2
|
|
SUB ESP,0x14
|
|
MOV ECX,ESP
|
|
LEA EAX,chat_room
|
|
PUSH EAX
|
|
CALL init_chat_msg_addr
|
|
MOV EAX,dword ptr[members_ptr]
|
|
PUSH EAX
|
|
CALL invite_addr
|
|
CALL get_share_record_mgr_addr
|
|
PUSH 0x0
|
|
PUSH 0x1
|
|
MOV ECX,EAX
|
|
CALL fn3
|
|
LEA ECX,addr
|
|
CALL fn4
|
|
POPFD
|
|
POPAD
|
|
}
|
|
success = 1;
|
|
return success;
|
|
|
|
}
|
|
|
|
} // namespace wxhelper
|