ntcreateuserprocess
От: seva.t  
Дата: 22.11.12 01:58
Оценка:
Кто нибудь знает параметры этого сисвызова?

Спасибо
Re: ntcreateuserprocess
От: McQwerty Россия  
Дата: 22.11.12 08:04
Оценка:
Здравствуйте, 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, не меняется).

Re: ntcreateuserprocess
От: x64 Россия  
Дата: 22.11.12 19:56
Оценка:
ST>Кто нибудь знает параметры этого сисвызова?

А зачем именно оно?
RtlCreateUserProcess() не подойдёт?
Re[2]: ntcreateuserprocess
От: seva.t  
Дата: 23.11.12 18:58
Оценка:
Здравствуйте, 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, не меняется).


Спасибо за обстоятельный ответ.
Re[2]: ntcreateuserprocess
От: seva.t  
Дата: 23.11.12 19:00
Оценка:
Здравствуйте, x64, Вы писали:

ST>>Кто нибудь знает параметры этого сисвызова?


x64>А зачем именно оно?

x64>RtlCreateUserProcess() не подойдёт?

Нет, нужно на уровне сисвызова.
Re[3]: ntcreateuserprocess
От: амдф Российская Империя http://hex.pp.ua/
Дата: 21.12.12 07:02
Оценка:
Здравствуйте, seva.t, Вы писали:

x64>>А зачем именно оно?

x64>>RtlCreateUserProcess() не подойдёт?

ST>Нет, нужно на уровне сисвызова.


Функция RtlCreateUserProcess() точно также располагается в ntdll.dll, как и Zw- и Nt- функции.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.