Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3da32cce12 | ||
|
|
d1ce40c216 | ||
|
|
3cd6953920 | ||
|
|
83886fe464 | ||
|
|
826e504fb3 | ||
|
|
80718a2af5 | ||
|
|
aaada266df |
+1711
-1
File diff suppressed because it is too large
Load Diff
@@ -526,7 +526,7 @@ DWORD GetPIDForProcess(wchar_t* process)
|
||||
if (!hSnapshot) {
|
||||
return 0;
|
||||
}
|
||||
pe32.dwSize = sizeof(PROCESSENTRY32);
|
||||
pe32.dwSize = sizeof(PROCESSENTRY32W);
|
||||
for (working = Process32FirstW(hSnapshot, &pe32); working; working = Process32NextW(hSnapshot, &pe32))
|
||||
{
|
||||
if (!wcscmp(pe32.szExeFile, process))
|
||||
|
||||
+36
-10
@@ -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
|
||||
@@ -191,7 +186,7 @@ int AccountMgr::CheckLogin() {
|
||||
POPAD
|
||||
}
|
||||
if (service_addr) {
|
||||
success = *(DWORD *)(service_addr + 0x4C8);
|
||||
success = *(DWORD *)(service_addr + 0x4E0);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
@@ -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
|
||||
@@ -13,6 +13,8 @@ namespace wxhelper{
|
||||
int CheckLogin();
|
||||
|
||||
int Logout();
|
||||
|
||||
std::string GetQRCodeUrl();
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -71,6 +71,10 @@ 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_REVOKE_MSG,
|
||||
} WECHAT_HTTP_APIS,
|
||||
*PWECHAT_HTTP_APIS;
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -572,7 +572,58 @@ 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;
|
||||
}
|
||||
case WECHAT_REVOKE_MSG:{
|
||||
ULONG64 msg_id = GetULong64Param(j_param, "msgId");
|
||||
int success = g_context.misc_mgr->RevokeMsg(msg_id);
|
||||
json ret_data = {{"code", success}, {"result", "OK"}};
|
||||
ret = ret_data.dump();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
json ret_data = {{"result", "ERROR"}, {"msg", "not support api"}};
|
||||
ret = ret_data.dump();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -415,4 +415,45 @@ int MiscMgr::SearchContactNetScene(wchar_t *keyword,UserInfo ** user) {
|
||||
return success;
|
||||
}
|
||||
|
||||
int MiscMgr::RevokeMsg(ULONG64 msg_id){
|
||||
int success = -1;
|
||||
char chat_msg[0x2D8] = {0};
|
||||
DWORD new_chat_msg_addr = base_addr_ + WX_NEW_CHAT_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;
|
||||
DWORD revoke_msg_addr = base_addr_ + WX_REVOKE_MSG_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_mgr_addr
|
||||
LEA ECX,chat_msg
|
||||
PUSH ECX
|
||||
MOV ECX,EAX
|
||||
CALL revoke_msg_addr
|
||||
MOV success,EAX
|
||||
LEA ECX,chat_msg
|
||||
PUSH 0x0
|
||||
CALL free_addr
|
||||
POPFD
|
||||
POPAD
|
||||
}
|
||||
|
||||
return success;
|
||||
|
||||
}
|
||||
} // namespace wxhelper
|
||||
@@ -18,6 +18,7 @@ class MiscMgr :public BaseMgr{
|
||||
int GetVoice(ULONG64 msg_id, wchar_t* dir);
|
||||
int GetImgByName(wchar_t* file_path,wchar_t* save_dir);
|
||||
int SearchContactNetScene(wchar_t *keyword,UserInfo ** user);
|
||||
int RevokeMsg(ULONG64 msg_id);
|
||||
};
|
||||
} // namespace wxhelper
|
||||
|
||||
|
||||
@@ -37,8 +37,6 @@ int SendMessageMgr::SendText(wchar_t* wxid, wchar_t* msg) {
|
||||
POPFD
|
||||
POPAD
|
||||
}
|
||||
SPDLOG_INFO("SendText code = {}",success);
|
||||
SPDLOG_INFO("global log with source info");
|
||||
return success;
|
||||
}
|
||||
int SendMessageMgr::SendAtText(wchar_t* chat_room_id, wchar_t** wxids, int len,
|
||||
|
||||
+15
-3
@@ -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
|
||||
@@ -96,7 +98,8 @@
|
||||
#define WX_DOWNLOAD_VIDEO_IMG_OFFSET 0xd46c30
|
||||
|
||||
|
||||
|
||||
// revoke
|
||||
#define WX_REVOKE_MSG_OFFSET 0xbb6dc0
|
||||
|
||||
|
||||
// pat
|
||||
@@ -118,8 +121,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 +779,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
|
||||
Reference in New Issue
Block a user