Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

file hooks   Найти похожие ветки 

 
oleggar ©   (2005-12-23 19:51) [0]

а этот вопрос нелегок,но все же буду рад любой информации.
мне нужно в Delphi отследить и занести в файл
следующую информацию
1)какие файлы были изменены ,созданы ,перенесены или удалены (имя файла входное и выходное ,имя каталога входное и выходное ,дата и время) (на NTFS /win 2000) и каким приложением ,действия пользователя не интересны (вообще следить нужно за одним приложением ,то есть перехватывать его файловые операции ,но если можно за всеми ,я буду фильтровать имена приложений).


 
Eraser ©   (2005-12-23 19:56) [1]


> oleggar ©   (23.12.05 19:51)

http://sysinternals.com/
см. FileMon
Возможно немного поможет компонент TShellChangeNotifier из закладки Samples.


 
oleggar ©   (2005-12-23 20:21) [2]

хммм ...я думал про этот компонент ,но у него 2 проблемы
1)как я узнаю ,какое приложение мучало файл ?
2) что-то он мне сообщает об этом после изменения ,а я хотел бы перехватить попытку обращения ,и ,желательно,запретить его или ликвидировать приложение до того ,как оно глюкнет и удалит важный файл .с сортировщиками почты такое случалось при мне ..


 
Eraser ©   (2005-12-23 20:36) [3]


> oleggar ©   (23.12.05 20:21) [2]

тогда только через драйвер см. [1]


 
oleggar ©   (2005-12-23 20:56) [4]

я уже скачал этот filemon..замечательная вещь и цены бы ему не было ..если бы он хоть в лог-файл сохранял ,а он же все только на экране!придется следить своей утилитой за экраном ;(( в общем ,если кто знает ,как самому сделать аналог filemon на Delphi ,пишите.


 
Eraser ©   (2005-12-23 21:25) [5]


> oleggar ©   (23.12.05 20:56) [4]


> в общем ,если кто знает ,как самому сделать аналог filemon
> на Delphi ,пишите.

Я знаю как - никак.
А на сайте http://www.sysinternals.com/Utilities/Filemon.html дано общее описание "как оно работает" и ссылки на литературу.


 
The_scorpion ©   (2005-12-24 01:32) [6]


> Я знаю как - никак.

ИМХО Если ты не знаешь, это не значит, что это нельзя сделать.

> )какие файлы были изменены ,созданы ,перенесены или удалены
> (имя файла входное и выходное ,имя каталога входное и выходное
> ,дата и время) (на NTFS /win 2000) и каким приложением ,
> действия пользователя не интересны (вообще следить нужно
> за одним приложением ,то есть перехватывать его файловые
> операции ,но если можно за всеми ,я буду фильтровать имена
> приложений).

Перехвати все winapi функции работающие с файловой системой, и получишь всю информацию и полный контроль над ней.


 
Rouse_ ©   (2005-12-24 01:35) [7]


> Перехвати все winapi функции работающие с файловой системой,
>  и получишь всю информацию и полный контроль над ней.

ой ли?
к такого плана заявлениям желательно добавлять слово "ИМХО"


 
The_scorpion ©   (2005-12-24 01:42) [8]


> ой ли?
> к такого плана заявлениям желательно добавлять слово "ИМХО"

Это не заявление, это факт. Я это делал, но только с функциями реестра.
ИМХО Если ты не можешь этого сделать, это не значит, что этого нельзя сделать.


 
Eraser ©   (2005-12-24 02:42) [9]


> The_scorpion ©   (24.12.05 01:42) [8]

поизвращаться можно, например при помощи http://www.madshi.net/ , но даю 95%, что всё не перехватишь, и всю эту байду можно будет запускать только под админом и не факт, что её не бужет "палить" антивирус.


 
The_scorpion ©   (2005-12-24 11:29) [10]


> "палить" антивирус.

В моем универен не полил, все проглатывал, но даже если и будет, да его в первую очередь заражаешь(нужно перехватить функции работы с памятью, чтобы он не мог ее сканить на предмет подгруженных сомнительных Dll) и все...

> под админом

А если подгружать DLL с использованием ловушек, вроде им доступ админа и не нужен.

> но даю 95%, что всё не перехватишь,

А я да 100% что перехватишь(это долго, но возможно:))) )

> например при помощи http://www.madshi.net/

Лучше самому написать. Это интереснее и дешевле:)))


 
Rouse_ ©   (2005-12-26 13:20) [11]


>  Если ты не можешь этого сделать, это не значит, что этого
> нельзя сделать.

Хочешь об этом поговорить? Или тебе рассказать как эти чтуки твои с перехватом обходяться на раз?


 
Игорь Шевченко ©   (2005-12-26 13:38) [12]


> Перехвати все winapi функции работающие с файловой системой,
>  и получишь всю информацию и полный контроль над ней.


Filemon вообще-то работает по несколько иному принципу, но никто не мешает повторить его идеологию, драйвер, правда, на C придется писать, но этоне самая большая беда, верно ?


 
VirEx ©   (2005-12-26 16:36) [13]

http://kladovka.net.ru/download.cgi?id=300


 
The_scorpion ©   (2005-12-28 00:16) [14]


> Хочешь об этом поговорить? Или тебе рассказать как эти чтуки
> твои с перехватом обходяться на раз?

Расскажи...посмеюсь...:)))


 
Rouse_ ©   (2005-12-28 10:45) [15]


> Расскажи...посмеюсь...:)))

Банальной проеркой адреса вызываемой функции, веселый ты наш. :)


 
The_scorpion ©   (2005-12-28 10:58) [16]


> адреса вызываемой функции

А откуда ты этот адрес узнаешь? Уж надеюсь, не будешь использовать GetProcAddress? Ведь я ее одну из первых перехвачу...


 
Игорь Шевченко ©   (2005-12-28 11:47) [17]


> А откуда ты этот адрес узнаешь? Уж надеюсь, не будешь использовать
> GetProcAddress? Ведь я ее одну из первых перехвачу...


"Жаба хитра, но маленький хрущ с винтом много хитрее ее" (с)

Спорить не надо, практика - критерий истины.


 
xShadow ©   (2005-12-28 11:49) [18]


> А откуда ты этот адрес узнаешь?

Из таблицы экспорта файла kernel32.dll


 
The_scorpion ©   (2005-12-28 19:59) [19]


> > А откуда ты этот адрес узнаешь?
>
> Из таблицы экспорта файла kernel32.dll

А как ты обратишься к этой таблицы? Через GetProcAddress, но она уже работает только по моему велению.


 
Arazel ©   (2005-12-28 20:58) [20]

Удалено модератором


 
Игорь Шевченко ©   (2005-12-29 10:53) [21]

The_scorpion ©   (28.12.05 19:59) [19]

Не надо быть таким наивным. К таблице экспорта можно обратиться как минимум двумя способами, минуя GetProcAddress. Причем от одного из них ты никаким боком не сможешь защититься.


 
Rouse_ ©   (2005-12-29 11:01) [22]


> А как ты обратишься к этой таблицы? Через GetProcAddress,
>  но она уже работает только по моему велению

Ну что ты как маленький то?

Кроме GetProcAddress других способов не знаешь?
Учись студент :)



var
 ImportEntry: PImageImportDescriptor;
 Thunk: PImageThunkData;
 Protect, newProtect: DWORD;
 ImageBase: Cardinal;
 DOSHeader: PImageDosHeader;
 NTHeader: PImageNtHeaders;
begin
 Result := False;
 if OldProc = nil then Exit;
 if NewProc = nil then Exit;
 ImageBase := GetModuleHandle(nil);

 // Зная структуру PE заголовка - находим начало таблицы импорта
 DOSHeader := PImageDosHeader(ImageBase);
 if IsBadReadPtr(Pointer(ImageBase), SizeOf(TImageNtHeaders)) then Exit;
 if (DOSHeader^.e_magic <> IMAGE_DOS_SIGNATURE) then Exit;
 NTHeader := PImageNtHeaders(DWORD(DOSHeader) + DWORD(DOSHeader^._lfanew));
 if NTHeader^.Signature <> IMAGE_NT_SIGNATURE then Exit;
 ImportEntry := PImageImportDescriptor(DWORD(ImageBase) +
     DWORD(NTHeader^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));
 if DWORD(ImportEntry) = DWORD(NTHeader) then Exit;

 if ImportEntry <> nil then
 begin
   // Бежим по записям таблицы ...
   while ImportEntry^.Name <> 0 do
   begin
       Thunk := PImageThunkData(DWORD(ImageBase) +
         DWORD(ImportEntry^.FirstThunk));
       // ... пока таблица не кончится ...
       while Thunk^._function <> nil do
       begin
         // тут работаем с Thunk^._function          
         // к примеру через ImageRvaToVa или по другому
         Inc(PChar(Thunk), SizeOf(TImageThunkData32));
       end;
     ImportEntry := Pointer(Integer(ImportEntry) + SizeOf(TImageImportDescriptor));
   end;
 end;
end;


 
BiN ©   (2005-12-29 11:23) [23]

По-моему, попытки перехвата/предупреждения оного приводят к "состоянию гонок", когда ни одна из сторон не имеет какого-либо преимущества, кроме опыта и знаний в предметной  области.


 
Rouse_ ©   (2005-12-29 11:26) [24]

Попытки перехвата с целью мониторинга изменений файловой системы вообще ни к чему не приведут т.к. случаи модификации из RING0 через драйвер фильтр они вообще не поймают...


 
Игорь Шевченко ©   (2005-12-29 11:30) [25]


> т.к. случаи модификации из RING0 через драйвер фильтр они
> вообще не поймают...


переведи


 
Rouse_ ©   (2005-12-29 11:35) [26]

Есть драйвер который по аналогии в sysinternal-овским мониторит обращения к ФС и создает отдельный лог, к примеру... :)


 
Игорь Шевченко ©   (2005-12-29 11:47) [27]

Rouse_ ©   (29.12.05 11:35) [26]

И что ? Нельзя отловить создание его лога или что ?


 
Rouse_ ©   (2005-12-29 12:13) [28]

Да, перехватом АПИ из RING3 нельзя...


 
Игорь Шевченко ©   (2005-12-29 12:37) [29]

Rouse_ ©   (29.12.05 12:13) [28]

Я извиняюсь конечно, но любые действия драйверов из пользовательского режима прехватить нельзя.


 
Rouse_ ©   (2005-12-29 12:53) [30]

Игорь, ну так я про это и речь веду :)


 
oleggar ©   (2005-12-29 12:58) [31]

по поводу одного сообщения -
"Есть драйвер который по аналогии в sysinternal-овским мониторит обращения к ФС и создает отдельный лог, к примеру... :)".
Как называется и где искать ?
Я нашел пока один ,alfamonitor ,так он стоит 2000 долл и там глюков немало .Удаления файлов не перехватываются ,переименования не перехватываются,хотя такое событие в копмоненте есть.
Потому пользуюсь драйвером для перехвата чтения/записи и перехватом сообщений для распознавания удалений и переименований.


 
Rouse_ ©   (2005-12-29 13:00) [32]


> Как называется и где искать ?

Переписывается из sysinternal-овского, просто функционал записи лога в код добавь и все :)


 
oleggar ©   (2005-12-29 15:30) [33]

там исходник на C++ .если бы бы очень рад .к сожалению,синтаксис С++ знаю в общем ,но реально на нем писать мне тяжело.


 
BiN ©   (2005-12-29 15:54) [34]


> oleggar ©   (29.12.05 15:30) [33]
>
> там исходник на C++ .если бы бы очень рад .к сожалению,синтаксис
> С++ знаю в общем ,но реально на нем писать мне тяжело.

А где там? Ссылкой не поделишься.
На sysinternals исходников filemon-а нету давно.


 
oleggar ©   (2005-12-29 16:07) [35]

и правда ,исходников и я не вижу .просто они все пишут на С++ ,если где и остался исходник ,он на С наверняка.


 
Rouse_ ©   (2005-12-29 17:08) [36]


> Причем от одного из них ты никаким боком не сможешь защититься.

случаем не про KeServiceDescriptorTable речь?


 
Игорь Шевченко ©   (2005-12-29 17:09) [37]

Rouse_ ©   (29.12.05 17:08) [36]

Она к GetProcAddress не относится


 
Rouse_ ©   (2005-12-29 17:20) [38]

Эээ, я чуть не о том. Я про пресловутый перехват :)

У Шрайбера кажется было:

  mov eax, Номер ZwXXX из KeServiceDescriptorTable
  lea edx, [esp+04h]
  int 2eh


Сответсвенно перехват вызовов ZwCreateFile, IoCreateFile, ZwOpenFile и т.п. может помочь "Отцам Русской Демократии" :)
Естественно через драйвер :)


 
The_scorpion ©   (2005-12-29 18:08) [39]


> mov eax, Номер ZwXXX из KeServiceDescriptorTable
>   lea edx, [esp+04h]
>   int 2eh

Можно про это по подробнее.


> Rouse_ ©

Что-то я не понял...ну пребежишься ты по всем функциям в таблице импорта, что это даст?...Как ты узнаешь какая функция была перехвачена?


 
Rouse_ ©   (2005-12-29 18:18) [40]

Получу настоящий адрес вызываемой функции и выполню ее.
Также смотри хелп по ImageRvaToVa...

> Можно про это по подробнее.
Шрайбера под рукой нет.

Если в общих чертах то:

Почти все подобные вызовы (Zw*) имеют в теле функции следующее:

  mov eax, NumberFunction
  lea edx, [esp+04h]
  int 2eh

где NumberFunction есть номер вызываемой функции в таблице системных сервисов, которая находится по адресу, содержащемуся в глобальной переменной KeServiceDescriptorTable. Данная переменная указывает на следующую структуру:

  typedef struct SystemServiceDescriptorTable
  {
    SSD   SystemServiceDescriptors[4];
  } SSDT, *LPSSDT;

Соответсвенно перехватом системных вызовов ядра, таких как:
ZwCreateFile, ZwOpenFile, IoCreateFile, ZwQueryDirectoryFile, ZwClose ты можешь выполнить сабжевую задачу.


 
The_scorpion ©   (2005-12-29 18:26) [41]

Так и думал что в ImageRvaToVa дело...хотел сейчас посмотреть, но sdk меня покинул, сюрприз блин.
А если и ImageRvaToVa перехватить?


 
Rouse_ ©   (2005-12-29 18:26) [42]

Собственно что обьяснять, вот тебе пример драйвера реализующий такой функционал: http://rouse.front.ru/keservicedescriptortable.zip


 
Rouse_ ©   (2005-12-29 18:28) [43]


> А если и ImageRvaToVa перехватить?

Как сказал Игорь Шевченко - ""Жаба хитра, но маленький хрущ с винтом много хитрее ее" (с)"
Пойдем другим путем :)


 
Игорь Шевченко ©   (2005-12-29 20:14) [44]

The_scorpion ©


>Что-то я не понял...ну пребежишься ты по всем функциям в таблице >импорта, что это даст?...Как ты узнаешь какая функция была перехвачена?


Узнавать даже не требуется. Я сравню адрес с тем, что мне выдал GetProcAddress, если отличается, значит перехвачена либо GetProcAddress либо искомая функция.

Rouse_ ©   (29.12.05 18:18) [40]


> Почти все подобные вызовы (Zw*) имеют в теле функции следующее:
>  


Уже не имеют. Уже другое содержимое.


 
Rouse_ ©   (2005-12-30 01:20) [45]


> Уже не имеют. Уже другое содержимое.

Мммм, можно ссылочку? Или собственные исследования? Просто хочется быть в курсе нововведений, а времени как обычно не хватает по вечерам...


 
n0name   (2005-12-30 07:08) [46]

sysenter/sysext
IDA 4.6 <- ntdll.dll


 
n0name   (2005-12-30 07:15) [47]


> Соответсвенно перехватом системных вызовов ядра, таких как:
>  ZwCreateFile, ZwOpenFile, IoCreateFile, ZwQueryDirectoryFile,
>  ZwClose ты можешь выполнить сабжевую задачу.

NtQuerySysemInformation(SystemHandleInformation, ...)
NtQueryObject(ObjectTypeInformation, ...)
TypeName -> "File"
NtQueryObject(ObjectNameInformation, ...)
ObjectName -> FileName


 
Игорь Шевченко ©   (2005-12-30 10:50) [48]


> Просто хочется быть в курсе нововведений


   mov eax,function_number
   mov edx,7FFE0300h
   call edx
   ret xxxxx


 
Rouse_ ©   (2005-12-30 11:33) [49]


> Игорь Шевченко ©   (30.12.05 10:50) [48]

Ааа, ну это тогда не сильно принципиально - подход тотже остался :) Пасибо :)


 
Rouse_ ©   (2005-12-30 13:16) [50]

call edx
  ret xxxxx

Секунду, а где вызов   int 2eh? Это же шлюз между кольцами...


 
Игорь Шевченко ©   (2005-12-30 13:41) [51]

Rouse_ ©   (30.12.05 13:16) [50]


> Секунду, а где вызов   int 2eh?


а его нету. Как было отмечено в ондом из постом, адрес, на который ссылается edx, является адресом команды sysenter


 
Rouse_ ©   (2005-12-30 13:48) [52]

О как...
Век живи - век учись, а все равно дураком помрешь :) Пасибо...


 
Игорь Шевченко ©   (2005-12-30 13:58) [53]


> Как было отмечено в ондом из постом


Праздник в разгаре, однако


 
Rouse_ ©   (2005-12-30 14:01) [54]


> Праздник в разгаре, однако

:)))
С наступающим :)


 
n0name   (2005-12-30 21:47) [55]

В WinXP можно юзать и Int 2Eh, никто не запретит %)
Вот пример для SP0.
program Int2EhInterface;

type
DWORD = Cardinal;
PChar = Pointer;
NTSTATUS = Integer;

PDWORD = ^DWORD;

function MessageBoxA(HWND: DWORD; Msg, Capt: PChar; uType: DWORD): Integer; stdcall; external "user32.dll";

const
Msg: array [0..8] of char = "Test Msg"#0;
Capt: array [0..9] of char = "Test Capt"#0;

function DoInt2Eh(SysN: Integer): NTSTATUS; stdcall; assembler;
asm
mov eax, [ebp + 8]
lea edx, [ebp + 20]
int 2Eh
end;

function ZwTerminateProcess(hProcess: DWORD; uCode: DWORD): NTSTATUS; stdcall; assembler;
asm
push 101h
call DoInt2Eh;
end;

function ZwWriteVirtualMemory(hProcess: DWORD; BaseAddress: Pointer; Buffer: Pointer; Size: DWORD; bw: PDWORD): NTSTATUS;
stdcall; assembler;
asm
push 115h
call DoInt2Eh
end;

procedure DoMessage;
begin
MessageBoxA(0, @Msg, @Capt, 0);
end;

var
Buf: DWORD;

begin
Buf := $6C6F6F43;
DoMessage;
ZwWriteVirtualMemory(DWORD(-1), @Msg, @Buf, 4, nil);
DoMessage;
ZwTerminateProcess(DWORD(-1), 0);
end.


 
Игорь Шевченко ©   (2005-12-30 23:09) [56]

n0name   (30.12.05 21:47) [55]


> В WinXP можно юзать и Int 2Eh, никто не запретит %)


Это факт. Вот только отслеживать номера сервисов от сервис-пака к сервис паку дело очень утомительное.

С наступающим!

Rouse_ ©   (30.12.05 14:01) [54]

Взаимно, Саша, удачи во всем!


 
n0name   (2005-12-31 08:05) [57]


> С наступающим!

Тебе того же, чтоб все твои желания сбылись =)


> Это факт. Вот только отслеживать номера сервисов от сервис-
> пака к сервис паку дело очень утомительное.

Динамический дизасм ntdll.dll, для этого можно использовать простой дизасм длин.

PS: Всех форумчан с НГ =)


 
pilot   (2006-03-07 11:36) [58]

http://forum.vingrad.ru/index.php?showtopic=21411&view=findpost&p=343749



Страницы: 1 2 вся ветка

Текущий архив: 2006.05.28;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.122 c
15-1146754834
fast2
2006-05-04 19:00
2006.05.28
Как установить WIN2003 "с нуля"?


11-1127405136
ebta
2005-09-22 20:05
2006.05.28
scrolling text


2-1147327268
VitalZ
2006-05-11 10:01
2006.05.28
Невидимая папка


1-1145436571
apl
2006-04-19 12:49
2006.05.28
Добавление компонентов! Подскажите!


15-1146423589
Yanis
2006-04-30 22:59
2006.05.28
Какие могут быть траблы?