注入简单来说就是让别人的程序执行 你想要让他执行的dll
#include<iostream>
#include<Windows.h>
using namespace std;
char szBuffer[] ="C:\\Users\\20622\\source\\repos\\Dll1\\Debug\\test.dll"; //dll路径
void RemoteThreadInject(DWORD Pid,PCHAR szPath)
{
HANDLE hProcess = 0;
DWORD dSizeofszPath = strlen(szPath) + 1;
LPVOID pDllPath;
HANDLE hThread = 0;
//第一步打开指定进程获取到指定进程的句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, Pid);
if (!hProcess)
{
cout << "OpenProcess error" << GetLastError() << endl;
return;
}
//第二步在指定进程分配内存
pDllPath = VirtualAllocEx(hProcess, NULL, dSizeofszPath, MEM_COMMIT, PAGE_READWRITE);
if (!pDllPath)
{
cout << "VirtualAllocEx error" << GetLastError() << endl;
return;
}
//第三步在分配出来的内存地址 写入loadlibiary的参数
if (!WriteProcessMemory(hProcess, pDllPath, szPath, dSizeofszPath, NULL))
{
cout << "WriteProcessMemory error" << GetLastError() << endl;
return;
}
//第四步创建远程线程
hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, pDllPath, 0, NULL);
if (!hThread)
{
cout << "CreateRemoteThread error" << GetLastError() << endl;
return;
}
}
int main()
{
RemoteThreadInject(25804, szBuffer);
}
第一步 使用OpenProcess获取目标进程的句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, Pid);
if (!hProcess)
{
cout << "OpenProcess error" << GetLastError() << endl;
return;
}
第二步 使用VirtualAllocEx在指定的进程分配内存
pDllPath = VirtualAllocEx(hProcess, NULL, dSizeofszPath, MEM_COMMIT, PAGE_READWRITE);
if (!pDllPath)
{
cout << "VirtualAllocEx error" << GetLastError() << endl;
return;
}
第三步 使用WriteProcessMemory函数在指定进程写入LoadLibiary的参数pDllPath
if (!WriteProcessMemory(hProcess, pDllPath, szPath, dSizeofszPath, NULL))
{
cout << "WriteProcessMemory error" << GetLastError() << endl;
return;
}
第四步 使用CreateRemoteThread线程创建远程线程运行LoadLibiary函数
他和CreateThread的区别就是三个参数的形式
这里要注意一下为什么在我们的进程可以直接使用LoadLibiary的地址呢 因为这个地址是所有进程共享来的 我们得到的地址和他的地址是一样的
hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, pDllPath, 0, NULL);
if (!hThread)
{
cout << "CreateRemoteThread error" << GetLastError() << endl;
return;
}