Здравствуйте, seva.t, Вы писали:
ST>Кто нибудь знает параметры этого сисвызова?
В сети нашлись кусочки, как я понимаю, полученные опытным путём:
typedef struct PROC_THREAD_NATIVE_ATTRIBUTE{
DWORD NativeAttributeId;
DWORD DataSize;
PVOID DataPointer;
DWORD OutLengthPointer;
}*PPROC_THREAD_NATIVE_ATTRIBUTE;
typedef struct PROC_THREAD_NATIVE_ATTRIBUTE_LIST{
DWORD Length;
PROC_THREAD_NATIVE_ATTRIBUTE Items[8]; //переменное количество, CreateProcessInternalW резервирует место для нескольких десятков элементов
}*PPROC_THREAD_NATIVE_ATTRIBUTE_LIST;
typedef struct _RTL_DRIVE_LETTER_CURDIR {
USHORT Flags;
USHORT Length;
ULONG TimeStamp;
UNICODE_STRING DosPath;
} RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR;
/*
typedef struct _RTL_USER_PROCESS_PARAMETERS {
ULONG MaximumLength;
ULONG Length;
ULONG Flags;
ULONG DebugFlags;
PVOID ConsoleHandle;
ULONG ConsoleFlags;
HANDLE StdInputHandle;
HANDLE StdOutputHandle;
HANDLE StdErrorHandle;
UNICODE_STRING CurrentDirectoryPath;
HANDLE CurrentDirectoryHandle;
UNICODE_STRING DllPath;
UNICODE_STRING ImagePathName;
UNICODE_STRING CommandLine;
PVOID Environment;
ULONG StartingPositionLeft;
ULONG StartingPositionTop;
ULONG Width;
ULONG Height;
ULONG CharWidth;
ULONG CharHeight;
ULONG ConsoleTextAttributes;
ULONG WindowFlags;
ULONG ShowWindowFlags;
UNICODE_STRING WindowTitle;
UNICODE_STRING DesktopName;
UNICODE_STRING ShellInfo;
UNICODE_STRING RuntimeData;
RTL_DRIVE_LETTER_CURDIR DLCurrentDirectory[0x20];
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
NTSTATUS __stdcall NtCreateUserProcess(PHANDLE hProcess, PHANDLE hThread, DWORD dwArg3, DWORD dwArg4,
POBJECT_ATTRIBUTES lpProcObjAttr, POBJECT_ATTRIBUTES lpThreadObjAttr, DWORD dwCreateProcessFlags, DWORD dwArg8,
PRTL_USER_PROCESS_PARAMETERS lpProcessParameters, PVOID lpArg10, PPROC_THREAD_NATIVE_ATTRIBUTE_LIST lpAttributeList);
Первые 8 аргументов идут парами процесс+поток: PHANDLE ProcessHandle,ThreadHandle; DWORD ProcessDesiredAccess,ThreadDesiredAccess; LPOBJECT_ATTRIBUTES ProcessObjectAttributes,ThreadObjectAttributes; DWORD ProcessFlags,ThreadFlags. У флагов, кстати, совсем другие значения, чем у флагов CreateProcess. Оставшиеся три — указатели на структуры. Предпоследняя немного отличается на входе и на выходе.
Первый dword должен быть равен размеру структуры 0x48,
второй — одна из констант enum PS_CREATE_STATE, на входе должен быть равен PsCreateInitialState = 0.
Дальше входная и выходная часть различаются. На входе в байте по смещению +8 учитываются только младшие два бита, самый младший означает "возвращать расширенную информацию" (если он сброшен, на выходе заполняется только константа из PS_CREATE_STATE), следующий означает "искать манифест в exe-шнике". В байте по смещению +9 тоже учитываются только младшие два бита, но как одно число, которое должно быть 0, 1 или 2 и соответствует тому, в каком объёме нужно читать данные из соответствующего ключа Image File Execution Options, буде таковой обнаружится: если 0, то читает всё, начиная с Debugger, и возвращает ошибку с целью перезапустить процесс при наличии значения; если 2, то игнорирует и Debugger, и LargePageDLLs. Слово по смещению +A — это запрещённые флаги в ImageCharacteristics из PE-заголовка (при обнаружении любого из этих флагов будет возвращена ошибка). Dword по смещению +C — права доступа, с которыми NtCreateUserProcess будет открывать файл exe-шника (NtCreateUserProcess от себя добавляет EXECUTE+SYNCHRONIZE).
На выходе dword по смещению +8 целиком посвящён флагам, из которых используются только младшие 4, остальное обнуляется. Флаги: ProtectedProcess, OverrideAddressSpace, DevOverrideEnable (это глобальный флаг), HasManifest.
+C: HANDLE ImageFileHandle; +10: HANDLE ImageSectionHandle; (+14 — padding, не меняется
+18: QWORD ProcessParametersRemotePtr; +20: не знаю; +24: ProcessParametersRemoteFlags; +28: QWORD PebRemotePtr; +30: DWORD Wow64PebRemotePtr; (+34 — padding, не меняется
+38: QWORD ManifestRemotePtr; +40: DWORD ManifestSize; (+44 — padding, не меняется).
Здравствуйте, McQwerty, Вы писали:
MQ>Здравствуйте, seva.t, Вы писали:
ST>>Кто нибудь знает параметры этого сисвызова?
MQ>В сети нашлись кусочки, как я понимаю, полученные опытным путём:
MQ>MQ>typedef struct PROC_THREAD_NATIVE_ATTRIBUTE{
MQ> DWORD NativeAttributeId;
MQ> DWORD DataSize;
MQ> PVOID DataPointer;
MQ> DWORD OutLengthPointer;
MQ>}*PPROC_THREAD_NATIVE_ATTRIBUTE;
MQ>typedef struct PROC_THREAD_NATIVE_ATTRIBUTE_LIST{
MQ> DWORD Length;
MQ> PROC_THREAD_NATIVE_ATTRIBUTE Items[8]; //переменное количество, CreateProcessInternalW резервирует место для нескольких десятков элементов
MQ>}*PPROC_THREAD_NATIVE_ATTRIBUTE_LIST;
MQ>typedef struct _RTL_DRIVE_LETTER_CURDIR {
MQ> USHORT Flags;
MQ> USHORT Length;
MQ> ULONG TimeStamp;
MQ> UNICODE_STRING DosPath;
MQ>} RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR;
MQ>/*
MQ>typedef struct _RTL_USER_PROCESS_PARAMETERS {
MQ> ULONG MaximumLength;
MQ> ULONG Length;
MQ> ULONG Flags;
MQ> ULONG DebugFlags;
MQ> PVOID ConsoleHandle;
MQ> ULONG ConsoleFlags;
MQ> HANDLE StdInputHandle;
MQ> HANDLE StdOutputHandle;
MQ> HANDLE StdErrorHandle;
MQ> UNICODE_STRING CurrentDirectoryPath;
MQ> HANDLE CurrentDirectoryHandle;
MQ> UNICODE_STRING DllPath;
MQ> UNICODE_STRING ImagePathName;
MQ> UNICODE_STRING CommandLine;
MQ> PVOID Environment;
MQ> ULONG StartingPositionLeft;
MQ> ULONG StartingPositionTop;
MQ> ULONG Width;
MQ> ULONG Height;
MQ> ULONG CharWidth;
MQ> ULONG CharHeight;
MQ> ULONG ConsoleTextAttributes;
MQ> ULONG WindowFlags;
MQ> ULONG ShowWindowFlags;
MQ> UNICODE_STRING WindowTitle;
MQ> UNICODE_STRING DesktopName;
MQ> UNICODE_STRING ShellInfo;
MQ> UNICODE_STRING RuntimeData;
MQ> RTL_DRIVE_LETTER_CURDIR DLCurrentDirectory[0x20];
MQ>} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
MQ>NTSTATUS __stdcall NtCreateUserProcess(PHANDLE hProcess, PHANDLE hThread, DWORD dwArg3, DWORD dwArg4,
MQ> POBJECT_ATTRIBUTES lpProcObjAttr, POBJECT_ATTRIBUTES lpThreadObjAttr, DWORD dwCreateProcessFlags, DWORD dwArg8,
MQ> PRTL_USER_PROCESS_PARAMETERS lpProcessParameters, PVOID lpArg10, PPROC_THREAD_NATIVE_ATTRIBUTE_LIST lpAttributeList);
MQ>
MQ>MQ>Первые 8 аргументов идут парами процесс+поток: PHANDLE ProcessHandle,ThreadHandle; DWORD ProcessDesiredAccess,ThreadDesiredAccess; LPOBJECT_ATTRIBUTES ProcessObjectAttributes,ThreadObjectAttributes; DWORD ProcessFlags,ThreadFlags. У флагов, кстати, совсем другие значения, чем у флагов CreateProcess. Оставшиеся три — указатели на структуры. Предпоследняя немного отличается на входе и на выходе.
MQ>Первый dword должен быть равен размеру структуры 0x48,
MQ>второй — одна из констант enum PS_CREATE_STATE, на входе должен быть равен PsCreateInitialState = 0.
MQ>Дальше входная и выходная часть различаются. На входе в байте по смещению +8 учитываются только младшие два бита, самый младший означает "возвращать расширенную информацию" (если он сброшен, на выходе заполняется только константа из PS_CREATE_STATE), следующий означает "искать манифест в exe-шнике". В байте по смещению +9 тоже учитываются только младшие два бита, но как одно число, которое должно быть 0, 1 или 2 и соответствует тому, в каком объёме нужно читать данные из соответствующего ключа Image File Execution Options, буде таковой обнаружится: если 0, то читает всё, начиная с Debugger, и возвращает ошибку с целью перезапустить процесс при наличии значения; если 2, то игнорирует и Debugger, и LargePageDLLs. Слово по смещению +A — это запрещённые флаги в ImageCharacteristics из PE-заголовка (при обнаружении любого из этих флагов будет возвращена ошибка). Dword по смещению +C — права доступа, с которыми NtCreateUserProcess будет открывать файл exe-шника (NtCreateUserProcess от себя добавляет EXECUTE+SYNCHRONIZE).
MQ>На выходе dword по смещению +8 целиком посвящён флагам, из которых используются только младшие 4, остальное обнуляется. Флаги: ProtectedProcess, OverrideAddressSpace, DevOverrideEnable (это глобальный флаг), HasManifest.
MQ>+C: HANDLE ImageFileHandle; +10: HANDLE ImageSectionHandle; (+14 — padding, не меняется
+18: QWORD ProcessParametersRemotePtr; +20: не знаю; +24: ProcessParametersRemoteFlags; +28: QWORD PebRemotePtr; +30: DWORD Wow64PebRemotePtr; (+34 — padding, не меняется
+38: QWORD ManifestRemotePtr; +40: DWORD ManifestSize; (+44 — padding, не меняется).
Спасибо за обстоятельный ответ.