Impl send gif

This commit is contained in:
Changhua 2024-07-04 18:40:58 +08:00
parent 6ebdaf5f57
commit f76aed268e
2 changed files with 51 additions and 86 deletions

View File

@ -297,6 +297,30 @@ bool func_send_file(char *path, char *receiver, uint8_t *out, size_t *len)
return true; return true;
} }
bool func_send_emotion(char *path, char *receiver, uint8_t *out, size_t *len)
{
Response rsp = Response_init_default;
rsp.func = Functions_FUNC_SEND_EMOTION;
rsp.which_msg = Response_status_tag;
if ((path == NULL) || (receiver == NULL)) {
LOG_ERROR("Empty path or receiver.");
rsp.msg.status = -1;
} else {
SendEmotionMessage(receiver, path);
rsp.msg.status = 0;
}
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;
}
#if 0 #if 0
bool func_send_xml(XmlMsg xml, uint8_t *out, size_t *len) bool func_send_xml(XmlMsg xml, uint8_t *out, size_t *len)
{ {
@ -325,30 +349,6 @@ bool func_send_xml(XmlMsg xml, uint8_t *out, size_t *len)
return true; return true;
} }
bool func_send_emotion(char *path, char *receiver, uint8_t *out, size_t *len)
{
Response rsp = Response_init_default;
rsp.func = Functions_FUNC_SEND_EMOTION;
rsp.which_msg = Response_status_tag;
if ((path == NULL) || (receiver == NULL)) {
LOG_ERROR("Empty path or receiver.");
rsp.msg.status = -1;
} else {
SendEmotionMessage(receiver, path);
rsp.msg.status = 0;
}
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;
}
#endif #endif
bool func_send_rich_txt(RichText rt, uint8_t *out, size_t *len) bool func_send_rich_txt(RichText rt, uint8_t *out, size_t *len)
@ -910,15 +910,15 @@ static bool dispatcher(uint8_t *in, size_t in_len, uint8_t *out, size_t *out_len
ret = func_forward_msg(req.msg.fm.id, req.msg.fm.receiver, out, out_len); ret = func_forward_msg(req.msg.fm.id, req.msg.fm.receiver, out, out_len);
break; break;
} }
case Functions_FUNC_SEND_EMOTION: {
ret = func_send_emotion(req.msg.file.path, req.msg.file.receiver, out, out_len);
break;
}
#if 0 #if 0
case Functions_FUNC_SEND_XML: { case Functions_FUNC_SEND_XML: {
ret = func_send_xml(req.msg.xml, out, out_len); ret = func_send_xml(req.msg.xml, out, out_len);
break; break;
} }
case Functions_FUNC_SEND_EMOTION: {
ret = func_send_emotion(req.msg.file.path, req.msg.file.receiver, out, out_len);
break;
}
#endif #endif
case Functions_FUNC_ENABLE_RECV_TXT: { case Functions_FUNC_ENABLE_RECV_TXT: {
ret = func_enable_recv_txt(req.msg.flag, out, out_len); ret = func_enable_recv_txt(req.msg.flag, out, out_len);

View File

@ -26,6 +26,8 @@ extern string GetSelfWxid(); // Defined in spy.cpp
#define OS_SEND_RICH_TEXT 0x21A09C0 #define OS_SEND_RICH_TEXT 0x21A09C0
#define OS_SEND_PAT_MSG 0x2D669B0 #define OS_SEND_PAT_MSG 0x2D669B0
#define OS_FORWARD_MSG 0x238D350 #define OS_FORWARD_MSG 0x238D350
#define OS_GET_EMOTION_MGR 0x1C988D0
#define OS_SEND_EMOTION 0x227B9E0
typedef QWORD (*New_t)(QWORD); typedef QWORD (*New_t)(QWORD);
typedef QWORD (*Free_t)(QWORD); typedef QWORD (*Free_t)(QWORD);
@ -38,6 +40,8 @@ typedef QWORD (*SendFileMsg_t)(QWORD, QWORD, QWORD, QWORD, QWORD, QWORD *, QWORD
typedef QWORD (*SendRichTextMsg_t)(QWORD, QWORD, QWORD); typedef QWORD (*SendRichTextMsg_t)(QWORD, QWORD, QWORD);
typedef QWORD (*SendPatMsg_t)(QWORD, QWORD); typedef QWORD (*SendPatMsg_t)(QWORD, QWORD);
typedef QWORD (*ForwardMsg_t)(QWORD, QWORD, QWORD, QWORD); typedef QWORD (*ForwardMsg_t)(QWORD, QWORD, QWORD, QWORD);
typedef QWORD (*GetEmotionMgr_t)();
typedef QWORD (*SendEmotion_t)(QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD, QWORD);
void SendTextMessage(string wxid, string msg, string atWxids) void SendTextMessage(string wxid, string msg, string atWxids)
{ {
@ -205,6 +209,25 @@ int ForwardMessage(QWORD msgid, string receiver)
return status; return status;
} }
void SendEmotionMessage(string wxid, string path)
{
GetEmotionMgr_t GetEmotionMgr = (GetEmotionMgr_t)(g_WeChatWinDllAddr + OS_GET_EMOTION_MGR);
SendEmotion_t SendEmotion = (SendEmotion_t)(g_WeChatWinDllAddr + OS_SEND_EMOTION);
WxString *pWxPath = NewWxStringFromStr(path);
WxString *pWxWxid = NewWxStringFromStr(wxid);
QWORD *buff = (QWORD *)HeapAlloc(GetProcessHeap(), 0, 0x20);
if (buff == NULL) {
LOG_ERROR("Out of Memory...");
return;
}
memset(buff, 0, 0x20);
QWORD mgr = GetEmotionMgr();
SendEmotion(mgr, (QWORD)pWxPath, (QWORD)buff, (QWORD)pWxWxid, 2, (QWORD)buff, 0, (QWORD)buff);
}
#if 0 #if 0
void SendXmlMessage(string receiver, string xml, string path, int type) void SendXmlMessage(string receiver, string xml, string path, int type)
{ {
@ -271,62 +294,4 @@ void SendXmlMessage(string receiver, string xml, string path, int type)
popad; popad;
} }
} }
void SendEmotionMessage(string wxid, string path)
{
if (g_WeChatWinDllAddr == 0) {
return;
}
char buffer[0x1C] = { 0 };
wstring wsWxid = String2Wstring(wxid);
wstring wsPath = String2Wstring(path);
WxString wxWxid(wsWxid);
WxString wxPath(wsPath);
WxString nullbuffer;
// 发送文件Call地址 = 微信基址 + 偏移
DWORD sendCall1 = g_WeChatWinDllAddr + g_WxCalls.sendEmo.call1;
DWORD sendCall2 = g_WeChatWinDllAddr + g_WxCalls.sendEmo.call2;
DWORD sendCall3 = g_WeChatWinDllAddr + g_WxCalls.sendEmo.call3;
__asm {
pushad;
pushfd;
mov ebx, dword ptr[sendCall3];
lea eax, buffer;
push eax;
push 0x0;
sub esp, 0x14;
mov esi, esp;
mov dword ptr [esi], 0x0;
mov dword ptr [esi+0x4], 0x0;
mov dword ptr [esi+0x8], 0x0;
mov dword ptr [esi+0xC], 0x0;
mov dword ptr [esi+0x10], 0x0;
push 0x2;
lea eax, wxWxid;
sub esp, 0x14;
mov ecx, esp;
push eax;
call sendCall1;
sub esp, 0x14;
mov esi, esp;
mov dword ptr [esi], 0x0;
mov dword ptr [esi+0x4], 0x0;
mov dword ptr [esi+0x8], 0x0;
mov dword ptr [esi+0xC], 0x0;
mov dword ptr [esi+0x10], 0x0;
sub esp, 0x14;
mov ecx, esp;
lea eax, wxPath;
push eax;
call sendCall1;
mov ecx, ebx;
call sendCall2;
popfd;
popad;
}
}
#endif #endif