mirror of
https://github.com/ttttupup/wxhelper.git
synced 2025-08-02 13:57:35 +08:00
185 lines
6.0 KiB
C++
185 lines
6.0 KiB
C++
#include "pch.h"
|
|
#include "chat_room.h"
|
|
|
|
#include "common.h"
|
|
|
|
#include "wechat_data.h"
|
|
#define WX_CHAT_ROOM_MGR_OFFSET 0x686e40
|
|
#define WX_GET_CHAT_ROOM_DETAIL_INFO_OFFSET 0xa70920
|
|
#define WX_NEW_CHAT_ROOM_INFO_OFFSET 0xd03ec0
|
|
#define WX_FREE_CHAT_ROOM_INFO_OFFSET 0x7226e0
|
|
#define WX_DEL_CHAT_ROOM_MEMBER_OFFSET 0xa668f0
|
|
#define WX_INIT_CHAT_MSG_OFFSET 0xdbcc40
|
|
#define WX_FREE_CHAT_MSG_OFFSET 0x651c40
|
|
#define WX_ADD_MEMBER_TO_CHAT_ROOM_OFFSET 0xa66400
|
|
#define WX_GET_MEMBER_FROM_CHAT_ROOM_OFFSET 0xa71650
|
|
#define WX_INIT_CHAT_ROOM_OFFSET 0xd01c30
|
|
#define WX_FREE_CHAT_ROOM_OFFSET 0xa79310
|
|
|
|
int GetChatRoomDetailInfo(wchar_t* chat_room_id, ChatRoomInfoInner& room_info) {
|
|
int success = 0;
|
|
WeChatString chat_room(chat_room_id);
|
|
DWORD base = GetWeChatWinBase();
|
|
DWORD get_chat_room_mgr_addr = base + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD get_chat_room_detail_addr = base + WX_GET_CHAT_ROOM_DETAIL_INFO_OFFSET;
|
|
DWORD create_chat_room_info_addr = base + WX_NEW_CHAT_ROOM_INFO_OFFSET;
|
|
DWORD free_chat_room_info_addr = base + WX_FREE_CHAT_ROOM_INFO_OFFSET;
|
|
char chat_room_info[0xA4] = {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
|
|
}
|
|
room_info.chat_room_id.ptr = *(wchar_t**)(chat_room_info + 0x4);
|
|
room_info.chat_room_id.length = *(DWORD*)(chat_room_info + 0x8);
|
|
room_info.chat_room_id.max_length = *(DWORD*)(chat_room_info + 0xC);
|
|
|
|
room_info.notice.ptr = *(wchar_t**)(chat_room_info + 0x18);
|
|
room_info.notice.length = *(DWORD*)(chat_room_info + 0x1C);
|
|
room_info.notice.max_length = *(DWORD*)(chat_room_info + 0x20);
|
|
|
|
room_info.admin.ptr = *(wchar_t**)(chat_room_info + 0x2C);
|
|
room_info.admin.length = *(DWORD*)(chat_room_info + 0x30);
|
|
room_info.admin.max_length = *(DWORD*)(chat_room_info + 0x34);
|
|
|
|
room_info.xml.ptr = *(wchar_t**)(chat_room_info + 0x50);
|
|
room_info.xml.length = *(DWORD*)(chat_room_info + 0x54);
|
|
room_info.xml.max_length = *(DWORD*)(chat_room_info + 0x58);
|
|
__asm {
|
|
PUSHAD
|
|
LEA ECX,chat_room_info
|
|
CALL free_chat_room_info_addr
|
|
POPAD
|
|
}
|
|
return success;
|
|
}
|
|
|
|
int 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 base = GetWeChatWinBase();
|
|
DWORD get_chat_room_mgr_addr = base + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD del_member_addr = base + WX_DEL_CHAT_ROOM_MEMBER_OFFSET;
|
|
DWORD init_chat_msg_addr = base + WX_INIT_CHAT_MSG_OFFSET;
|
|
__asm {
|
|
PUSHAD
|
|
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
|
|
POPAD
|
|
}
|
|
return success;
|
|
}
|
|
|
|
|
|
int AddMemberToChatRoom(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 base = GetWeChatWinBase();
|
|
DWORD get_chat_room_mgr_addr = base + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD add_member_addr = base + WX_ADD_MEMBER_TO_CHAT_ROOM_OFFSET;
|
|
DWORD init_chat_msg_addr = base + 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 GetMemberFromChatRoom(wchar_t* chat_room_id,ChatRoomInner & out){
|
|
int success = 0;
|
|
WeChatString chat_room(chat_room_id);
|
|
DWORD chat_room_ptr = (DWORD) &chat_room;
|
|
char buffer[0x1A0] = {0};
|
|
DWORD base = GetWeChatWinBase();
|
|
DWORD get_member_addr = base + WX_GET_MEMBER_FROM_CHAT_ROOM_OFFSET;
|
|
DWORD get_chat_room_mgr_addr = base + WX_CHAT_ROOM_MGR_OFFSET;
|
|
DWORD create_chat_room_addr = base + WX_INIT_CHAT_ROOM_OFFSET;
|
|
DWORD free_chat_room_addr = base + 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;
|
|
}
|