SendCard.cpp 1.9 KB
Newer Older
G
Gogs 已提交
1 2 3 4 5 6 7 8 9 10
#include "pch.h"

struct SendCardStruct {
	DWORD receiver;
	DWORD sharedwxid;
	DWORD nickname;
};

BOOL SendCard(wchar_t* receiver, wchar_t* sharedwxid, wchar_t* nickname) {
	if (!hProcess)
L
ljc545w 已提交
11
		return 1;
G
Gogs 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24
	DWORD WeChatRobotBase = GetWeChatRobotBase();
	DWORD dwId = 0;
	DWORD dwWriteSize = 0;
	SendCardStruct params;
	ZeroMemory(&params, sizeof(params));
	DWORD SendCardProcAddr = WeChatRobotBase + SendCardOffset;
	LPVOID receiveraddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
	LPVOID sharedwxidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
	LPVOID nicknameaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
	SendCardStruct* paramAndFunc = (SendCardStruct*)::VirtualAllocEx(hProcess, 0, sizeof(SendCardStruct), MEM_COMMIT, PAGE_READWRITE);
	if (!receiveraddr || !sharedwxidaddr || !nicknameaddr ||
		!paramAndFunc || !WeChatRobotBase)
	{
L
ljc545w 已提交
25
		return 1;
G
Gogs 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
	}
	if (receiveraddr)
		WriteProcessMemory(hProcess, receiveraddr, receiver, wcslen(receiver) * 2 + 2, &dwWriteSize);
	if (sharedwxidaddr)
		WriteProcessMemory(hProcess, sharedwxidaddr, sharedwxid, wcslen(sharedwxid) * 2 + 2, &dwWriteSize);
	if (nicknameaddr)
		WriteProcessMemory(hProcess, nicknameaddr, nickname, wcslen(nickname) * 2 + 2, &dwWriteSize);
	params.receiver = (DWORD)receiveraddr;
	params.sharedwxid = (DWORD)sharedwxidaddr;
	params.nickname = (DWORD)nicknameaddr;

	if (paramAndFunc)
		WriteProcessMemory(hProcess, paramAndFunc, &params, sizeof(params), &dwId);
	HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)SendCardProcAddr, (LPVOID)paramAndFunc, 0, &dwId);
	if (hThread) {
		WaitForSingleObject(hThread, INFINITE);
		CloseHandle(hThread);
	}
	VirtualFreeEx(hProcess, receiveraddr, 0, MEM_RELEASE);
	VirtualFreeEx(hProcess, sharedwxidaddr, 0, MEM_RELEASE);
	VirtualFreeEx(hProcess, nicknameaddr, 0, MEM_RELEASE);
	VirtualFreeEx(hProcess, paramAndFunc, 0, MEM_RELEASE);
L
ljc545w 已提交
48
	return 0;
G
Gogs 已提交
49
}