劫持进程注入和远程线程注入的区别就是 远程线程注入是向一个正在运行中的进程注入 而劫持进程注入则是自己打开一个进程(以挂起的方式) 然后再进行注入的操作
这样做的原因是当进程在挂起的状态时他的所有线程都是处于未启用的阶段 这样就可以避免目标进程的反注入线程的检测 从而使得注入的操作成功率更高
void HackThreadInject(PCHAR szPath, PCHAR DeName)
{
//第一步以挂起的形式打开目标进程
STARTUPINFOA sta = { 0 }; //结构体成员全部初始化为0
sta.cb = sizeof(STARTUPINFO); //记得赋值大小
PROCESS_INFORMATION pri = { 0 };
BOOL proc = CreateProcessA(
DeName,
NULL,
NULL,
NULL,
NULL,
CREATE_SUSPENDED,
NULL,
NULL,
&sta,
&pri //句柄会传入到这个结构体
);
if (!proc)
{
return;
}
//第二步在目标进程分配内存 用于写入loadlibrary的参数
LPVOID lpAlloc = VirtualAllocEx(pri.hProcess, NULL, strlen(szPath) + 1, MEM_COMMIT, PAGE_READWRITE);
if (!lpAlloc)
{
return;
}
//第三步 向刚分配出来的内存分配参数
BOOL bWrite = WriteProcessMemory(pri.hProcess, lpAlloc, szPath, strlen(szPath) + 1, NULL);
if (!bWrite)
{
return;
}
//第四步创建远程线程开始注入
HANDLE hRemoteThread = CreateRemoteThread(pri.hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, lpAlloc, 0, NULL);
if (!hRemoteThread)
{
cout << "CreateRemoteThread error" << GetLastError() << endl;
return;
}
}
第用CreateProcessA函数以挂起的状态打开我们的目标进程
注意目标的进程句柄会通过PROCESS_INFORMATION这个结构体传递
CREATE_SUSPENDED是挂起的方式打开进程
//第一步以挂起的形式打开目标进程
STARTUPINFOA sta = { 0 }; //结构体成员全部初始化为0
sta.cb = sizeof(STARTUPINFO); //记得赋值大小
PROCESS_INFORMATION pri = { 0 };
BOOL proc = CreateProcessA(
DeName,
NULL,
NULL,
NULL,
NULL,
CREATE_SUSPENDED,
NULL,
NULL,
&sta,
&pri //句柄会传入到这个结构体
);
第二步 使用VirtualAllocEx在目标进程分配内存
//第二步在目标进程分配内存 用于写入loadlibrary的参数
LPVOID lpAlloc = VirtualAllocEx(pri.hProcess, NULL, strlen(szPath) + 1, MEM_COMMIT, PAGE_READWRITE);
if (!lpAlloc)
{
return;
}
第三步使用WriteProcessMemory向目标进程写入参数
BOOL bWrite = WriteProcessMemory(pri.hProcess, lpAlloc, szPath, strlen(szPath) + 1, NULL);
if (!bWrite)
{
return;
}
第四步使用CreateRemoteThread开启远程线程注入
HANDLE hRemoteThread = CreateRemoteThread(pri.hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, lpAlloc, 0, NULL);
if (!hRemoteThread)
{
cout << "CreateRemoteThread error" << GetLastError() << endl;
return;
}