SendArticle.cpp 4.4 KB
Newer Older
G
Gogs 已提交
1 2
#include "pch.h"

L
ljc545w 已提交
3 4 5 6 7
#define SendArticleCall1Offset 0x0F7454F0 - 0x0F6B0000
#define SendArticleCall2Offset 0x0FA41F80 - 0x0F6B0000
#define SendArticleCall3Offset 0x0F7794A0 - 0x0F6B0000
#define SendArticleCall4Offset 0x0FA42150 - 0x0F6B0000
#define SendArticleParamOffset 0x118EEC34 - 0x0F6B0000
G
Gogs 已提交
8

L
ljc545w 已提交
9 10
#define SendArticleClearCacheCall1Offset 0x0FCEB4F0 - 0x0F6B0000
#define SendArticleClearCacheCall2Offset 0x0F744200 - 0x0F6B0000
G
Gogs 已提交
11

G
Gogs 已提交
12
struct SendArticleStruct {
L
ljc545w 已提交
13
	DWORD wxid;
G
Gogs 已提交
14 15 16 17 18
	DWORD title;
	DWORD abstract;
	DWORD url;
};

L
ljc545w 已提交
19 20 21 22 23 24 25 26
VOID SendArticleRemote(LPVOID lparameter) {
	SendArticleStruct* sas = (SendArticleStruct*)lparameter;
	wchar_t* wxid = (wchar_t*)sas->wxid;
	wchar_t* title = (wchar_t*)sas->title;
	wchar_t* abstract = (wchar_t*)sas->abstract;
	wchar_t* url = (wchar_t*)sas->url;
	SendArticle(wxid,title,abstract,url);
}
G
Gogs 已提交
27

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
DWORD GetSelfWxIdAddr() {
	DWORD baseAddr = GetWeChatWinBase() + 0x222EB3C;
	char wxidbuffer[0x100] = { 0 };
	DWORD SelfWxIdAddr = 0x0;
	sprintf_s(wxidbuffer, "%s", (char*)baseAddr);
	if (strlen(wxidbuffer) < 0x6 || strlen(wxidbuffer) > 0x14)
	{
		SelfWxIdAddr = *(DWORD*)baseAddr;
	}
	else
	{
		SelfWxIdAddr = baseAddr;
	}
	return SelfWxIdAddr;
}

L
ljc545w 已提交
44 45
BOOL __stdcall SendArticle(wchar_t* wxid,wchar_t* title, wchar_t* abstract, wchar_t* url) {
	DWORD WeChatWinBase = GetWeChatWinBase();
G
Gogs 已提交
46 47 48 49
	DWORD SendArticleCall1 = WeChatWinBase + SendArticleCall1Offset;
	DWORD SendArticleCall2 = WeChatWinBase + SendArticleCall2Offset;
	DWORD SendArticleCall3 = WeChatWinBase + SendArticleCall3Offset;
	DWORD SendArticleCall4 = WeChatWinBase + SendArticleCall4Offset;
G
Gogs 已提交
50

G
Gogs 已提交
51
	DWORD SendArticleParam = WeChatWinBase + SendArticleParamOffset;
G
Gogs 已提交
52

G
Gogs 已提交
53 54
	DWORD SendArticleClearCacheCall1 = WeChatWinBase + SendArticleClearCacheCall1Offset;
	DWORD SendArticleClearCacheCall2 = WeChatWinBase + SendArticleClearCacheCall2Offset;
L
ljc545w 已提交
55
	// 自己的wxid,发送者
56
	char* sselfwxid = (char*)GetSelfWxIdAddr();
G
Gogs 已提交
57 58
	wchar_t* wselfwxid = new wchar_t[strlen(sselfwxid) + 1];
	MultiByteToWideChar(CP_ACP, MB_COMPOSITE, sselfwxid, -1, wselfwxid, strlen(sselfwxid) + 1);
L
ljc545w 已提交
59
	// 构造xml数据
G
Gogs 已提交
60 61 62 63
	wchar_t* xmlbuffer = new wchar_t[0x2000];
	ZeroMemory(xmlbuffer, 0x2000 * 2);
	swprintf_s(xmlbuffer,0x2000, (wchar_t*)L"<msg>\n    <fromusername>%ws</fromusername>\n    <scene>0</scene>\n    <commenturl></commenturl>\n    <appmsg appid=\"\" sdkver=\"0\">\n        <title>%ws</title>\n        <des>%ws</des>\n        <action>view</action>\n        <type>5</type>\n        <showtype>0</showtype>\n        <content></content>\n        <url>%ws</url>\n        <dataurl></dataurl>\n        <lowurl></lowurl>\n        <lowdataurl></lowdataurl>\n        <recorditem>\n            <![CDATA[]]>\n        </recorditem>\n        <thumburl></thumburl>\n        <messageaction></messageaction>\n        <extinfo></extinfo>\n        <sourceusername></sourceusername>\n        <sourcedisplayname></sourcedisplayname>\n        <commenturl></commenturl>\n        <appattach>\n            <totallen>0</totallen>\n            <attachid></attachid>\n            <emoticonmd5></emoticonmd5>\n            <fileext></fileext>\n            <aeskey></aeskey>\n        </appattach>\n        <weappinfo>\n            <pagepath></pagepath>\n            <username></username>\n            <appid></appid>\n            <appservicetype>0</appservicetype>\n        </weappinfo>\n        <websearch />\n    </appmsg>\n    <appinfo>\n        <version>1</version>\n        <appname>Window wechat</appname>\n    </appinfo>\n</msg>",
		wselfwxid,title,abstract,url);
L
ljc545w 已提交
64

G
Gogs 已提交
65
	DWORD sendtype = 0x5;
L
ljc545w 已提交
66
	WxBaseStruct pSender(wselfwxid);
G
Gogs 已提交
67
	char nullbuffer[0x1C] = { 0 };
L
ljc545w 已提交
68 69 70 71
	WxBaseStruct pXml(xmlbuffer);
	WxBaseStruct pReceiver(wxid);
	WxString imgbuffer = { 0 };
	WxString nullStruct = { 0 };
L
ljc545w 已提交
72
	char buffer[0xF90] = { 0 };
G
Gogs 已提交
73 74 75 76
	DWORD isSuccess = 0x0;
	__asm {
		pushad;
		pushfd;
L
ljc545w 已提交
77 78
		lea ecx, buffer;
		call SendArticleCall1;
G
Gogs 已提交
79 80 81 82 83 84 85 86 87 88 89 90
		mov eax, [sendtype];
		push eax;
		lea eax, nullbuffer;
		lea edx, pSender;
		push eax;
		lea eax, imgbuffer;
		push eax;
		lea eax, pXml;
		push eax;
		lea edi, pReceiver;
		push edi;
		lea ecx, buffer;
L
ljc545w 已提交
91
		call SendArticleCall2;
G
Gogs 已提交
92
		add esp, 0x14;
L
ljc545w 已提交
93 94 95 96 97 98 99 100 101
		lea eax, nullStruct;
		push eax;
		lea ecx, buffer;
		call SendArticleCall3;
		mov dl, 0x0;
		lea ecx, buffer;
		push SendArticleParam;
		push SendArticleParam;
		call SendArticleCall4;
G
Gogs 已提交
102
		mov isSuccess, eax;
L
ljc545w 已提交
103 104 105 106 107
		add esp, 0x8;
		lea ecx, buffer;
		call SendArticleClearCacheCall1;
		lea ecx, buffer;
		call SendArticleClearCacheCall2;
G
Gogs 已提交
108 109 110 111 112 113 114
		popfd;
		popad;
	}
	delete[] xmlbuffer;
	xmlbuffer = NULL;
	delete[] wselfwxid;
	wselfwxid = NULL;
L
ljc545w 已提交
115
	return (isSuccess == 0x1);
G
Gogs 已提交
116
}