SendFile.cpp 2.9 KB
Newer Older
L
ljc545w 已提交
1 2
#include "pch.h"

L
ljc545w 已提交
3
// 发送文件CALL1偏移
L
ljc545w 已提交
4
#define SendFileCall1Offset (0x549E0980 - 0x54270000)
L
ljc545w 已提交
5
// 发送文件CALL2偏移
L
ljc545w 已提交
6
#define SendFileCall2Offset (0x549E0980 - 0x54270000)
L
ljc545w 已提交
7
// 发送文件CALL3偏移
L
ljc545w 已提交
8
#define SendFileCall3Offset (0x5465D8C0 - 0x54270000)
L
ljc545w 已提交
9
// 发送文件CALL4偏移
L
ljc545w 已提交
10
#define SendFileCall4Offset (0x54698270 - 0x54270000)
L
ljc545w 已提交
11
// 发送文件参数偏移
L
ljc545w 已提交
12
#define SendFileParamsOffset (0x565D36B0 - 0x54270000)
L
ljc545w 已提交
13
// 清空缓存CALL偏移
L
ljc545w 已提交
14
#define DeleteSendFileCacheCallOffset (0x54327720 - 0x54270000)
L
ljc545w 已提交
15

L
ljc545w 已提交
16 17 18 19 20
/*
* 外部调用时传递的参数结构
* wxid:wxid的保存地址
* filepath:文件绝对路径的保存地址
*/
L
ljc545w 已提交
21 22 23 24 25
struct FileParamStruct {
	DWORD wxid;
	DWORD filepath;
};

L
ljc545w 已提交
26 27 28 29 30 31 32 33 34
/*
* 内存中使用的参数结构
* type:消息类型,文件消息为3
* buffer:文件绝对路径
* length:绝对路径字符数
* maxLength:绝对路径最大字节数
* fill:占位用空缓冲区
* WxFileStruct:默认构造函数
*/
L
ljc545w 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47 48
struct WxFileStruct {
	int type = 3;
	wchar_t* buffer;
	DWORD length;
	DWORD maxLength;
	char fill[0x34] = { 0 };

	WxFileStruct(wchar_t* pStr) {
		buffer = pStr;
		length = wcslen(pStr);
		maxLength = wcslen(pStr) * 2;
	}
};

L
ljc545w 已提交
49 50 51 52 53
/*
* 供外部调用的发送文件消息接口
* lpParamStruct:FileParamStruct类型结构体指针
* return:void
*/
L
ljc545w 已提交
54 55 56 57 58
void SendFileRemote(LPVOID lpParamStruct) {
	FileParamStruct* params = (FileParamStruct*)lpParamStruct;
	SendFile((WCHAR*)params->wxid, (WCHAR*)params->filepath);
}

L
ljc545w 已提交
59 60 61 62 63 64
/*
* 发送文件消息的具体实现
* receiver:接收人wxid
* FilePath:文件绝对路径
* return:void
*/
L
ljc545w 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
void __stdcall SendFile(wchar_t* receiver, wchar_t* FilePath) {
	WxBaseStruct pReceiver(receiver);
	WxBaseStruct pFilePath(FilePath);
	WxFileStruct esi_(FilePath);

	DWORD WeChatWinBase = GetWeChatWinBase();

	DWORD WxSendFileCall1 = WeChatWinBase + SendFileCall1Offset;
	DWORD WxSendFileCall2 = WeChatWinBase + SendFileCall2Offset;
	DWORD WxSendFileCall3 = WeChatWinBase + SendFileCall3Offset;
	DWORD WxSendFileCall4 = WeChatWinBase + SendFileCall4Offset;
	DWORD WxSendFileParams = WeChatWinBase + SendFileParamsOffset;
	DWORD DeleteSendFileCacheCall = WeChatWinBase + DeleteSendFileCacheCallOffset;

	char buffer[0x3B0] = { 0 };

	DWORD edi_ = pReceiver.length;
	DWORD ptrReceiver = (DWORD)pReceiver.buffer;

	DWORD tempecx = 0;

	__asm {
		pushad;
		pushfd;
		sub esp, 0x14;
		mov edi, esp;
		mov dword ptr ds : [edi] , 0x0;
		mov dword ptr ds : [edi + 0x4] , 0x0;
		mov dword ptr ds : [edi + 0x8] , 0x0;
		mov dword ptr ds : [edi + 0xC] , 0x0;
		mov dword ptr ds : [edi + 0x10] , 0x0;
L
ljc545w 已提交
96 97 98 99 100 101 102 103
		push 0x00DBE200;
		sub esp, 0x14;
		mov edi, esp;
		mov dword ptr ds : [edi] , 0x0;
		mov dword ptr ds : [edi + 0x4] , 0x0;
		mov dword ptr ds : [edi + 0x8] , 0x0;
		mov dword ptr ds : [edi + 0xC] , 0x0;
		mov dword ptr ds : [edi + 0x10] , 0x0;
L
ljc545w 已提交
104
		sub esp, 0x14;
L
ljc545w 已提交
105
		lea eax, pFilePath;
L
ljc545w 已提交
106 107 108 109
		mov ecx, esp;
		push eax;
		call WxSendFileCall1;
		sub esp, 0x14;
L
ljc545w 已提交
110
		lea eax, pReceiver;
L
ljc545w 已提交
111 112 113
		mov ecx, esp;
		push eax;
		call WxSendFileCall2;
L
ljc545w 已提交
114
		mov ecx, [WxSendFileParams];
L
ljc545w 已提交
115 116
		lea eax, buffer;
		push eax;
L
ljc545w 已提交
117
		call WxSendFileCall3;
L
ljc545w 已提交
118 119 120 121 122
		lea ecx, buffer;
		call DeleteSendFileCacheCall;
		popfd;
		popad;
	}
L
ljc545w 已提交
123
}