1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include <windows.h>
int main() { HANDLE hFakeParent = NULL; LPPROC_THREAD_ATTRIBUTE_LIST pAttrList = NULL;
do { hFakeParent = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 13244); if (!hFakeParent) break;
SIZE_T attrBufferSize = 0;
InitializeProcThreadAttributeList(NULL, 1, 0, &attrBufferSize);
pAttrList = (LPPROC_THREAD_ATTRIBUTE_LIST)malloc(attrBufferSize); if (!pAttrList) break;
if (!InitializeProcThreadAttributeList(pAttrList, 1, 0, &attrBufferSize)) break;
if (!UpdateProcThreadAttribute(pAttrList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &hFakeParent, sizeof(HANDLE), NULL, NULL)) break;
STARTUPINFOEXW si = { sizeof(STARTUPINFOEXW) }; si.lpAttributeList = pAttrList; PROCESS_INFORMATION pi = { 0 }; WCHAR szCMD[] = { L"mspaint.exe" }; BOOL ret = CreateProcessW(NULL, szCMD, NULL, NULL, FALSE, EXTENDED_STARTUPINFO_PRESENT, NULL, L"C:\\Windows\\System", (LPSTARTUPINFOW)&si, &pi); if (!ret) { std::wcerr << L"CreateProcessW failed, error: " << GetLastError() << std::endl; break; } CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } while (false);
if (hFakeParent) { CloseHandle(hFakeParent); hFakeParent = NULL; }
if (pAttrList) { DeleteProcThreadAttributeList(pAttrList); free(pAttrList); pAttrList = NULL; }
return 0; }
|