【PC微信探秘】用C++编写一个微信DLL注入器

// L007CInjector.cpp : 定义应用程序的入口点。
//
#include "framework.h"
#include "L007CInjector.h"
#include "resource1.h"
#include <string.h>
#include <TlHelp32.h>


INT_PTR CALLBACK DialogProc(_In_ HWND   hwndDlg, _In_ UINT   uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR    lpCmdLine, _In_ int nCmdShow)
{
	DialogBox(NULL, MAKEINTRESOURCE(IDD_MAIN), NULL, &DialogProc);
	return 0;
}

char DllFileName[] = "C:\\Users\\Visual Studio 2019\\Desktop\\L004CHookDll.dll";
DWORD strSize = strlen(DllFileName) + 1;

INT_PTR CALLBACK DialogProc(_In_ HWND   hwndDlg, _In_ UINT   uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_COMMAND:
		if (wParam == ID_INJECT)
		{
			wchar_t buff[0x100] = { 0 };
			DWORD weChatProcessID = 0;
			//1)	遍历系统中的进程,找到微信进程(CreateToolhelp32Snapshot、Process32Next)
			HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
			swprintf_s(buff, L"CreateToolhelp32Snapshot=%p", handle);
			OutputDebugString(buff);

			PROCESSENTRY32 processentry32 = { 0 };
			processentry32.dwSize = sizeof(PROCESSENTRY32);

			BOOL next = Process32Next(handle, &processentry32);
			while (next == TRUE)
			{
				if (wcscmp(processentry32.szExeFile, L"WeChat.exe") == 0)
				{
					weChatProcessID = processentry32.th32ProcessID;
					break;
				}
				next = Process32Next(handle, &processentry32);
			}
			if (weChatProcessID == 0)
			{
				MessageBox(NULL, L"没找到微信", L"错误", MB_OK);
				return 0;
			}

			//2)	打开微信进程,获得HANDLE(OpenProcess)。
			HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, weChatProcessID);
			if (hProcess == NULL)
			{
				MessageBox(NULL, L"打开微信进程失败", L"错误", MB_OK);
				return 0;
			}
			//3)	在微信进程中为DLL文件路径字符串申请内存空间(VirtualAllocEx)。
			LPVOID allocAddress = VirtualAllocEx(hProcess, NULL, strSize, MEM_COMMIT, PAGE_READWRITE);
			if (NULL == allocAddress)
			{
				MessageBox(NULL, L"分配内存空间失败", L"错误", MB_OK);
				return 0;
			}
			swprintf_s(buff, L"VirtualAllocEx=%p", allocAddress);
			OutputDebugString(buff);

			//4)	把DLL文件路径字符串写入到申请的内存中(WriteProcessMemory)
			BOOL result = WriteProcessMemory(hProcess, allocAddress, DllFileName, strSize, NULL);
			if (result == FALSE)
			{
				MessageBox(NULL, L"写入内存失败", L"错误", MB_OK);
				return 0;
			}

			//5)	从Kernel32.dll中获取LoadLibraryA的函数地址(GetModuleHandle、GetProcAddress)
			HMODULE hMODULE = GetModuleHandle(L"Kernel32.dll");
			FARPROC fARPROC = GetProcAddress(hMODULE, "LoadLibraryA");
			if (NULL == fARPROC)
			{
				MessageBox(NULL, L"查找LoadLibraryA失败", L"错误", MB_OK);
				return 0;
			}
			//6)	在微信中启动内存中指定了文件名路径的DLL(CreateRemoteThread)。
			//也就是调用DLL中的DllMain(以DLL_PROCESS_ATTACH为参数)。
			HANDLE hANDLE = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)fARPROC, allocAddress, 0, NULL);
			if (NULL == hANDLE)
			{
				MessageBox(NULL, L"启动远程线程失败", L"错误", MB_OK);
				return 0;
			}
		}

		break;
	case WM_CLOSE:
		EndDialog(hwndDlg, 0);
		break;
	default:
		break;
	}
	return FALSE;
}

示例来源:
网易云课堂《2019 PC 微信探秘》

交流QQ群:

456197310 PC微信HOOK逆向分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵庆明老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值