Не все описано в DDK... А в чем проблема, тебе же привели ф-ции с прототипами? Они экспортируются ntoskrnl.exe. если хочешь про них почитать, то есть книжка Герри Неббета, причем даже на русском...
Ищу "горлышко", через которое при запуске проходят все пользовательские процессы (чтобы мониторить момент запуска в реальном времени).
Деассемблинг 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