// WxDemo.cpp : 定义应用程序的入口点。
//
#include "framework.h" // MFC等头文件(Visual Studio创建MFC项目时自动生成的)
#include "WxDemo.h" // 我的项目头文件
#include <TlHelp32.h> // 操作线程想过的头文件
#include <stdio.h> //标准的io函数
#include "resource.h" // 自建的mfc资源文件
/**
* 根据进程名称得到进程id
*/
DWORD ProcessNameFindPID(LPCSTR ProcessName) {
//#include <TlHelp32.h>
//第一步获取系统进程快照
HANDLE allProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
PROCESSENTRY32 processInfo = { 0 };
processInfo.dwSize = sizeof(PROCESSENTRY32);
//第二步在快照里面比对进程名称
;
do {
if (strcmp(ProcessName, processInfo.szExeFile) == 0) {
return processInfo.th32ProcessID;
}
} while (Process32Next(allProcess, &processInfo));
}
VOID InjectDll() {
CHAR pathStr[0x100] = { "WxDemo.dll" };// 自己编写的dll
// 得到进程id
DWORD pid = ProcessNameFindPID("XMind.exe");
if (pid == 0) {
MessageBox(NULL, "获取进程id失败", "错误", 0);
return;
}
// 得到目标进程句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (NULL == hProcess)
{
MessageBox(NULL, "进程打开失败", "错误", 0);
return;
}
// 向目标进程分配一块空间
LPVOID dllAdress = VirtualAllocEx(hProcess, NULL, sizeof(pathStr), MEM_COMMIT, PAGE_READWRITE);
if (NULL == dllAdress)
{
MessageBox(NULL, "内存分配失败", "错误", 0);
return;
}
// 将dll的路径写入到目标进程的内存
if (WriteProcessMemory(hProcess, dllAdress, pathStr, strlen(pathStr), NULL) == 0)
{// 实际过程中会写入成功,但是不知到为什么会返回false
//MessageBox(NULL, "dll路径写入失败", "错误", 0);
//return;
}
//CHAR test[0x100] = { 0 };
//sprintf_s(test, "写入的地址为:%p", dllAdress);
//OutputDebugString(test);
HMODULE kernel32Adr = GetModuleHandle("Kernel32.dll");
LPVOID loadLibraryAdr = GetProcAddress(kernel32Adr, "LoadLibraryA");
HANDLE h = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)loadLibraryAdr, dllAdress, 0, NULL);
if (NULL == h)
{
MessageBox(NULL, "dll路径写入失败", "错误", 0);
return;
}
}
INT_PTR CALLBACK Dlgproc(
HWND hDlg,
UINT message,
WPARAM param1,
LPARAM param2
) {
switch (message)
{
case WM_INITDIALOG: {
MessageBox(NULL, "首次加载", "标题", 0);
break;
}
case WM_CLOSE: {
EndDialog(hDlg, 0);
}
case WM_COMMAND: {
if (InjectOK==param1) {
}
if (InjectClose == param1)
{
}
break;
}
}
return 0;
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(ID_MAIN), NULL, &Dlgproc);
return 0;
}
差点被气死, if (WriteProcessMemory(hProcess, dllAdress, pathStr, strlen(pathStr), NULL) == 0)后面不小心加了个分号,一时还看不出来,始终是返回失败,实际上是成功,只不过分号导致判断没啥用,导致直接进入代码块return了,哎,真是一个大坑
在实际测试过程中,发现注入微信会失败,应该是微信有做相应的处理。
这里我将例子改成了XMind.exe注入成功后在dll里面写函数就相当于XMind自己在执行自己的代码一样。