Impl SendXmlMessage
This commit is contained in:
+3
-2
@@ -11,8 +11,9 @@ WxCalls_t wxCalls = {
|
||||
/* Receive Message:
|
||||
Hook, call, type, self, id, msgXml, roomId, wxId, content */
|
||||
{ 0x550F4C, 0xA96350, 0x38, 0x3C, 0x184, 0x1EC, 0x48, 0x170, 0x70 },
|
||||
{ 0xBD780, 0x771980, 0x521640 }, // Send Image Message
|
||||
{ 0xC3B70, 0x771980, 0x3ED8C0 }, // Send File Message
|
||||
{ 0xBD780, 0x771980, 0x521640 }, // Send Image Message
|
||||
{ 0xC3B70, 0x771980, 0x3ED8C0 }, // Send File Message
|
||||
{ 0xB8A70, 0x3ED5E0, 0x107F00, 0x3ED7B0, 0x2386FE4 }, // Send xml message
|
||||
/* Get Contacts:
|
||||
Base, head, wxId, Code, Name, Gender, Country, Province, City*/
|
||||
{ 0x23668F4, 0x4C, 0x30, 0x44, 0x8C, 0x184, 0x1D0, 0x1E4, 0x1F8 },
|
||||
|
||||
+34
-2
@@ -234,6 +234,33 @@ bool func_send_file(char *path, char *receiver, uint8_t *out, size_t *len)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool func_send_xml(XmlMsg xml, uint8_t *out, size_t *len)
|
||||
{
|
||||
Response rsp = Response_init_default;
|
||||
rsp.func = Functions_FUNC_SEND_XML;
|
||||
rsp.which_msg = Response_status_tag;
|
||||
rsp.msg.status = 0;
|
||||
|
||||
if ((xml.content == NULL) || (xml.receiver == NULL)) {
|
||||
rsp.msg.status = -1;
|
||||
} else {
|
||||
string receiver(xml.receiver);
|
||||
string content(xml.content);
|
||||
string path(xml.path ? xml.path : "");
|
||||
uint32_t type = (uint32_t)xml.type;
|
||||
SendXmlMessage(receiver, content, path, type);
|
||||
}
|
||||
|
||||
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 void PushMessage()
|
||||
{
|
||||
static nng_socket msg_sock;
|
||||
@@ -417,7 +444,7 @@ static bool dispatcher(uint8_t *in, size_t in_len, uint8_t *out, size_t *out_len
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_DEBUG("Func: {}", (uint8_t)req.func);
|
||||
LOG_DEBUG("Func: {:#x} Data: {}", (uint8_t)req.func, in_len);
|
||||
switch (req.func) {
|
||||
case Functions_FUNC_IS_LOGIN: {
|
||||
LOG_DEBUG("[Functions_FUNC_IS_LOGIN]");
|
||||
@@ -464,6 +491,11 @@ static bool dispatcher(uint8_t *in, size_t in_len, uint8_t *out, size_t *out_len
|
||||
ret = func_send_file(req.msg.file.path, req.msg.file.receiver, out, out_len);
|
||||
break;
|
||||
}
|
||||
case Functions_FUNC_SEND_XML: {
|
||||
LOG_DEBUG("[Functions_FUNC_SEND_XML]");
|
||||
ret = func_send_xml(req.msg.xml, out, out_len);
|
||||
break;
|
||||
}
|
||||
case Functions_FUNC_ENABLE_RECV_TXT: {
|
||||
LOG_DEBUG("[Functions_FUNC_ENABLE_RECV_TXT]");
|
||||
ret = func_enable_recv_txt(out, out_len);
|
||||
@@ -527,7 +559,7 @@ static int RunServer()
|
||||
break;
|
||||
}
|
||||
|
||||
LOG_BUFFER(in, in_len);
|
||||
// LOG_BUFFER(in, in_len);
|
||||
if (dispatcher(in, in_len, gBuffer, &out_len)) {
|
||||
LOG_DEBUG("Send data length {}", out_len);
|
||||
// LOG_BUFFER(gBuffer, out_len);
|
||||
|
||||
+90
-10
@@ -9,12 +9,13 @@
|
||||
extern HANDLE g_hEvent;
|
||||
extern WxCalls_t g_WxCalls;
|
||||
extern DWORD g_WeChatWinDllAddr;
|
||||
extern string GetSelfWxid(); // Defined in spy.cpp
|
||||
|
||||
void SendTextMessage(string wxid, string msg, string atWxids)
|
||||
{
|
||||
char buffer[0x3B0] = { 0 };
|
||||
WxString_t txtMsg = { 0 };
|
||||
WxString_t txtWxid = { 0 };
|
||||
WxString_t wxMsg = { 0 };
|
||||
WxString_t wxWxid = { 0 };
|
||||
|
||||
// 发送消息Call地址 = 微信基址 + 偏移
|
||||
DWORD sendCallAddress = g_WeChatWinDllAddr + g_WxCalls.sendTextMsg;
|
||||
@@ -22,13 +23,13 @@ void SendTextMessage(string wxid, string msg, string atWxids)
|
||||
wstring wsWxid = String2Wstring(wxid);
|
||||
wstring wsMsg = String2Wstring(msg);
|
||||
|
||||
txtMsg.text = (wchar_t *)wsMsg.c_str();
|
||||
txtMsg.size = wsMsg.size();
|
||||
txtMsg.capacity = wsMsg.capacity();
|
||||
wxMsg.text = (wchar_t *)wsMsg.c_str();
|
||||
wxMsg.size = wsMsg.size();
|
||||
wxMsg.capacity = wsMsg.capacity();
|
||||
|
||||
txtWxid.text = (wchar_t *)wsWxid.c_str();
|
||||
txtWxid.size = wsWxid.size();
|
||||
txtWxid.capacity = wsWxid.capacity();
|
||||
wxWxid.text = (wchar_t *)wsWxid.c_str();
|
||||
wxWxid.size = wsWxid.size();
|
||||
wxWxid.capacity = wsWxid.capacity();
|
||||
|
||||
vector<WxString_t> vTxtAtWxids;
|
||||
if (!atWxids.empty()) {
|
||||
@@ -51,9 +52,9 @@ void SendTextMessage(string wxid, string msg, string atWxids)
|
||||
lea eax, vTxtAtWxids;
|
||||
push 0x01;
|
||||
push eax;
|
||||
lea edi, txtMsg;
|
||||
lea edi, wxMsg;
|
||||
push edi;
|
||||
lea edx, txtWxid;
|
||||
lea edx, wxWxid;
|
||||
lea ecx, buffer;
|
||||
call sendCallAddress;
|
||||
add esp, 0xC;
|
||||
@@ -173,3 +174,82 @@ void SendFileMessage(string wxid, string path)
|
||||
popad;
|
||||
}
|
||||
}
|
||||
|
||||
void SendXmlMessage(string receiver, string xml, string path, int type)
|
||||
{
|
||||
if (g_WeChatWinDllAddr == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 发送消息Call地址 = 微信基址 + 偏移
|
||||
DWORD sendXmlCall1 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call1;
|
||||
DWORD sendXmlCall2 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call2;
|
||||
DWORD sendXmlCall3 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call3;
|
||||
DWORD sendXmlCall4 = g_WeChatWinDllAddr + g_WxCalls.sendXml.call4;
|
||||
DWORD sendXmlParam = g_WeChatWinDllAddr + g_WxCalls.sendXml.param;
|
||||
|
||||
char buffer[0xFF0] = { 0 };
|
||||
char nullBuf[0x1C] = { 0 };
|
||||
WxString_t wxReceiver = { 0 };
|
||||
WxString_t wxXml = { 0 };
|
||||
WxString_t wxPath = { 0 };
|
||||
WxString_t wxNull = { 0 };
|
||||
WxString_t wxSender = { 0 };
|
||||
|
||||
wstring wsSender = String2Wstring(GetSelfWxid());
|
||||
wstring wsReceiver = String2Wstring(receiver);
|
||||
wstring wsXml = String2Wstring(xml);
|
||||
|
||||
wxReceiver.text = (wchar_t *)wsReceiver.c_str();
|
||||
wxReceiver.size = wsReceiver.size();
|
||||
wxReceiver.capacity = wsReceiver.capacity();
|
||||
|
||||
wxXml.text = (wchar_t *)wsXml.c_str();
|
||||
wxXml.size = wsXml.size();
|
||||
wxXml.capacity = wsXml.capacity();
|
||||
|
||||
wxSender.text = (wchar_t *)wsSender.c_str();
|
||||
wxSender.size = wsSender.size();
|
||||
wxSender.capacity = wsSender.capacity();
|
||||
|
||||
if (!path.empty()) {
|
||||
wstring wsPath = String2Wstring(path);
|
||||
wxPath.text = (wchar_t *)wsPath.c_str();
|
||||
wxPath.size = wsPath.size();
|
||||
wxPath.capacity = wsPath.capacity();
|
||||
}
|
||||
|
||||
DWORD sendtype = type;
|
||||
__asm {
|
||||
pushad;
|
||||
pushfd;
|
||||
lea ecx, buffer;
|
||||
call sendXmlCall1;
|
||||
mov eax, [sendtype];
|
||||
push eax;
|
||||
lea eax, nullBuf;
|
||||
lea edx, wxSender;
|
||||
push eax;
|
||||
lea eax, wxPath;
|
||||
push eax;
|
||||
lea eax, wxXml;
|
||||
push eax;
|
||||
lea edi, wxReceiver;
|
||||
push edi;
|
||||
lea ecx, buffer;
|
||||
call sendXmlCall2;
|
||||
add esp, 0x14;
|
||||
lea eax, wxNull;
|
||||
push eax;
|
||||
lea ecx, buffer;
|
||||
call sendXmlCall3;
|
||||
mov dl, 0x0;
|
||||
lea ecx, buffer;
|
||||
push sendXmlParam;
|
||||
push sendXmlParam;
|
||||
call sendXmlCall4;
|
||||
add esp, 0x8;
|
||||
popfd;
|
||||
popad;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,3 +7,4 @@ using namespace std;
|
||||
void SendTextMessage(string wxid, string msg, string atWxids);
|
||||
void SendImageMessage(string wxid, string path);
|
||||
void SendFileMessage(string wxid, string path);
|
||||
void SendXmlMessage(string receiver, string xml, string path, int type);
|
||||
|
||||
@@ -59,6 +59,14 @@ typedef struct RoomMember {
|
||||
DWORD call3;
|
||||
} RoomMember_t;
|
||||
|
||||
typedef struct Xml {
|
||||
DWORD call1;
|
||||
DWORD call2;
|
||||
DWORD call3;
|
||||
DWORD call4;
|
||||
DWORD param;
|
||||
} Xml_t;
|
||||
|
||||
typedef struct WxCalls {
|
||||
DWORD login; // 登录状态
|
||||
UserInfoCall_t ui; // 用户信息
|
||||
@@ -66,6 +74,7 @@ typedef struct WxCalls {
|
||||
RecvMsg_t recvMsg; // 接收消息
|
||||
Sendfile_t sendImg; // 发送图片
|
||||
Sendfile_t sendFile; // 发送文件
|
||||
Xml_t sendXml; // 发送XML
|
||||
Contact_t contact; // 获取联系人
|
||||
Sql_t sql; // 执行 SQL
|
||||
NewFriend_t anf; // 通过好友申请
|
||||
|
||||
Reference in New Issue
Block a user