информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медЗа кого нас держат?Атака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Блокировка российских аккаунтов... 
 Отзыв сертификатов ЦБ РФ, ПСБ,... 
 Памятка мирным людям во время информационной... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Сенкс! Будем юзать... 20.10.02 06:43  Число просмотров: 1127
Автор: 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 02:37  
Автор: beetle <beetle> Статус: Member
<"чистая" ссылка>


http://he4dev.e1.bmstu.ru/intro.html
[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.
1  |  2 >>  »  




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach