Compare commits

...
Author SHA1 Message Date
hugy 826e504fb3 feat: 获取群成员详情 2023-05-27 11:27:39 +08:00
hugy 80718a2af5 feat: 新增邀请入群 2023-05-27 00:18:11 +08:00
hugy aaada266df feat: 根据502647092提供的偏移,新增登录二维码 2023-05-25 22:10:03 +08:00
10 changed files with 1910 additions and 12 deletions
+1711 -1
View File
File diff suppressed because it is too large Load Diff
+35 -9
View File
@@ -1,21 +1,16 @@
#include "pch.h"
#include "account_mgr.h"
#include "wechat_function.h"
using namespace std;
namespace wxhelper {
AccountMgr::AccountMgr(DWORD base):BaseMgr(base){
}
AccountMgr::~AccountMgr(){
}
AccountMgr::AccountMgr(DWORD base) : BaseMgr(base) {}
AccountMgr::~AccountMgr() {}
int AccountMgr::GetSelfInfo(SelfInfoInner &out) {
DWORD accout_service_addr = base_addr_ + WX_ACCOUNT_SERVICE_OFFSET;
DWORD get_app_save_addr = base_addr_ + WX_GET_APP_DATA_SAVE_PATH_OFFSET;
DWORD get_current_data_path_addr = base_addr_ + WX_GET_CURRENT_DATA_PATH_OFFSET;
DWORD get_current_data_path_addr =
base_addr_ + WX_GET_CURRENT_DATA_PATH_OFFSET;
DWORD service_addr = NULL;
__asm {
PUSHAD
@@ -215,4 +210,35 @@ int AccountMgr::Logout() {
return success;
}
/// @brief 根据 502647092 提供的偏移 获取二维码url
/// @return
std::string AccountMgr::GetQRCodeUrl() {
DWORD qr_code_login_addr = base_addr_ + WX_QR_CODE_LOGIN_MGR_OFFSET ;
DWORD get_qr_code_img_addr = base_addr_ + WX_GET_QR_CODE_IMAGE_OFFSET ;
DWORD temp;
__asm {
PUSHAD
PUSHFD
CALL qr_code_login_addr
MOV temp,EAX
POPFD
POPAD
}
std::string pre("https://weixin.qq.com/x/");
DWORD ptr = temp + 0x8;
DWORD len = *(DWORD*)(ptr+0x10);
if (*(DWORD *)(ptr) == 0) {
return std::string();
} else {
if( *(DWORD*) (temp+0x1c) > 0xf){
std::string suff(*(char **)ptr,len);
return pre + suff;
}else{
std::string suff((char *)ptr,len);
return pre + suff;
}
}
}
} // namespace wxhelper
+2
View File
@@ -13,6 +13,8 @@ namespace wxhelper{
int CheckLogin();
int Logout();
std::string GetQRCodeUrl();
};
}
+3
View File
@@ -71,6 +71,9 @@ typedef enum HTTP_API_ROUTE {
WECHAT_CONTACT_NAME,
WECHAT_ATTACH_DOWNLOAD,
WECHAT_GET_VOICE,
WECHAT_GET_QRCODE,
WECHAT_INVITE_MEMBERS,
WECHAT_GET_MEMBER_PROFILE,
} WECHAT_HTTP_APIS,
*PWECHAT_HTTP_APIS;
+61
View File
@@ -374,4 +374,65 @@ std::wstring ChatRoomMgr::GetChatRoomMemberNickname(wchar_t* chat_room_id,
}
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
+2
View File
@@ -23,6 +23,8 @@ class ChatRoomMgr:public BaseMgr {
std::wstring GetChatRoomMemberNickname(wchar_t* chat_room_id,
wchar_t* wxid);
int InviteMemberToChatRoom(wchar_t* chat_room_id, wchar_t** wxids,
int len);
};
} // namespace wxhelper
#endif
+38
View File
@@ -217,4 +217,42 @@ int ContactMgr::AddFriendByWxid(wchar_t *wxid,wchar_t* msg) {
}
return success;
}
int ContactMgr::GetContactByWxid(wchar_t *wxid,ContactProfile& profile){
int success = -1;
char buff[0x440] = {0};
WeChatString pri(wxid);
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 contact_mgr_addr
LEA ECX,buff
PUSH ECX
LEA ECX,pri
PUSH ECX
MOV ECX,EAX
CALL get_contact_addr
POPFD
POPAD
}
success = 0;
profile.wxid = READ_WSTRING(buff, 0x10);
profile.account = READ_WSTRING(buff, 0x24);
profile.v3 = READ_WSTRING(buff, 0x38);
profile.nickname = READ_WSTRING(buff, 0x6C);
profile.head_image = READ_WSTRING(buff, 0x110);
__asm {
PUSHAD
PUSHFD
LEA ECX,buff
CALL free_contact_addr
POPFD
POPAD
}
success = 1;
return success;
}
} // namespace wxhelper
+1
View File
@@ -15,6 +15,7 @@ class ContactMgr : public BaseMgr {
std::wstring GetContactOrChatRoomNickname(wchar_t* id);
int AddFriendByWxid(wchar_t* wxid,wchar_t* msg);
int VerifyApply(wchar_t *v3, wchar_t *v4,int permission);
int GetContactByWxid(wchar_t* wxid,ContactProfile& profile);
};
} // namespace wxhelper
+44
View File
@@ -572,7 +572,51 @@ string Dispatch(struct mg_connection *c, struct mg_http_message *hm) {
ret = ret_data.dump();
break;
}
case WECHAT_GET_QRCODE: {
string url = g_context.account_mgr->GetQRCodeUrl();
json ret_data = {{"code", 1}, {"result", "OK"},{"qrCodeUrl",url}};
ret = ret_data.dump();
break;
}
case WECHAT_INVITE_MEMBERS: {
wstring room_id = GetWStringParam(j_param, "chatRoomId");
vector<wstring> wxids = getArrayParam(j_param, "memberIds");
vector<wchar_t *> wxid_list;
for (unsigned int i = 0; i < wxids.size(); i++) {
wxid_list.push_back(WS2LPWS(wxids[i]));
}
int success = g_context.chat_room_mgr->InviteMemberToChatRoom(
WS2LPWS(room_id), wxid_list.data(), wxid_list.size());
json ret_data = {{"code", success}, {"result", "OK"}};
ret = ret_data.dump();
break;
}
case WECHAT_GET_MEMBER_PROFILE: {
wstring pri_id = GetWStringParam(j_param, "wxid");
ContactProfile profile;
int success =
g_context.contact_mgr->GetContactByWxid(WS2LPWS(pri_id),profile);
if(success==1){
json ret_data = {
{"code", success},
{"result", "OK"},
{"account", Utils::WstringToUTF8(profile.account)},
{"headImage", Utils::WstringToUTF8(profile.head_image)},
{"nickname", Utils::WstringToUTF8(profile.nickname)},
{"v3", Utils::WstringToUTF8(profile.v3)},
{"wxid", Utils::WstringToUTF8(profile.wxid)},
};
ret = ret_data.dump();
} else {
json ret_data = {{"result", "ok"}, {"code", success}};
ret = ret_data.dump();
}
break;
}
default:
json ret_data = {{"result", "ERROR"}, {"msg", "not support api"}};
ret = ret_data.dump();
break;
}
+13 -2
View File
@@ -25,6 +25,8 @@
#define WX_APP_MSG_MGR_OFFSET 0x76b8c0
// sendMessageMgr
#define WX_SEND_MESSAGE_MGR_OFFSET 0x768be0
// shareRecordMgr
#define WX_SHARE_RECORD_MGR_OFFSET 0x78d5f0
// setChatMsgValue
@@ -118,8 +120,9 @@
#define WX_ACCOUNT_SERVICE_OFFSET 0x769720
#define WX_GET_APP_DATA_SAVE_PATH_OFFSET 0xf3bbd0
#define WX_GET_CURRENT_DATA_PATH_OFFSET 0xc88120
#define WX_QR_CODE_LOGIN_MGR_OFFSET 0xaeab70
#define WX_GET_QR_CODE_IMAGE_OFFSET 0xcdb560
//forward
#define WX_FORWARD_MSG_OFFSET 0xce75a0
// send file
@@ -775,4 +778,12 @@ struct Unkown{
DWORD field5= 0;
DWORD field6= 0;
};
struct ContactProfile{
std::wstring wxid;
std::wstring account;
std::wstring v3;
std::wstring nickname;
std::wstring head_image;
};
#endif