Текущий архив: 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