劫持進程注入和遠程線程注入的區別就是? 遠程線程注入是向一個正在運行中的進程注入 而劫持進程注入則是自己打開一個進程(以掛起的方式)? 然后再進行注入的操作?
這樣做的原因是當進程在掛起的狀態時他的所有線程都是處于未啟用的階段? 這樣就可以避免目標進程的反注入線程的檢測 從而使得注入的操作成功率更高
void HackThreadInject(PCHAR szPath, PCHAR DeName)
{//第一步以掛起的形式打開目標進程STARTUPINFOA sta = { 0 }; //結構體成員全部初始化為0sta.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 }; //結構體成員全部初始化為0sta.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;}