![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отследить обращение к файлу? [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]Отследить ГДЕ ?