Форум: "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