Ищу "горлышко", через которое при запуске проходят все пользовательские процессы (чтобы мониторить момент запуска в реальном времени).
Деассемблинг Kernel32.dll CreateProcessW привел меня через Ntdll.dll к INT2E #29.
Всвязи с этим вопрос: Все ли проги запускаются через это прерывание или сушествуют другие пути, которые мне придется перехватывать тоже?
Нет ли в ядре документированного, "штатного" способа поймать момент запуска приложения? (до того, как оно выполнит какой-либо код)
[Win32] Отследить запуск процессов R3 из ntoskrnl.exe?09.10.02 12:16 Автор: cb <cb> Статус: Member
> Нет ли в ядре документированного, "штатного" способа > поймать момент запуска приложения? (до того, как оно > выполнит какой-либо код)
может тебе подойдет это:
NTSTATUS
PsSetCreateProcessNotifyRoutine(
IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
IN BOOLEAN Remove
);
typedef
VOID
(*PCREATE_PROCESS_NOTIFY_ROUTINE)(
IN HANDLE ParentId,
IN HANDLE ProcessId,
IN BOOLEAN Create
);
в принципе можно перехватить
NTSYSAPI
NTSTATUS
NTAPI
ZwCreateProcess(
OUT PHANDLE phProcess,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN HANDLE hParentProcess,
IN BOOLEAN bInheritParentHandles,
IN HANDLE hSection OPTIONAL,
IN HANDLE hDebugPort OPTIONAL,
IN HANDLE hExceptionPort OPTIONAL
);
результат должен быть тем же...
cb.
[Win32] Как оттуда получить имя процесса?15.10.02 12:09 Автор: Zef <Alloo Zef> Статус: Elderman
PsGetCurrentProcess не катит, т.к, похоже выдает родительский процесс(во всяком случае путается).
пробовал PsReferenceObjectByHandle, но он валится, в лучшем случае требует указать какой-то недокументированный тип объекта (если вообще с хендлом процесса работает).
[Win32] Как оттуда получить имя процесса?15.10.02 14:42 Автор: cb <cb> Статус: Member
> PsGetCurrentProcess не катит, т.к, похоже выдает > родительский процесс(во всяком случае путается). > пробовал PsReferenceObjectByHandle, но он валится, в лучшем > случае требует указать какой-то недокументированный тип > объекта (если вообще с хендлом процесса работает).
откуда "оттуда"?
из PsSetCreateProcessNotifyRoutine или ZwCreateProcess?
в принципе получить имя стартового модуля процесса можно разными способами... попробуй так:
если пытаться получить имя модуля из hook-a ZwCreateProcess, то после успешного выполнения ZwCreateProcess, в твоем распоряжении оказывается HANDLE этого процесса, который можно использовать для получения дополнительной инфы о процессе:
NTSYSAPI
NTSTATUS
NTAPI
ZwQueryObject(
IN HANDLE ObjectHandle,
IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
OUT PVOID ObjectInformation,
IN ULONG ObjectInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
typedef enum _OBJECT_INFORMATION_CLASS {
ObjectBasicInformation,//0 Y N
ObjectNameInformation,//1 Y N
ObjectTypeInformation,//2 Y N
ObjectAllTypesInformation,//3 Y N
ObjectHandleInformation //4 Y Y
} OBJECT_INFORMATION_CLASS;
typedef struct _OBJECT_NAME_INFORMATION {//Information Class 1
UNICODE_STRING Name;
} OBJECT_NAME_INFORMATION,*POBJECT_NAME_INFORMATION;
---
если же пытаться получить эту информацию из PsSetCreateProcessNotifyRoutine то для получения HANDLE-а на процесс можно использовать ф-ю:
NTSYSAPI
NTSTATUS
NTAPI
ZwOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL
);
---
далее схема та же...
btw
сам я не пробовал получать имя процесса таким образом...
cb.
[Win32] получение именибдиректории и коммандной строки процесса по его хендлу16.10.02 23:21 Автор: beetle <beetle> Статус: Member
> Делаю так: > > void CreateProcessNotifyRoutine(IN HANDLE ParentId, IN > HANDLE ProcessId, IN BOOLEAN Create) > { > PEPROCESS curproc = NULL; > > PsLookupProcessByProcessId(ProcessId, curproc); > А надо так:
HANDLE ProcessId, IN BOOLEAN Create)
{
ULONG curproc;
PsLookupProcessByProcessId(ProcessId, (PEPROCESS*)&curproc);
Тока, вот бяка - указатель-то в контексте создаваемого процесса, а CreateProcessNotifyRoutine в родительском...
Как бы туда добраться? CreateProcessNotifyRoutine в ядреном драйвере так, что ReadProcessMemory мне оттуда не видно.
Как бы туда
[Win32] Это я глючу! И ведь никто не поправил...24.10.02 12:25 Автор: cb <cb> Статус: Member
> Тока, вот бяка - указатель-то в контексте создаваемого > процесса, а CreateProcessNotifyRoutine в родительском... > Как бы туда добраться? CreateProcessNotifyRoutine в ядреном > драйвере так, что ReadProcessMemory мне оттуда не видно. > Как бы туда
может я что-то подзабыл, но память на которую указывает PEPROCESS находится выше 0x80000000 и соответственно доступна из любого контекста...
cb.
[Win32] Ты прав, я еще раз глючу!25.10.02 07:49 Автор: Zef <Alloo Zef> Статус: Elderman
просто я забыл убрать отладочную "затычку", которая получала PEPROCESS через PsGetCurrentProcess (родительский естессно).
Сейчас сделал так: при старте процесса получаю имя вышеописанным способом, а при стопе - через PsGetCurrentProcess, т.к. PsLookupProcessByProcessId считает, что его уже нет.
[win32] peprocess, это че? pe-заголовок?26.10.02 13:07 Автор: Zef <Alloo Zef> Статус: Elderman Отредактировано 26.10.02 13:08 Количество правок: 1
> void CreateProcessNotifyRoutine(IN HANDLE ParentId, IN HANDLE ProcessId, IN BOOLEAN Create) > { > PEPROCESS curproc = NULL; > > PsLookupProcessByProcessId(ProcessId, curproc); > > а она мне вместо указателя - фигу!
перед PsLookupProcessByProcessId я бы проверил Create:
if (Create == TRUE)
PsLookupProcessByProcessId(ProcessId, curproc);
---
хотя может дело и не в этом...
какой NTSTATUS возвращает PsLookupProcessByProcessId?
cb.
[Win32] ZwQueryObject? В DDK help о нем ни слова...16.10.02 04:39 Автор: Zef <Alloo Zef> Статус: Elderman Отредактировано 16.10.02 04:43 Количество правок: 1
> и ZwOpenProcess то же! > Да, я юзаю PsSetCreateProcessNotifyRoutine так, что у меня > оба хендла (и "свой" и родительский) и ни одного > PEPROCESSа.
на всякий случай:
в PsSetCreateProcessNotifyRoutine приходят не HANDLE-ы процессов а их ID.
на счет функций не описанных в DDK:
к сожалению MS не предоставляет всей документации на native вызовы (частично она доступна за $$$)...
поэтому и издаются книги, подобные Native API Reference