#include<Windows.h>
char testTitle[]="XXXXXXXX.exe";
char testClass[]="XXXXXXXClass";
HWND windowHandle= FindWindowA(testClass, testTitle);
FindWindowA()中的参数
参数类型 | |||
---|---|---|---|
参数1 | lpClassName | 字符串 | 要获取的窗口的类名 |
参数2 | lpWindowName | 字符串 | 要获取的窗口的标题 |
返回值 | HWND | 窗口句柄 |
DWORD processID;
GetWindowThreadProcessId(windowHandle,&processID);
GetWindowThreadProcessId()的参数
参数类型 | |||
---|---|---|---|
参数1 | hWnd | 句柄 | 目标进程的窗口句柄 |
参数2 | lpdwProcessId | 地址 | 将获取到的PID值写入这个地址 |
返回值 | DWORD | 返回值为创建窗口的线程标识,也就是TID |
HANDLE threadHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, processID);
OpenProcess()的参数
参数类型 | |||
---|---|---|---|
参数1 | dwDesiredAccess | DWORD | 获取该进程的访问权限 |
参数2 | bInheritHandle | 布尔 | 表示所得到的进程句柄是否可以被继承 |
参数3 | dwProcessId | DWORD | 打开进程的PID值 |
返回值 | HANDLE | 如成功,返回值为指定进程的句柄。失败则返回NULL |
void* 目标内存空间 = VirtualAllocEx(threadHandle, NULL, 4 * 1024, MEM_COMMIT, 0x40/*PAGE_EXECUTE_READWRITE 内存属性*/);
VirtualAllocEx()的参数
参数类型 | |||
---|---|---|---|
参数1 | hProcess | HANDLE | 要在其中分配空间的进程的句柄 |
参数2 | lpAddress | LPVOID(地址) | 要获取的地址区域 |
参数3 | dwSize | SIZE_T | 要分配的内存大小 |
参数4 | flAllocationType | DWORD | 内存分配的类型 |
参数5 | flProtect | DWORD | 内存页保护 |
返回值 |
char DLLPath[]="XXXXXXXXXXXXX.dll"
WriteProcessMemory(threadHandle, 目标内存空间, DLLPath, 0x300, 0);
WriteProcessMemory()的参数
参数类型 | |||
---|---|---|---|
参数1 | hProcess | HANDLE(句柄) | 要写入的进程的句柄 |
参数2 | lpBaseAddress | LPVOID | 用来接收写入数据的地址 |
参数3 | lpBuffer | LPVOID | 写入数据的地址 |
参数4 | nSize | DWORD | 要写入的字节数 |
参数5 | lpNumberOfBytesWritten | LPDWORD | |
返回值 | 布尔 | 返回值非0即代表成功 |
CreateRemoteThread(threadHandle, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, 目标内存空间/*要注入的DLL*/, 0, 0);
CreateRemoteThread()的参数
参数类型 | |||
---|---|---|---|
参数1 | hProcess | 要被调用的目标进程 | |
参数2 | lpThreadAttributes | ||
参数3 | dwStackSize | ||
参数4 | lpStartAddress | 目标进程中,要被调用的函数的地址 | |
参数5 | lpParameter | 传给被调用的函数的参数 | |
参数6 | dwCreationFlags | ||
参数7 | lpThreadId | ||
返回值 | HANDLE | 成功返回新线程句柄,失败返回NULL |
LoadLibraryA //将DLL加载到调用进程,并获取模块的基址
```c++
#include <iostream>
#include <Windows.h>
char 要注入的DLL路径[] = R"(X:\XXXXXX\XXXX\XXXXXX\XXXX\XXXXXXXX\XXXXXXX.dll)";
int main()
{
char testTitle[] = R"(XXXXXXXXXXX.exe)";//R"()" 忽略括号内的转义字符
char testClass[] = "XXXXXXXXXXClass";
//在目标进程分配内存
//获取目标窗口的句柄
HWND windowHandle = FindWindowA(testClass, testTitle);
//获取目标进程的PID
DWORD processID = 0;
GetWindowThreadProcessId(windowHandle, &processID);
//获取目标进程的相应权限的进程句柄
HANDLE threadHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, processID);
//在目标进程分配内存空间
void* 目标内存空间 = VirtualAllocEx(threadHandle, NULL, 4 * 1024, MEM_COMMIT, 0x40/*PAGE_EXECUTE_READWRITE 内存属性*/);
printf("目标内存空间 DLL路径=%p \n", 目标内存空间);
//在目标进程写入代码
bool 写入结果 = WriteProcessMemory(threadHandle, 目标内存空间, 要注入的DLL路径, 0x300, 0);
printf("写入结果=%d\n", 写入结果);
//在目标进程调用写入的代码
CreateRemoteThread(threadHandle, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, 目标内存空间/*要注入的DLL*/, 0, 0);
getchar();//等待键盘输入,可以暂停在这里等待
}
```
原文:https://www.cnblogs.com/FstBlog/p/15019360.html