![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
file hooks [D6]
oleggar © (2005-12-23 19:51:00)а этот вопрос нелегок,но все же буду рад любой информации.
мне нужно в Delphi отследить и занести в файл
следующую информацию
1)какие файлы были изменены ,созданы ,перенесены или удалены (имя файла входное и выходное ,имя каталога входное и выходное ,дата и время) (на NTFS /win 2000) и каким приложением ,действия пользователя не интересны (вообще следить нужно за одним приложением ,то есть перехватывать его файловые операции ,но если можно за всеми ,я буду фильтровать имена приложений).
Rouse_ (2005-12-29 17:20:00) [21]Эээ, я чуть не о том. Я про пресловутый перехват :)
У Шрайбера кажется было:
mov eax, Номер ZwXXX из KeServiceDescriptorTable
lea edx, [esp+04h]
int 2eh
Сответсвенно перехват вызовов ZwCreateFile, IoCreateFile, ZwOpenFile и т.п. может помочь "Отцам Русской Демократии" :)
Естественно через драйвер :)
Игорь Шевченко (2005-12-29 17:09:00) [22]Rouse_ © (29.12.05 17:08) [36]
Она к GetProcAddress не относится
Rouse_ (2005-12-29 17:08:00) [23]
> Причем от одного из них ты никаким боком не сможешь защититься.
случаем не про KeServiceDescriptorTable речь?
oleggar (2005-12-29 16:07:00) [24]и правда ,исходников и я не вижу .просто они все пишут на С++ ,если где и остался исходник ,он на С наверняка.
BiN (2005-12-29 15:54:00) [25]
> oleggar © (29.12.05 15:30) [33]
>
> там исходник на C++ .если бы бы очень рад .к сожалению,синтаксис
> С++ знаю в общем ,но реально на нем писать мне тяжело.
А где там? Ссылкой не поделишься.
На sysinternals исходников filemon-а нету давно.
oleggar (2005-12-29 15:30:00) [26]там исходник на C++ .если бы бы очень рад .к сожалению,синтаксис С++ знаю в общем ,но реально на нем писать мне тяжело.
Rouse_ (2005-12-29 13:00:00) [27]
> Как называется и где искать ?
Переписывается из sysinternal-овского, просто функционал записи лога в код добавь и все :)
oleggar (2005-12-29 12:58:00) [28]по поводу одного сообщения -
"Есть драйвер который по аналогии в sysinternal-овским мониторит обращения к ФС и создает отдельный лог, к примеру... :)".
Как называется и где искать ?
Я нашел пока один ,alfamonitor ,так он стоит 2000 долл и там глюков немало .Удаления файлов не перехватываются ,переименования не перехватываются,хотя такое событие в копмоненте есть.
Потому пользуюсь драйвером для перехвата чтения/записи и перехватом сообщений для распознавания удалений и переименований.
Rouse_ (2005-12-29 12:53:00) [29]Игорь, ну так я про это и речь веду :)
Игорь Шевченко (2005-12-29 12:37:00) [30]Rouse_ © (29.12.05 12:13) [28]
Я извиняюсь конечно, но любые действия драйверов из пользовательского режима прехватить нельзя.
Rouse_ (2005-12-29 12:13:00) [31]Да, перехватом АПИ из RING3 нельзя...
Игорь Шевченко (2005-12-29 11:47:00) [32]Rouse_ © (29.12.05 11:35) [26]
И что ? Нельзя отловить создание его лога или что ?
Rouse_ (2005-12-29 11:35:00) [33]Есть драйвер который по аналогии в sysinternal-овским мониторит обращения к ФС и создает отдельный лог, к примеру... :)
Игорь Шевченко (2005-12-29 11:30:00) [34]
> т.к. случаи модификации из RING0 через драйвер фильтр они
> вообще не поймают...
переведи
Rouse_ (2005-12-29 11:26:00) [35]Попытки перехвата с целью мониторинга изменений файловой системы вообще ни к чему не приведут т.к. случаи модификации из RING0 через драйвер фильтр они вообще не поймают...
BiN (2005-12-29 11:23:00) [36]По-моему, попытки перехвата/предупреждения оного приводят к "состоянию гонок", когда ни одна из сторон не имеет какого-либо преимущества, кроме опыта и знаний в предметной области.
Rouse_ (2005-12-29 11:01:00) [37]
> А как ты обратишься к этой таблицы? Через 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;
Игорь Шевченко (2005-12-29 10:53:00) [38]The_scorpion © (28.12.05 19:59) [19]
Не надо быть таким наивным. К таблице экспорта можно обратиться как минимум двумя способами, минуя GetProcAddress. Причем от одного из них ты никаким боком не сможешь защититься.
Arazel (2005-12-28 20:58:00) [39]Удалено модератором
The_scorpion (2005-12-28 19:59:00) [40]
> > А откуда ты этот адрес узнаешь?
>
> Из таблицы экспорта файла kernel32.dll
А как ты обратишься к этой таблицы? Через GetProcAddress, но она уже работает только по моему велению.