Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | | | | |
[Win32] Сенкс! Будем юзать... 20.10.02 06:43 Число просмотров: 1329
Автор: Zef <Alloo Zef> Статус: Elderman
|
|
<programming>
|
[Win32] Отследить запуск процессов R3 из ntoskrnl.exe? 09.10.02 07:22
Автор: Zef <Alloo Zef> Статус: Elderman
|
Ищу "горлышко", через которое при запуске проходят все пользовательские процессы (чтобы мониторить момент запуска в реальном времени).
Деассемблинг 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
|
PROCESS_BASIC_INFORMATION pbi;
ULONG ulReturnLength;
NTSTATUS lNtStatus = NtQueryInformationProcess(hProcess,ProcessBasicInformation,&pbi,sizeof(pbi),&ulReturnLength);
if(lNtStatus == STATUS_SUCCESS && ulReturnLength == sizeof(pbi)) {
char buf[128];
PROCESS_ENVIRONMENT_BLOCK peb;
BOOL bResult = ReadProcessMemory(hProcess,pbi.PebBaseAddress,&peb,sizeof(peb),&ulReturnLength);
PROCESS_PARAMETRS pp;
bResult = ReadProcessMemory(hProcess,peb.pi,&pp,sizeof(pp),ulReturnLength);
WCHAR sz_buf[_MAX_PATH];
bResult = ReadProcessMemory(hProcess,pp.CurrentDirectory.Buffer,sz_buf,sizeof(sz_buf),&ulReturnLength);
bResult = ReadProcessMemory(hProcess,pp.ApplicationName.Buffer,sz_buf,sizeof(sz_buf),&ulReturnLength);
bResult = ReadProcessMemory(hProcess,pp.CommandLine.Buffer,sz_buf,sizeof(sz_buf),&ulReturnLength);
if (bResult == 0) {
ERR
goto exit;
}
---
2 cb: все получилось=)) ошибка была в разыменовании указателя
|
| | | | |
[win32] process_environment_block где взять описание? 17.10.02 09:41
Автор: Zef <Alloo Zef> Статус: Elderman
|
|
| | | | | |
[Win32] пожалуйста 20.10.02 02:32
Автор: beetle <beetle> Статус: Member
|
//???????? ???
typedef struct _PROCESS_ENVIRONMENT_BLOCK
{
WORD unknown0;
WORD unknown1; // 0x02 ????, 1 - ?? ??? ???y???p??, 0 - ???
DWORD unknown2;
void *pImage; // 0x08 pImage - y???????? ?? ??p?? ?p??? ? ??????
HANDLE *handles; // 0x10 handle[6],handle[7],handle[8] - console
// stdin,stdout,stderr ?????? ??????. DLLlist
PPROCESS_PARAMETRS pi; // 0x14 y???????? ?? ??py??ypy, ?? ????p?? ???????????
// STARTUPINFO, ?? ??? ?????????? ?? STARTUPINFO
HANDLE hHeap; // 0x18 process heap
DWORD lock; // 0x1C ???
void *ack_lock; // 0x20 Acquire lock func
void *rel_lock; // 0x24 Release lock func
DWORD *lock_cnt; // 0x28 ??????? lock'??
void *user_cb; // 0x2C y???????? ?? ?y????? Callback ????????p?
// KiUserCallbacksDispatcher(n) ???????? user_sb[n]();
HANDLE *heaps; // 0x88 heaps ?p??????
//CRITICAL_SECTION *cs; // 0xA0 y???????? ?? crit. sect.
void *cs;
DWORD ver; // 0xB0 ??p??? ?p?????? ??
} PROCESS_ENVIRONMENT_BLOCK, *PPROCESS_ENVIRONMENT_BLOCK;
typedef PROCESS_ENVIRONMENT_BLOCK PEB, *PPEB;
|
| | | | | | | |
[Win32] Сенкс! Будем юзать... 20.10.02 06:43
Автор: Zef <Alloo Zef> Статус: Elderman
|
|
| | | | | | | | |
[Win32] cb принимай благодарность за хороший ресурс=)))) 20.10.02 13:44
Автор: beetle <beetle> Статус: Member
|
|
| | | | | | | | |
[Win32] PsLookupProcessByProcessId глючит 20.10.02 13:08
Автор: Zef <Alloo Zef> Статус: Elderman
|
Делаю так:
void CreateProcessNotifyRoutine(IN HANDLE ParentId, IN HANDLE ProcessId, IN BOOLEAN Create)
{
PEPROCESS curproc = NULL;
PsLookupProcessByProcessId(ProcessId, curproc);
а она мне вместо указателя - фигу!
Хотя в ntps-е, с которого я это драл так же. И ПИД валидный.
|
| | | | | | | | | |
[Win32] Это я глючу! И ведь никто не поправил... 24.10.02 10:53
Автор: Zef <Alloo Zef> Статус: Elderman
|
> Делаю так: > > 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
|
если да, то почему он сидит выше 0х80000000? И весь ли он там?
Если нет - то где найти его описание?
|
| | | | | | | | | | | | | |
[win32] peprocess, это че? pe-заголовок? 28.10.02 10:10
Автор: cb <cb> Статус: Member
|
> если да, то почему он сидит выше 0х80000000? И весь ли он > там?
нет это не PE header, это структура executive подсистеммы ядра содержащая описание процесса.
> Если нет - то где найти его описание?
например здесь:
http://www.acc.umu.se/~bosse
http://www.acc.umu.se/~bosse/ntifs.h
cb.
|
| | | | | | | | | | | | | | |
[Win32]Классный линк! интересно, что 28.10.02 11:52
Автор: Zef <Alloo Zef> Статус: Elderman
|
google на PEPROCESS мне его не выдал. Он вообще ничего не нашел...
|
| | | | | | | | | |
[Win32] PsLookupProcessByProcessId глючит 21.10.02 10:05
Автор: cb <cb> Статус: Member
|
> 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а.
|
| | | | |
[Win32] ZwQueryObject? В DDK help о нем ни слова... 18.10.02 10:48
Автор: cb <cb> Статус: Member
|
> и ZwOpenProcess то же! > Да, я юзаю PsSetCreateProcessNotifyRoutine так, что у меня > оба хендла (и "свой" и родительский) и ни одного > PEPROCESSа.
на всякий случай:
в PsSetCreateProcessNotifyRoutine приходят не HANDLE-ы процессов а их ID.
на счет функций не описанных в DDK:
к сожалению MS не предоставляет всей документации на native вызовы (частично она доступна за $$$)...
поэтому и издаются книги, подобные Native API Reference
cb.
|
|
|