Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отследить обращение к файлу? [D7, WinXP]


mr.Bear ©   (2007-08-23 14:42:00) 

На компе в расшаренной папке лежат файлы. Необходимо отследить попытку открытия файла и при совпадении каких-либо заданных условий подменять содержимое на другое.


clickmaker   (2007-08-24 11:22:00) [1]

если уж на то пошло, лучше запретить прямой доступ к шаре, и написать простенький IIS или Апач download handler, который будет все делать. Ходить можно через браузер, например, хоть и в локалке


Eraser   (2007-08-24 11:17:00) [2]


> mr.Bear   (23.08.07 14:42) 

для решения данной задачи проще написать дравер, подобный тому, который используется в программе filemon Марка Руссановича.


Reindeer Moss Eater   (2007-08-24 10:47:00) [3]

Это как-же не поможет? Хочешь сказать что при FILE_NOTIFY_CHANGE_LAST_ACCESS не будет сработки при обращению к файлу по сети?

Так оно случится уже по факту совершившегося доступа.


Rouse_   (2007-08-24 10:40:00) [4]

Подменивать нужно перед попыткой доступа естественно, детект начала SMB сессии еще никто не отменял :)


Riply   (2007-08-24 10:32:00) [5]

> [10] Rouse_ ©   (24.08.07 10:26)
>Это как-же не поможет? Хочешь сказать что при FILE_NOTIFY_CHANGE_LAST_ACCESS
>не будет сработки при обращению к файлу по сети?
Будет поздно "подменивать содержимое на другое" :), imho.


Rouse_   (2007-08-24 10:26:00) [6]


> И как здесь поможет ReadDirectoryChangesW ?

Это как-же не поможет? Хочешь сказать что при FILE_NOTIFY_CHANGE_LAST_ACCESS не будет сработки при обращению к файлу по сети?


Slym   (2007-08-24 05:11:00) [7]

тока вся фигня начинается когда появляются асинхронные вызовы ReadFile/WriteFile, те что идут с overlapped :)
тут мало перехватить функцию, нужно как то отследить что реальная функция отработала, и уж только потом подменять данные:
WaitForSingleObject(overlapped.hEvent)
чтобы не сработал Event, приходится подсовывать новый Event в реальную функцию и плодить ожидающий (WaitFor) поток :( если приложение сделано на асинхронных вызовах тормоза с потоками обеспечены :(


Slym   (2007-08-24 05:02:00) [8]

я щас над этим работаю, только моя цель написать OnFly криптор/декриптор файла для стороннего приложения: файл мной зашифрован, а сторонняя прога видит правильные данные в файле...
все просто... перехват ReadFile/WriteFile также GetProcAddress и др фукнций в нужном тебе процессе во используемых модулях :)
1. Внедряемся в чужой процесс хуком...
2. Заменяем во всех таблицах импорта всех модулей нужные функции на свои...
Замену приведу, внедрений в чужое ап в инете полно:
unit ApiHookUn;

{$WARN SYMBOL_PLATFORM OFF}

interface
uses windows;

procedure ReplaceIATEntryInModule(pszCallerModName: Pchar; pfnCurrent, pfnNew: FarProc; hmodCaller: hModule);
procedure ReplaceIATEntryInAllModules(pszCallerModName: Pchar; pfnCurrent, pfnNew: FarProc);

implementation
uses TlHelp32;

type
 PImageImportDescriptor = ^TImageImportDescriptor;
 IMAGE_IMPORT_DESCRIPTOR = packed record
 case Integer of
   0: (Characteristics: DWORD);
   1: (OriginalFirstThunk: DWORD;
       TimeDateStamp: DWORD;
       ForwarderChain: DWORD;
       Name: DWORD;
       FirstThunk: DWORD);
 end;
 TImageImportDescriptor = IMAGE_IMPORT_DESCRIPTOR;
 PFARPROC = ^FARPROC;

const ImagehlpLib = 'IMAGEHLP.DLL';

function ImageDirectoryEntryToData(Base: Pointer; MappedAsImage: ByteBool;
 DirectoryEntry: Word; var Size: ULONG): Pointer; stdcall; external ImagehlpLib
   name 'ImageDirectoryEntryToData';

procedure ReplaceIATEntryInModule(pszCallerModName: Pchar; pfnCurrent, pfnNew: FarProc; hmodCaller: hModule);
var
 ulSize: ULONG;
 pImportDesc: PImageImportDescriptor;
 ppfn: PFARPROC;
 vp,written:DWORD;
begin
 pImportDesc := ImageDirectoryEntryToData(Pointer(hmodCaller), TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize);
 if pImportDesc = nil then exit;
 while pImportDesc.Name <> 0 do
 begin
   if (lstrcmpiA(PChar(hmodCaller+pImportDesc.Name), pszCallerModName) = 0) then
   begin
     ppfn := PFARPROC(hmodCaller + pImportDesc.FirstThunk);
     while ppfn^ <> nil do
     begin
       if ppfn^=pfnCurrent then
       begin
         Win32Check(VirtualProtectEx(GetCurrentProcess, ppfn, SizeOf(pointer), PAGE_EXECUTE_READWRITE, @vp));
         Win32Check(WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew), Written));
         Win32Check(VirtualProtectEx(GetCurrentProcess, ppfn, SizeOf(pointer), vp, @vp));
       end;
       Inc(ppfn);
     end;
   end;
   Inc(pImportDesc);
 end;
end;

procedure ReplaceIATEntryInAllModules(pszCallerModName: Pchar; pfnCurrent, pfnNew: FarProc);
var
 hSnapShot: THandle;
 me32: MODULEENTRY32;
begin
 hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, GetCurrentProcessId);
 if hSnapshot = INVALID_HANDLE_VALUE then RaiseLastOSError;
 try
   ZeroMemory(@me32, sizeof(MODULEENTRY32));
   me32.dwSize := sizeof(MODULEENTRY32);
   Module32First(hSnapShot, me32);
   repeat
     ReplaceIATEntryInModule(pszCallerModName, pfnCurrent, pfnNew, me32.hModule);
   until not Module32Next(hSnapShot, me32);
 finally
   CloseHandle(hSnapShot);
 end;
end;

end.


юзаем

procedure Intercept(const ModuleName:string;const OldProc,NewProc:FarProc);overload;
var P: PInterceptRec;
begin
 if OldProc=NewProc then exit;
 EnterCriticalSection(InterceptCS);
 try
   New(P);
   P^.Next:=InterceptList;
   P^.ModuleName:=ModuleName;
   P^.OldProc:=OldProc;
   P^.NewProc:=NewProc;
   InterceptList:=P;
   ReplaceIATEntryInAllModules(PChar(ModuleName), OldProc, NewProc);
 finally
   LeaveCriticalSection(InterceptCS);
 end;
end;

procedure Intercept(const ModuleName,ProcName:string;const NewProc:FarProc);overload;
var OldProc:FarProc;
begin
 OldProc := GetProcAddress(GetModuleHandle(PChar(ModuleName)), PChar(ProcName));
 Intercept(ModuleName,OldProc,NewProc);
end;
Intercept('kernel32.dll','GetProcAddress',@InterceptGetProcAddress);


Reindeer Moss Eater   (2007-08-23 21:51:00) [9]

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

А вот здесь и аудит не поможет.


Reindeer Moss Eater   (2007-08-23 21:50:00) [10]

Никак не поможет.


ReindeerMossEater   (2007-08-23 21:49:00) [11]

Необходимо отследить попытку открытия файла

И как здесь поможет ReadDirectoryChangesW ?


Rouse_   (2007-08-23 21:43:00) [12]

Аудит решает задачи логирования, иногда это выходит за рамки задачи, особливо в логике сервисных приложений :)
По сабжу: ReadDirectoryChangesW


Reindeer Moss Eater   (2007-08-23 15:01:00) [13]

Все уже написано до нас.
Включается аудит и все дела.


clickmaker   (2007-08-23 14:47:00) [14]

зачем?
обычно для таких манипуляций пишут специально обученные сервисы


Сергей М.   (2007-08-23 14:45:00) [15]

Отследить ГДЕ ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо