Fix At member for text message sending
This commit is contained in:
parent
813dac13cd
commit
53cf738e32
@ -76,7 +76,7 @@ int main()
|
|||||||
|
|
||||||
// 测试发送消息
|
// 测试发送消息
|
||||||
wprintf(L"测试发送消息\n");
|
wprintf(L"测试发送消息\n");
|
||||||
WxSendTextMsg(wxid, at_wxid, content);
|
WxSendTextMsg(wxid, content, at_wxid);
|
||||||
Sleep(1000); // 等待1秒
|
Sleep(1000); // 等待1秒
|
||||||
|
|
||||||
// 测试发送照片
|
// 测试发送照片
|
||||||
|
@ -47,8 +47,8 @@ interface ISpy
|
|||||||
typedef RpcTables_t **PPRpcTables;
|
typedef RpcTables_t **PPRpcTables;
|
||||||
|
|
||||||
int IsLogin();
|
int IsLogin();
|
||||||
int SendTextMsg([ in, string ] const wchar_t *wxid, [ in, string ] const wchar_t *at_wxid,
|
int SendTextMsg([ in, string ] const wchar_t *wxid, [ in, string ] const wchar_t *msg,
|
||||||
[ in, string ] const wchar_t *msg);
|
[ in, unique, string ] const wchar_t *atWxids);
|
||||||
int SendImageMsg([ in, string ] const wchar_t *wxid, [ in, string ] const wchar_t *path);
|
int SendImageMsg([ in, string ] const wchar_t *wxid, [ in, string ] const wchar_t *path);
|
||||||
int GetMsgTypes([out] int *pNum, [ out, size_is(, *pNum) ] PPRpcIntBstrPair *msgTypes);
|
int GetMsgTypes([out] int *pNum, [ out, size_is(, *pNum) ] PPRpcIntBstrPair *msgTypes);
|
||||||
int GetContacts([out] int *pNum, [ out, size_is(, *pNum) ] PPRpcContact *contacts);
|
int GetContacts([out] int *pNum, [ out, size_is(, *pNum) ] PPRpcContact *contacts);
|
||||||
|
@ -96,12 +96,12 @@ int RpcIsLogin()
|
|||||||
return loginFlag;
|
return loginFlag;
|
||||||
}
|
}
|
||||||
|
|
||||||
int RpcSendTextMsg(const wchar_t *wxid, const wchar_t *at_wxid, const wchar_t *msg)
|
int RpcSendTextMsg(const wchar_t *wxid, const wchar_t *msg, const wchar_t *atWxids)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
unsigned long ulCode = 0;
|
unsigned long ulCode = 0;
|
||||||
|
|
||||||
RpcTryExcept { ret = client_SendTextMsg(wxid, at_wxid, msg); }
|
RpcTryExcept { ret = client_SendTextMsg(wxid, msg, atWxids); }
|
||||||
RpcExcept(1)
|
RpcExcept(1)
|
||||||
{
|
{
|
||||||
ulCode = RpcExceptionCode();
|
ulCode = RpcExceptionCode();
|
||||||
|
@ -8,7 +8,7 @@ RPC_STATUS RpcDisconnectServer();
|
|||||||
int RpcEnableReceiveMsg();
|
int RpcEnableReceiveMsg();
|
||||||
int RpcDisableReceiveMsg();
|
int RpcDisableReceiveMsg();
|
||||||
int RpcIsLogin();
|
int RpcIsLogin();
|
||||||
int RpcSendTextMsg(const wchar_t *wxid, const wchar_t *at_wxid, const wchar_t *msg);
|
int RpcSendTextMsg(const wchar_t *wxid, const wchar_t *msg, const wchar_t *atWxids);
|
||||||
int RpcSendImageMsg(const wchar_t *wxid, const wchar_t *path);
|
int RpcSendImageMsg(const wchar_t *wxid, const wchar_t *path);
|
||||||
PPRpcIntBstrPair RpcGetMsgTypes(int *pNum);
|
PPRpcIntBstrPair RpcGetMsgTypes(int *pNum);
|
||||||
PPRpcContact RpcGetContacts(int *pNum);
|
PPRpcContact RpcGetContacts(int *pNum);
|
||||||
|
@ -51,8 +51,7 @@ int WxInitSDK()
|
|||||||
status = RpcIsLogin();
|
status = RpcIsLogin();
|
||||||
if (status == -1) {
|
if (status == -1) {
|
||||||
return status;
|
return status;
|
||||||
}
|
} else if (status == 1) {
|
||||||
else if (status == 1) {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Sleep(1000);
|
Sleep(1000);
|
||||||
@ -76,6 +75,7 @@ int WxEnableRecvMsg(const std::function<int(WxMessage_t)> &onMsg)
|
|||||||
if (onMsg) {
|
if (onMsg) {
|
||||||
HANDLE msgThread;
|
HANDLE msgThread;
|
||||||
g_cbReceiveTextMsg = onMsg;
|
g_cbReceiveTextMsg = onMsg;
|
||||||
|
|
||||||
msgThread = (HANDLE)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RpcEnableReceiveMsg, NULL, 0, NULL);
|
msgThread = (HANDLE)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RpcEnableReceiveMsg, NULL, 0, NULL);
|
||||||
if (msgThread == NULL) {
|
if (msgThread == NULL) {
|
||||||
printf("Failed to create innerWxRecvTextMsg.\n");
|
printf("Failed to create innerWxRecvTextMsg.\n");
|
||||||
@ -96,9 +96,9 @@ int WxDisableRecvMsg()
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int WxSendTextMsg(wstring wxid, wstring at_wxid, wstring msg)
|
int WxSendTextMsg(wstring wxid, wstring msg, wstring atWxids)
|
||||||
{
|
{
|
||||||
return RpcSendTextMsg(wxid.c_str(), at_wxid.c_str(), msg.c_str());
|
return RpcSendTextMsg(wxid.c_str(), msg.c_str(), atWxids.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
int WxSendImageMsg(wstring wxid, wstring path) { return RpcSendImageMsg(wxid.c_str(), path.c_str()); }
|
int WxSendImageMsg(wstring wxid, wstring path) { return RpcSendImageMsg(wxid.c_str(), path.c_str()); }
|
||||||
|
@ -41,7 +41,7 @@ int WxInitSDK();
|
|||||||
int WxDestroySDK();
|
int WxDestroySDK();
|
||||||
int WxEnableRecvMsg(const std::function<int(WxMessage_t)> &onMsg);
|
int WxEnableRecvMsg(const std::function<int(WxMessage_t)> &onMsg);
|
||||||
int WxDisableRecvMsg();
|
int WxDisableRecvMsg();
|
||||||
int WxSendTextMsg(wstring wxid, wstring at_wxid, wstring msg);
|
int WxSendTextMsg(wstring wxid, wstring msg, wstring vAtWxids);
|
||||||
int WxSendImageMsg(wstring wxid, wstring path);
|
int WxSendImageMsg(wstring wxid, wstring path);
|
||||||
ContactMap_t WxGetContacts();
|
ContactMap_t WxGetContacts();
|
||||||
MsgTypesMap_t WxGetMsgTypes();
|
MsgTypesMap_t WxGetMsgTypes();
|
||||||
|
@ -56,9 +56,9 @@ void server_DisableReceiveMsg()
|
|||||||
listenMsgFlag = false;
|
listenMsgFlag = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int server_SendTextMsg(const wchar_t *wxid, const wchar_t *at_wxid, const wchar_t *msg)
|
int server_SendTextMsg(const wchar_t *wxid, const wchar_t *msg, const wchar_t *atWxids)
|
||||||
{
|
{
|
||||||
SendTextMessage(wxid, at_wxid, msg);
|
SendTextMessage(wxid, msg, atWxids);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#include "framework.h"
|
#include "framework.h"
|
||||||
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "spy_types.h"
|
#include "spy_types.h"
|
||||||
|
|
||||||
@ -10,41 +12,75 @@ extern DWORD g_WeChatWinDllAddr;
|
|||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
void SendTextMessage(const wchar_t *wxid, const wchar_t *at_wxid, const wchar_t *msg)
|
typedef struct AtList {
|
||||||
{
|
DWORD start;
|
||||||
if (g_WeChatWinDllAddr == 0) {
|
DWORD end1;
|
||||||
return;
|
DWORD end2;
|
||||||
}
|
} AtList_t;
|
||||||
char buffer[0x5F0] = { 0 };
|
|
||||||
TextStruct_t txtWxid = { 0 };
|
void SendTextMessage(const wchar_t *wxid, const wchar_t *msg, const wchar_t *atWxids)
|
||||||
TextStruct_t txtAtWxid = { 0 };
|
{
|
||||||
TextStruct_t txtMsg = { 0 };
|
char buffer[0x3B0] = { 0 };
|
||||||
|
AtList_t atList = { 0 };
|
||||||
|
TextStruct_t txtMsg = { 0 };
|
||||||
|
TextStruct_t txtWxid = { 0 };
|
||||||
|
TextStruct_t *tsArray = NULL;
|
||||||
|
|
||||||
wstring wsWxid = wxid;
|
|
||||||
wstring wsAtWxid = at_wxid;
|
|
||||||
wstring wsMsg = msg;
|
wstring wsMsg = msg;
|
||||||
|
wstring wsWxid = wxid;
|
||||||
|
|
||||||
// 发送消息Call地址 = 微信基址 + 偏移
|
// 发送消息Call地址 = 微信基址 + 偏移
|
||||||
DWORD sendCallAddress = g_WeChatWinDllAddr + g_WxCalls.sendTextMsg;
|
DWORD sendCallAddress = g_WeChatWinDllAddr + g_WxCalls.sendTextMsg;
|
||||||
|
|
||||||
txtWxid.text = (wchar_t *)wsWxid.c_str();
|
|
||||||
txtWxid.size = wsWxid.size();
|
|
||||||
txtWxid.capacity = wsWxid.capacity();
|
|
||||||
|
|
||||||
txtMsg.text = (wchar_t *)wsMsg.c_str();
|
txtMsg.text = (wchar_t *)wsMsg.c_str();
|
||||||
txtMsg.size = wsMsg.size();
|
txtMsg.size = wsMsg.size();
|
||||||
txtMsg.capacity = wsMsg.capacity();
|
txtMsg.capacity = wsMsg.capacity();
|
||||||
|
|
||||||
__asm {
|
txtWxid.text = (wchar_t *)wsWxid.c_str();
|
||||||
lea edx, txtWxid
|
txtWxid.size = wsWxid.size();
|
||||||
lea edi, txtAtWxid
|
txtWxid.capacity = wsWxid.capacity();
|
||||||
lea ebx, txtMsg
|
|
||||||
push 0x01
|
wstring tmp = atWxids;
|
||||||
push edi
|
if (!tmp.empty()) {
|
||||||
push ebx
|
int i = 0;
|
||||||
|
wstring wstr;
|
||||||
|
vector<wstring> vAtWxids;
|
||||||
|
wstringstream wss(tmp);
|
||||||
|
while (wss.good()) {
|
||||||
|
getline(wss, wstr, L',');
|
||||||
|
vAtWxids.push_back(wstr);
|
||||||
|
}
|
||||||
|
tsArray = new TextStruct_t[vAtWxids.size() + 1];
|
||||||
|
// memset(tsArray, 0, (vAtWxids.size() + 1) * sizeof(TextStruct_t));
|
||||||
|
for (auto it = vAtWxids.begin(); it != vAtWxids.end(); it++) {
|
||||||
|
tsArray[i].text = (wchar_t *)it->c_str();
|
||||||
|
tsArray[i].size = it->size();
|
||||||
|
tsArray[i].capacity = it->capacity();
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
atList.start = (DWORD)tsArray;
|
||||||
|
atList.end1 = (DWORD)&tsArray[i];
|
||||||
|
atList.end2 = (DWORD)&tsArray[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
__asm
|
||||||
|
{
|
||||||
|
lea eax, atList;
|
||||||
|
push 0x01;
|
||||||
|
push eax;
|
||||||
|
lea edi, txtMsg;
|
||||||
|
push edi;
|
||||||
|
lea edx, txtWxid;
|
||||||
lea ecx, buffer;
|
lea ecx, buffer;
|
||||||
call sendCallAddress
|
call sendCallAddress;
|
||||||
add esp, 0xC
|
add esp, 0xC;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tsArray)
|
||||||
|
{
|
||||||
|
delete[] tsArray;
|
||||||
|
tsArray = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
void SendTextMessage(const wchar_t *wxid, const wchar_t *at_wxid, const wchar_t *msg);
|
void SendTextMessage(const wchar_t *wxid, const wchar_t *msg, const wchar_t *atWxids);
|
||||||
void SendImageMessage(const wchar_t *wxid, const wchar_t *path);
|
void SendImageMessage(const wchar_t *wxid, const wchar_t *path);
|
||||||
|
Loading…
Reference in New Issue
Block a user