#include <iostream>
#include <Windows.h>
void inJect(int pid,char* path)
{
//返回进程的句柄 PROCESS_ALL_ACCESS:获得所有权限 pid:进程id
HANDLE mHandle=OpenProcess(PROCESS_ALL_ACCESS, false,pid);
/**
在虚拟空间中分配内存,返回基址
HANDLE hProcess,
LPVOID lpAddress, 该指针为要分配的页面区域指定所需的起始地址。NULl:该函数确定将区域分配到的位置
SIZE_T dwSize, 要分配的内存区域的大小,以字节为单位
DWORD flAllocationType,MEM_COMMIT:为指定的保留内存页面分配内存费用(从内存的总大小和磁盘上的页面文件的总容量)。
DWORD flProtect, PAGE_READWRITE:启用对页面的提交区域的只读或读/写访问
申请一块内存给dll路径
*/
LPVOID rRternAddress=VirtualAllocEx(mHandle, NULL, strlen(path) + 1,MEM_COMMIT,PAGE_READWRITE);
/**
HANDLE hProcess, 要修改的过程存储器的句柄
LPVOID lpBaseAddress,指向指定过程的基地址的指针,数据将写入该过程中
LPCVOID lpBuffer,要写入的数据。
SIZE_T nSize, 要写入指定进程的字节数。
SIZE_T *lpNumberOfBytesWritten 指向变量的指针,该变量接收传输到指定进程中的字节数。
*/
WriteProcessMemory(mHandle, rRternAddress,path,strlen(path)+1,NULL);
//检索指定模块的模块句柄
HMODULE mModule = GetModuleHandleA("kernel32.dll");
//从指定的动态链接库(DLL)检索导出的函数或变量的地址。GetProcAddress:方法放回一个指向函数的指针。LoadLibraryA:将指定的模块加载到调用进程的地址空间中
LPTHREAD_START_ROUTINE lptheradStart=(LPTHREAD_START_ROUTINE)GetProcAddress(mModule, "LoadLibraryA");
//创建一个在另一个进程的虚拟地址空间中运行的线程。
//远程线程注入技术:强制创建一个目标进程的线程,将DLL加载进去
HANDLE hHANDLE=CreateRemoteThread(mHandle,NULL,0, lptheradStart, rRternAddress,0,NULL);
//等待hHANDLE 2000, INFINITE:一直等待
WaitForSingleObject(hHANDLE,2000);
/**
所有Handle都要关闭
防止内存泄露
*/
CloseHandle(mHandle);
CloseHandle(hHANDLE);
}
int main()
{
//PID 进程id
inJect(14828,(char*)"C:\\Users\\30302\\Desktop\\dllpath\\Dll1.dll");
std::cout << "Hello World!\n";
getchar();
return 0;
}