Помогите поменять процесс-родитель
Код:
//Импорт функций
function NtQueryInformationProcess(HProcess: CARDINAL; ProcessInformationClass: BYTE; ProcessInformation: POINTER; ProcessInformationLength: CARDINAL; ReturnLength: POINTER): CARDINAL; stdcall; external 'ntdll.dll' name 'NtQueryInformationProcess';
function NtCreateProcessEx(PHandleProcess: POINTER; DesiredAccess: CARDINAL; ObjectAttributes: POINTER; ParentProcess: CARDINAL; Flags: CARDINAL; SectionHandle: CARDINAL; DebugPort: CARDINAL; ExceptionPort: CARDINAL; InJob: BOOL): CARDINAL; stdcall; external 'ntdll.dll' name 'NtCreateProcessEx';
function NtCreateProcess(PHandleProcess: POINTER; DesiredAccess: CARDINAL; ObjectAttributes: POINTER; ParentProcess: CARDINAL; InheritObjectTable: BOOL; SectionHandle: CARDINAL; DebugPort: CARDINAL; ExceptionPort: CARDINAL): CARDINAL; stdcall; external 'ntdll.dll' name 'NtCreateProcess';
function NtSetInformationProcess(HProcess: CARDINAL; ProcessInformationClass: BYTE; ProcessInformation: POINTER; ProcessInformationLength: CARDINAL): CARDINAL; stdcall; external 'ntdll.dll' name 'NtSetInformationProcess';
const
ProcessBasicInformation = 0;
type
PROCESS_BASIC_INFORMATION = packed record
ExitStatus: CARDINAL;
PebBaseAddress: POINTER;
AffinityMask: CARDINAL;
BasePriority: CARDINAL;
uUniqueProcessId: CARDINAL;
uInheritedFromUniqueProcessId: CARDINAL;
end;
//Сам код
Err := CreateProcessW(ApplicationName, NIL, NIL, NIL, FALSE, CREATE_SUSPENDED, NIL, PWideChar(ExtractFileDir(ApplicationName)), SI, PI);
NtErr := NtQueryInformationProcess(PI.hProcess, ProcessBasicInformation, Addr(PBI), SizeOf(PBI), NIL);
if NtErr = NO_ERROR then Form1.Memo1.Lines.Add(IntToStr(PBI.uInheritedFromUniqueProcessId));
// На этом этапе всё нормально, я получаю в мемо PId процесса-родителя
PBI.uInheritedFromUniqueProcessId := 1372; // Это PId эксплорера на момент эксперимертов
NtErr := NtSetInformationProcess(PI.hProcess, ProcessBasicInformation, Addr(PBI), SizeOf(PBI));
// Вот тут ощибка 0хС0000003.
// Из апимонитора узнал что функция возвращает STATUS_INVALID_INFO_CLASS. Недопустимый параметр. Указанный класс сведений не является допустимым классом сведений для выбранного объекта
function NtQueryInformationProcess(HProcess: CARDINAL; ProcessInformationClass: BYTE; ProcessInformation: POINTER; ProcessInformationLength: CARDINAL; ReturnLength: POINTER): CARDINAL; stdcall; external 'ntdll.dll' name 'NtQueryInformationProcess';
function NtCreateProcessEx(PHandleProcess: POINTER; DesiredAccess: CARDINAL; ObjectAttributes: POINTER; ParentProcess: CARDINAL; Flags: CARDINAL; SectionHandle: CARDINAL; DebugPort: CARDINAL; ExceptionPort: CARDINAL; InJob: BOOL): CARDINAL; stdcall; external 'ntdll.dll' name 'NtCreateProcessEx';
function NtCreateProcess(PHandleProcess: POINTER; DesiredAccess: CARDINAL; ObjectAttributes: POINTER; ParentProcess: CARDINAL; InheritObjectTable: BOOL; SectionHandle: CARDINAL; DebugPort: CARDINAL; ExceptionPort: CARDINAL): CARDINAL; stdcall; external 'ntdll.dll' name 'NtCreateProcess';
function NtSetInformationProcess(HProcess: CARDINAL; ProcessInformationClass: BYTE; ProcessInformation: POINTER; ProcessInformationLength: CARDINAL): CARDINAL; stdcall; external 'ntdll.dll' name 'NtSetInformationProcess';
const
ProcessBasicInformation = 0;
type
PROCESS_BASIC_INFORMATION = packed record
ExitStatus: CARDINAL;
PebBaseAddress: POINTER;
AffinityMask: CARDINAL;
BasePriority: CARDINAL;
uUniqueProcessId: CARDINAL;
uInheritedFromUniqueProcessId: CARDINAL;
end;
//Сам код
Err := CreateProcessW(ApplicationName, NIL, NIL, NIL, FALSE, CREATE_SUSPENDED, NIL, PWideChar(ExtractFileDir(ApplicationName)), SI, PI);
NtErr := NtQueryInformationProcess(PI.hProcess, ProcessBasicInformation, Addr(PBI), SizeOf(PBI), NIL);
if NtErr = NO_ERROR then Form1.Memo1.Lines.Add(IntToStr(PBI.uInheritedFromUniqueProcessId));
// На этом этапе всё нормально, я получаю в мемо PId процесса-родителя
PBI.uInheritedFromUniqueProcessId := 1372; // Это PId эксплорера на момент эксперимертов
NtErr := NtSetInformationProcess(PI.hProcess, ProcessBasicInformation, Addr(PBI), SizeOf(PBI));
// Вот тут ощибка 0хС0000003.
// Из апимонитора узнал что функция возвращает STATUS_INVALID_INFO_CLASS. Недопустимый параметр. Указанный класс сведений не является допустимым классом сведений для выбранного объекта
Если подменить этот хендл на полученный при помощи OpenProcess то вызываемая программа вообще не запускается.
А CreateProcess возвращает ошибку.
Что посоветуете? Может можно как нибудь проще? Может можно как нибудь считать участок памяти где находится PROCESS_BASIC_INFORMATION, поменять там всё по своему усмотрению, и обратно записать?
Я не смог проверить такой вариант потому что не понимаю как вычислить адрес начала PROCESS_BASIC_INFORMATION.
вообщето в ядре венды есть два массива (для NT5, если выше то три) дескрипторов запущеных процессов (один список дескрипторов, второй - кто чей родитель (опять же для ХР)). Не знаю как это может помочь практически - но думаю что надо за этим лезть туды
Читал както статейку как на делфи выполнить код в ядре без драйвера, но там кода дохрена и данная задача не на столько важна чтоб разбираться со всем этим.
Хотел избавиться от необходимости внедрения длл в эксплорер