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

Вниз

Как отследить обращение к файлу?   Найти похожие ветки 

 
mr.Bear   (2007-08-23 14:42) [0]

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


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

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


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

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


 
Reindeer Moss Eater ©   (2007-08-23 15:01) [3]

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


 
Rouse_ ©   (2007-08-23 21:43) [4]

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


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

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

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


 
Reindeer Moss Eater ©   (2007-08-23 21:50) [6]

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


 
Reindeer Moss Eater ©   (2007-08-23 21:51) [7]

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

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


 
Slym ©   (2007-08-24 05:02) [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);


 
Slym ©   (2007-08-24 05:11) [9]

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


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


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

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


 
Riply ©   (2007-08-24 10:32) [11]

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


 
Rouse_ ©   (2007-08-24 10:40) [12]

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


 
Reindeer Moss Eater ©   (2007-08-24 10:47) [13]

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

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


 
Eraser ©   (2007-08-24 11:17) [14]


> mr.Bear   (23.08.07 14:42) 

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


 
clickmaker ©   (2007-08-24 11:22) [15]

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



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

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

Наверх




Память: 0.51 MB
Время: 0.016 c
2-1206778119
troickiy
2008-03-29 11:08
2008.04.27
Как синхронизировать текущую запись в DBGrid и Memo?


2-1207223397
webpauk
2008-04-03 15:49
2008.04.27
procedure of object


2-1207257029
FishNode
2008-04-04 01:10
2008.04.27
TCAlendarMouth


15-1205433311
Dr.Andrew
2008-03-13 21:35
2008.04.27
Ошибка при инсталляции Delphi 2007! Как исправить?


2-1206993864
Дмитрий
2008-04-01 00:04
2008.04.27
Палитра системы