Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.6 MB
Время: 0.017 c
2-1147432717
Andrey235
2006-05-12 15:18
2006.05.28
работа приложения в DOS e


2-1146582118
@gent
2006-05-02 19:01
2006.05.28
Как вывести на печать форму с нужным разрешением экрнана ?


6-1138568202
redlord
2006-01-29 23:56
2006.05.28
получить список незадействованных портов


2-1147378010
Mr tray
2006-05-12 00:06
2006.05.28
использование DLL


15-1146315761
GeserX
2006-04-29 17:02
2006.05.28
запись CD





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский