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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Сенкс! Будем юзать... 20.10.02 06:43  Число просмотров: 1264
Автор: 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-2024 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach