Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.59.82.167] |
|
Сообщ.
#1
,
|
|
|
Как можно отловить процесс удаление файлов под windows, и если можно запретить програмно удаление файлов некоторого типа или просто нескольких произвольных файлов. Например при запущеной программе, при попытке удаления файла или папки выведется msgbox c надписью "не тронь!".
|
Сообщ.
#2
,
|
|
|
Нужно перехватить АПИшную функцию DeleteFile()...
|
Сообщ.
#3
,
|
|
|
А можно ,пожалуйста, простенький примерчик.
|
Сообщ.
#4
,
|
|
|
Для контроля одного процесса я могу подкинуть, а вот для всей системы вцелом, наверное, .alex даст =) мэй би
|
Сообщ.
#5
,
|
|
|
Ну дайти тогда хотябы для одного процесса.
|
Сообщ.
#6
,
|
|
|
С те бя идет!
DLL: library Mouse_mes; uses sysutils, windows, messages; type TImageImportDescriptor=packed record OriginalFirstThunk : DWORD; TimeDateStamp : DWORD; ForwarderChain : DWORD; Name : DWORD; FirstThunk : DWORD; end; PImageImportDescriptor=^TImageImportDescriptor; var filename:array[0..max_path-1] of char; hook:HHook=0; PEHeader:PImageNtHeaders; ImageBase:cardinal; function MyHookProcedure(hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall; begin result:=MessageBoxA(0, 'Notepad', 'my hook', 0); //Но уже через нашу табл. импорта end; procedure ProcessImports(PImports:PImageImportDescriptor); Var PImport:PImageImportDescriptor; PRVA_Import:LPDWORD; ProcAddress:pointer; Temp_Cardinal:cardinal; begin{1} ProcAddress:=GetProcAddress(GetModuleHandle('USER32.DLL'), 'MessageBoxA'); PImport:=PImports; while PImport.Name<>0 do begin{2} PRVA_Import:=LPDWORD(pImport.FirstThunk+ImageBase); while PRVA_Import^<>0 do begin{3} if PPointer(PRVA_Import)^=ProcAddress then begin{4} VirtualProtect(PPointer(PRVA_Import),4,PAGE_READWRITE,Temp_Cardinal); PPointer(PRVA_Import)^:=@MyHookProcedure; //пишем свою... VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal); end;{1} Inc(PRVA_Import); end;{2} Inc(PImport); end;{3} end;{4} procedure DllEntryPoint(reson:longint);stdcall; begin case reson of DLL_PROCESS_ATTACH: begin DisableThreadLibraryCalls(hInstance); ZeroMemory(@FileName, SizeOf(FileName)); GetModuleFileName(GetModuleHandle(nil), @FileName, SizeOf(FileName)); if Pos('NOTEPAD.EXE',AnsiUpper(@FileName))<>0 then //сейчас я хочу попробовать все это дело надо нотепадом begin ImageBase:=GetModuleHandle(nil); PEHeader:=pointer(int64(ImageBase)+PImageDosHeader(ImageBase)._lfanew);//pe header ProcessImports(pointer(PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress+ImageBase)); end; end; end; end; function nexthook(code:integer;wParam,lParam:longint):longint;stdcall; begin result:=callnexthookex(hook,code,wParam,lParam); end; procedure sethook(flag:bool);export; stdcall; begin if flag then hook:=setwindowshookex(wh_getmessage,@nexthook,hInstance,0) else begin unhookwindowshookex(hook); hook:=0; end; end; exports sethook; begin DLLProc:=@DllEntryPoint; DllEntryPoint(DLL_PROCESS_ATTACH) end. EXE: program Project2; uses windows; var sethook:procedure(flag:bool)stdcall; hDll:hModule; begin hDll:=LoadLibrary('Mouse_mes.dll'); @sethook:=GetProcAddress(hDll, 'sethook'); sethook(true); messagebox(0,'Не закрывай, пока идет работа','',0); sethook(false); FreeLibrary(hDll); end. Думаю сам разберешься, что там надо заменить, если что то спрашивай и готовь .... ээээ ммм, ладно шутю =) |
Сообщ.
#7
,
|
|
|
Цитата xZero, 4.01.04, 20:25 и готовь .... ээээ ммм, ладно шутю =) Да правильно-правильно, пусть готовит |
Сообщ.
#8
,
|
|
|
А можно ли не просто отловить процесс, а еще и запретить его выполнение. Кстати а в каком модуле лежит эта замечательная функция DeleteFile?
Готовлю! |
Сообщ.
#9
,
|
|
|
function DeleteFile(const FileName: string): Boolean; begin {$IFDEF MSWINDOWS} Result := Windows.DeleteFile(PChar(FileName)); {$ENDIF} {$IFDEF LINUX} Result := remove(PChar(FileName)) <> -1; {$ENDIF} end; Прости, не понял что надо! Если хочешь остановить процесс - Terminate используй! Добавлено в : const {$IFDEF MSWINDOWS} advapi32 = 'advapi32.dll'; kernel32 = 'kernel32.dll'; mpr = 'mpr.dll'; {$EXTERNALSYM version} version = 'version.dll'; comctl32 = 'comctl32.dll'; gdi32 = 'gdi32.dll'; opengl32 = 'opengl32.dll'; user32 = 'user32.dll'; wintrust = 'wintrust.dll'; msimg32 = 'msimg32.dll'; function DeleteFile; external kernel32 name 'DeleteFileA'; Отсюда точно понятно где храгится. |
Сообщ.
#10
,
|
|
|
А если я прокручу эту функцию для всех текущих процессов, у меня компютер не задымится, или она не требует много ресурсов?
И как поступить с Terminate? Application.Terminate; - понимаю, а здесь как? |
Сообщ.
#11
,
|
|
|
Я че-то немогу понять - что тебе надо?
Ты хочешь убить какой-то процесс? Если да, то используй TerminateProcess The TerminateProcess function terminates the specified process and all of its threads. BOOL TerminateProcess( HANDLE hProcess, // handle to the process UINT uExitCode // exit code for the process ); Parameters hProcess Handle to the process to terminate. Windows NT: The handle must have PROCESS_TERMINATE access. uExitCode Specifies the exit code for the process and for all threads terminated as a result of this call. Use the GetExitCodeProcess function to retrieve the process's exit value. Use the GetExitCodeThread function to retrieve a thread's exit value. Return Values If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. Remarks The TerminateProcess function is used to unconditionally cause a process to exit. Use it only in extreme circumstances. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess. TerminateProcess causes all threads within a process to terminate, and causes a process to exit, but DLLs attached to the process are not notified that the process is terminating. Terminating a process causes the following: All of the object handles opened by the process are closed. All of the threads in the process terminate their execution. The state of the process object becomes signaled, satisfying any threads that had been waiting for the process to terminate. The states of all threads of the process become signaled, satisfying any threads that had been waiting for the threads to terminate. The termination status of the process changes from STILL_ACTIVE to the exit value of the process. Terminating a process does not cause child processes to be terminated. Terminating a process does not necessarily remove the process object from the system. A process object is deleted when the last handle to the process is closed. Windows CE: Windows CE does not support exit codes for processes, so the uExitCode parameter is ignored. QuickInfo Windows NT: Requires version 3.1 or later. Windows: Requires Windows 95 or later. Windows CE: Requires version 1.0 or later. Header: Declared in winbase.h. Import Library: Use kernel32.lib. Или ты имел в виду что-то другое?! |
Сообщ.
#12
,
|
|
|
Цитата xZero, 4.01.04, 19:09 а вот для всей системы вцелом, наверное, .alex даст =) мэй би Просто в длл не делай проверку на то, что это notepad.exe, вот и будет тебе для всей системы. Хотя комп децл залипать будет Но можно по другому - "просто" перехватывать эту функцию в kernel32.dll, для 9х могу дать пример на С++, а вот для линейки NT дрова писать надо, я этим никогда не занимался, но примеров в инете навалом, например на http://www.codeproject.com |
Сообщ.
#13
,
|
|
|
.alex, кинь мне.
|
Сообщ.
#14
,
|
|
|
Да мне для Melleniuma хватит, я не хочу писать супер прогу, я всего лишь хочу защитить мой компьютер от друзей, которые скоро соберутся у меня и будут тыкать на все подряд, но без компьютера тоже незьзя, музыка вся там -> скучно будет. Вот по этому Вас и мучаю вопросами.
И всеже я не понял как похоронить этот процесс. Ну например как нам получить Handle процесса удаления файла? И кстати при удалении папки с файлами система использует этуже функцию многократно или нет, может у нее есть другие способы, а то они и папками покосить могут. И разве мы не перехватываем удаление в Kernel32.dll или я что-то путаю? |
Сообщ.
#15
,
|
|
|
Сам не пробовал! Попробуй как сказал .alex убрать проверку на имя файла, и переоформи мою MyHookProc для DeleteFile (например), а резалт оставь пустой.
Мне кажется для твоих целей можно придумать что то не такое извращенское!!! |
Сообщ.
#16
,
|
|
|
Цитата Du-Xa, 4.01.04, 22:05 я всего лишь хочу защитить мой компьютер от друзей, которые скоро соберутся у меня и будут тыкать на все подряд, но без компьютера тоже незьзя, музыка вся там -> скучно будет. Может лучше друзьям по рукам надавать, чтобы не тыкали во всё подряд, или локер для клавиатуры поставить, на этом сайте даже пример вроде есть или просто клавиатуру вытащить - любой из способов будет намного проще! Цитата Du-Xa, 4.01.04, 22:05 И разве мы не перехватываем удаление в Kernel32.dll или я что-то путаю? В случае с хуком мы переписываем таблицу импорта в каждом процессе, а в kernel32.dll нужно будет переписывать таблицу экспортов, для этого нужно снять с неё защиту, а для этого нужно ...бла-бла-бла..., короче много чего сделать нужно... Цитата .alex, 4.01.04, 21:33 .alex, кинь мне. Время нет, ибо сессии в двух универах не за горами, так что бери BO2K и читай process_hop.cpp |
Сообщ.
#17
,
|
|
|
Подскажите все-таки что делать с Terminate.
Этот изврещенский вариант, мне кажется, наиболее подходящий все-таки! |
Сообщ.
#18
,
|
|
|
Я тоже не до конца вкурил, что ты хочешь делать с "Terminate"
Ты наверно хочешь шоб процесс вылетал как только он вызовет DeleteFile(), а? Если да то напиши просто ExitProcess(0) в MyHookProcedure() и процесс упадёт, т.к. длл загружена в его адресное пространство... |
Сообщ.
#19
,
|
|
|
Делаю так "
function MyHookProcedure(hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall; begin Windows.ExitProcess(0); end;" Убираю это: "if Pos('NOTEPAD.EXE',AnsiUpper(@FileName))<>0 then " - ничего не идет. Удаляю файлы и ничего не пишется и не отменяется! |
Сообщ.
#20
,
|
|
|
Если ты перехватываешь DeleteFile, то надо ведь в MyHookProc() переопределить параметры - а ты их оставил от МессаджБокса!
|
Сообщ.
#21
,
|
|
|
Пишу так:
function MyHookProcedure(const FileName:string): boolean; stdcall; begin MessageBoxA(0, 'Удаляй файлы у себя дома', 'Предупреждение', 0); Windows.ExitProcess(0); result:=true; end; И не идет. Я так понял, что в MyHookProcedure перейдут все параметры от DeleteFile(), правильно? |
Сообщ.
#22
,
|
|
|
Или там все делается не так?
|
Сообщ.
#23
,
|
|
|
Цитата Du-Xa, 5.01.04, 14:14 Или там все делается не так? А ты ProcessImports() изменил, ась? Нужно сделать чтобы она адрес не MessageBox() искала, а адрес DeleteFile()? ЗЫ. учти, что DeleteFile() лежит в kernel32.dll, а не в user32.dll... Добавлено в : Вот тебе переделанная длл'ка, у меня всё работает, ловит вызов DeleteFileA(), надеюсь перехват DeleteFileW() сам сделаешь, если конечно тебе это понадобится... library Mouse_mes; uses sysutils, windows, messages; type TImageImportDescriptor=packed record OriginalFirstThunk: DWORD; TimeDateStamp: DWORD; ForwarderChain: DWORD; Name: DWORD; FirstThunk: DWORD; end; PImageImportDescriptor=^TImageImportDescriptor; var hook: HHook = 0; PEHeader:PImageNtHeaders; ImageBase:cardinal; function MyHookProcedure(lpFileName: PChar): boolean;stdcall; begin MessageBox(HWND(nil), 'DeleteFile(): call', 'Bla-bla', MB_OK); ExitProcess(0); result := FALSE; end; procedure ProcessImports(PImports:PImageImportDescriptor); var PImport:PImageImportDescriptor; PRVA_Import:LPDWORD; ProcAddress:pointer; Temp_Cardinal:cardinal; begin{1} ProcAddress := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'DeleteFileA'); PImport:=PImports; while PImport.Name <> 0 do begin{2} PRVA_Import:=LPDWORD(pImport.FirstThunk+ImageBase); while PRVA_Import^ <> 0 do begin{3} if PPointer(PRVA_Import) ^= ProcAddress then begin{4} VirtualProtect(PPointer(PRVA_Import),4,PAGE_READWRITE,Temp_Cardinal); PPointer(PRVA_Import)^:=@MyHookProcedure; VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal); end;{1} Inc(PRVA_Import); end;{2} Inc(PImport); end;{3} end;{4} procedure DllEntryPoint(reson:longint);stdcall; begin case reson of DLL_PROCESS_ATTACH: begin DisableThreadLibraryCalls(hInstance); ImageBase := GetModuleHandle(nil); PEHeader := pointer(int64(ImageBase) + PImageDosHeader(ImageBase)._lfanew);//pe header ProcessImports(pointer(PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress+ImageBase)); end; end; end; function nexthook(code:integer;wParam,lParam:longint):longint;stdcall; begin result:=callnexthookex(hook,code,wParam,lParam); end; procedure sethook(flag:bool);export; stdcall; begin if flag then hook:=setwindowshookex(wh_getmessage,@nexthook,hInstance,0) else begin unhookwindowshookex(hook); hook:=0; end; end; exports sethook; begin DLLProc:=@DllEntryPoint; DllEntryPoint(DLL_PROCESS_ATTACH) end. |
Сообщ.
#24
,
|
|
|
Ну, что, так работает?
|
Сообщ.
#25
,
|
|
|
Нет! У меня так-же было. Я просто забыл об этом упомянуть. Может Millenium DeleteFile() NT'шную использует и без драйверов действительно не обойтись?
|
Сообщ.
#26
,
|
|
|
Цитата Du-Xa, 5.01.04, 17:32 Нет! У меня так-же было. Я просто забыл об этом упомянуть. Может Millenium DeleteFile() NT'шную использует и без драйверов действительно не обойтись? При чём тут драйвера? У меня в ХР всё нормально работает... |
Сообщ.
#27
,
|
|
|
Странно. А почему тогда у меня не работает! Проверил на 3 раза. Может в exe'шнике дело?
Хотя вряд ли, что ему надо-то. Нажимаю Del и файлы удаляются! Хотя погодьте. А чем отличается DeleteFileA() от DeleteFileW()? |
Сообщ.
#28
,
|
|
|
Одна Ansi, вторая Wide
|
Сообщ.
#29
,
|
|
|
А когда я нажимаю Del какая из них используется? А когда "Удалить" в меню выбираю?
|
Сообщ.
#30
,
|
|
|
Цитата Du-Xa, 5.01.04, 21:00 А когда "Удалить" в меню выбираю? Возможно в меню используется не DeleteFile(), SHFileOperation() - попробуй перехватить её У меня в ФАРе работает... |
Сообщ.
#31
,
|
|
|
А у меня DeleteFileA даже в фаре не работает.
И кстати SHFileOperation() откуда эта функция и какие параметры ей нужно передавать? |
Сообщ.
#32
,
|
|
|
{$EXTERNALSYM SHFileOperation} function SHFileOperation(const lpFileOp: TSHFileOpStruct): Integer; stdcall; {$EXTERNALSYM SHFileOperationA} function SHFileOperationA(const lpFileOp: TSHFileOpStructA): Integer; stdcall; {$EXTERNALSYM SHFileOperationW} function SHFileOperationW(const lpFileOp: TSHFileOpStructW): Integer; stdcall; shell32 = 'shell32.dll'; function SHFileOperation; external shell32 name 'SHFileOperationA'; И неужели было самому поглядеть лень? |
Сообщ.
#33
,
|
|
|
Цитата Du-Xa,5.01.04, 22:58 А у меня DeleteFileA даже в фаре не работает. Странно, у меня всё работает, вот тебе скриншот (обрати внимание на иконку MessageBox'a в трее - она ФАРовская) Прикреплённый файлdel.jpg (152.25 Кбайт, скачиваний: 284) |
Сообщ.
#34
,
|
|
|
Цитата xZero,6.01.04, 12:41 {$EXTERNALSYM SHFileOperation} function SHFileOperation(const lpFileOp: TSHFileOpStruct): Integer; stdcall; {$EXTERNALSYM SHFileOperationA} function SHFileOperationA(const lpFileOp: TSHFileOpStructA): Integer; stdcall; {$EXTERNALSYM SHFileOperationW} function SHFileOperationW(const lpFileOp: TSHFileOpStructW): Integer; stdcall; shell32 = 'shell32.dll'; function SHFileOperation; external shell32 name 'SHFileOperationA'; И неужели было самому поглядеть лень? А откудова эти цитаты Вы берете? |
Сообщ.
#35
,
|
|
|
{*******************************************************} { } { Borland Delphi Run-time Library } { Win32 Shell API Interface Unit } { } { Copyright (c) 1985-1999, Microsoft Corporation } { } { Translator: Borland Software Corporation } { } {*******************************************************} unit ShellAPI; Добавлено в : Не посчитайте за рекламу! =) Добавлено в : Т.е., в основном, это: Цитата ShellAPI.pas Windows.pas |
Сообщ.
#36
,
|
|
|
И всеже она у меня не работает. Можете мне исходники с Exe выслать пожалуйста.
|
Сообщ.
#37
,
|
|
|
Цитата Du-Xa,6.01.04, 17:39 И всеже она у меня не работает. Можете мне исходники с Exe выслать пожалуйста. Как это исходник c .exe? У тебя какая ось? |
Сообщ.
#38
,
|
|
|
У меня Windows Mellenium Edition. А исходник с EXE это исходник + откомпилированный файл(лучше без RunTime).
|
Сообщ.
#39
,
|
|
|
.alex кинь ему ты, пожалуста, т.к. у тебя вроде как уже откомпилено =)
|
Сообщ.
#40
,
|
|
|
Цитата xZero, 7.01.04, 23:40 .alex кинь ему ты, пожалуста, т.к. у тебя вроде как уже откомпилено =) Не пойму зачем? Чем мои откомпиленные .ехе/.длл будут отличаться от его, сорс то один? |
Сообщ.
#41
,
|
|
|
Попробую Windows98 поставлю. Может что в Melleniume глючит.
|
Сообщ.
#42
,
|
|
|
Windows98 ничего не пошло тоже!
|
Сообщ.
#43
,
|
|
|
ыыыыыы
Что-то ты явно не так делаешь!!! |
Сообщ.
#44
,
|
|
|
У меня всё работает, только я заметил глюки
1) Не перехватывает LoadLibraryA 2) Если функция вызывается из запакованного exe(например UPX'om) тогда хук не срабатывает |
Сообщ.
#45
,
|
|
|
Да действительно я паковал Exe AsPack'ом, но с незапакованым ничего не идет тоже! Специально перекомпилировал ради такого случая! Запускаю в Far'е жду окошка и удаляю не закрывая окошка, через Far. Пробовал удалять мимо корзины, эфект тотже!
|
Сообщ.
#46
,
|
|
|
2 Du-Xa тогда попробуй поставь хук на MessageBoxA и проверб вообще у тебя работает или нет
|
Сообщ.
#47
,
|
|
|
Так: у меня XP
пробовал ловить и Боксы и LoadLibrary и DeleteFile - все ловится! Пробовал паковать (UPX) - все ловится =( В чем проблема? Что вы паковали? |
Сообщ.
#48
,
|
|
|
Andrey_Kun: знаешь, самое обидное то, что MessageBoxA у меня ловится, а DeleteFileA нет!!! Лучше бы наоборот!
|
Сообщ.
#49
,
|
|
|
Цитата Du-Xa, 13.01.04, 20:24 ...самое обидное то, что MessageBoxA у меня ловится, а DeleteFileA нет!!! Лучше бы наоборот! Мистика |
Сообщ.
#50
,
|
|
|
Ну выложи сюда, то что ты компилил!!! Может и прям мистика? =(
|
Сообщ.
#51
,
|
|
|
А у меня такое предложение давайте так. Du-Xa выкладывает свой код, а xZero свой.
А там и разберёмся |
Сообщ.
#52
,
|
|
|
Обижаешь - я свой давно выложил!!!
|
Сообщ.
#53
,
|
|
|
Для уверенности, что файл удаляется именно перехватываемой ф-ей, например, DeleteFileA, сделай вторую прогу в которой по клику напиши что-то вроде DeleteFile(PChar('C:\MyTestFil.Txt'));
Вот и проверишь! |
Сообщ.
#54
,
|
|
|
2 xZero: он вроде уже так и делал. Только я непойму одного. Потвоему коду у меня не ставится хуки на файлы которые запакованы UPX
|
Сообщ.
#55
,
|
|
|
Удалял я far'ом файл!
Попробовал я вариант DeleteFile(PChar('C:\MyTestFil.Txt')); Конечно на диск С кинул файл MyTestFil.Txt. Но ничего не ловится!!! А по поводу моего кода, дак я его получил путем нажатия клавиш Cntl + C на коде xZero. Так что ошибки исключены. |
Сообщ.
#56
,
|
|
|
У меня также не срабатывает, а именно не выполняется вот это условие
if PPointer(PRVA_Import)^ = ProcAddress then |
Сообщ.
#57
,
|
|
|
Вот так вот. Оказывается не у одного меня не работает. А у Вас тоже не WindowsXP?
|
Сообщ.
#58
,
|
|
|
Цитата Song @ 17.01.04, 06:40 У меня также не срабатывает, а именно не выполняется вот это условие if PPointer(PRVA_Import)^ = ProcAddress then Точно, мистика какая-то! Ладно, завтра еще раз попробую! Добавлено в : Цитата Du-Xa @ 17.01.04, 18:11 Вот так вот. Оказывается не у одного меня не работает. А у Вас тоже не WindowsXP? ыыыы Да, вроде, как XP написано =( Добавлено в : Миша, а ты под какую ось тестил? |
Сообщ.
#59
,
|
|
|
В XP. Других нет.
Добавлено в : Судя по всему здесь что-то не учтено и ОС здесь не при чём. |
Сообщ.
#60
,
|
|
|
xZero: Ну и как? Попробовал?
|
Сообщ.
#61
,
|
|
|
Цитата Du-Xa @ 21.01.04, 17:16 xZero: Ну и как? Попробовал? Нет! Сессия, блин, в разгаре!!! |
Сообщ.
#62
,
|
|
|
Мужики, чё вы парню все мОзги запарили? Он же говорит - защитить от друзей.
Делай так! Пишешь малюсенькую программулину, которая просто напросто открывает все твои нужные файлы и постоянно держит их открытыми. Поставь её в автозагрузку или в реестр в Run. При запуске системы твоя прога откроет все твои ценнейшие файлы, и при попытке удалить какой-либо из них, сама система скажет: "Не тронь!". Проблемы-то нет фактически. |
Сообщ.
#63
,
|
|
|
Да. Вот только что? У меня работает
|
Сообщ.
#64
,
|
|
|
Цитата DrUnkard @ 23.01.04, 01:29 Мужики, чё вы парню все мОзги запарили? Он же говорит - защитить от друзей. Делай так! Пишешь малюсенькую программулину, которая просто напросто открывает все твои нужные файлы и постоянно держит их открытыми. Поставь её в автозагрузку или в реестр в Run. При запуске системы твоя прога откроет все твои ценнейшие файлы, и при попытке удалить какой-либо из них, сама система скажет: "Не тронь!". Проблемы-то нет фактически. Во-первых: дело в том, что мы его предупреждали о выборе метода, но он все же пошел этим! Во-вторых: а что, если ему надо сберечь очень много файлов, то этот способ несколько извратен! (опять, таки, имхо). В-3: конечно, можно прдумать что-ниюудь и по проще!!! Но кому как .... =( |
Сообщ.
#65
,
|
|
|
А если ему надо файлы защитить от удаления, но при этом можно было бы их послушать (мп3-шки) или посмотреть (ави-шки) в плеерах?
|
Сообщ.
#66
,
|
|
|
Одно другому не мешает.
Система запрещает только изменение открытого другим процессом файла и его удаление. А читать ты его можешь хоть сотней разных приложений. |
Сообщ.
#67
,
|
|
|
Вы отвлекаеетесь от темы. Раз уже есть код, может всётаки его доделать
|
Сообщ.
#68
,
|
|
|
Цитата DrUnkard @ 23.01.04, 21:26 Одно другому не мешает. Система запрещает только изменение открытого другим процессом файла и его удаление. А читать ты его можешь хоть сотней разных приложений. Мне надо защитить свои 17Gb музыки. Что мог уже на болванки по скидал, денег больше не осталось. А друзья прийдут через 3 дня. Поэтому проблема для меня глобальна. А в общем на моем винчестере кроме музыки ничего важного уже не осталось. Просто обидно терять, то, что накапливалось годами. |
Сообщ.
#69
,
|
|
|
Мда, a в формате МР3 - это примерно 2000 песен. Твои друзья не вандалы, случаем? Я бы перед их приходом, просто изъял шнур питания компа, запрятал его на балконе под снег - и спал бы спокойно.
|
Сообщ.
#70
,
|
|
|
Пример с DeleteFile() работает, проверенно на примере программкой:
AssignFile(f,'file.txt'); ReWrite(f); CloseFile(f); //Создадим файл DeleteFile('file.txt'); //Удалим файл Но в Виндовс (Win98 и WinXP) это не проходит => IMHO, файлы в Винде удаляются по SHFileOperationA(W?) из SHELL32.DLL... Отсюда вопрос: А как паставить хук на нее? Добавлено в : Пример на DeleteFile() работает, бесспорно. Проверено программкой: AssignFile(f,'file.txt'); ReWrite(f); CloseFile(f); // Создадим файл DeleteFile('file.txt'); //Удалим (попытаемся) файл Но в Виндовс (Win98 и WinXP) это не проходит... + Появление характерного окошка (с задержкой на подготовку списка): +-----------------------------+ | Удаление: | | | | [..ProgressBar....][Отмена] | +-----------------------------+ Наводит на мысль об использовании SHFileOperationA() (SHFileOperationW()?) из SHELL32.DLL. Но только как на нее хук повесить грамотно... Кто подскажет? |
Сообщ.
#71
,
|
|
|
я пробовал таким же способ как и на DeleteFileA - ничего не выходит
|
Сообщ.
#72
,
|
|
|
Так же не получится - у нее параметры совсем другие!
|
Сообщ.
#73
,
|
|
|
Неужели никто ничего умного не добавит? :)
|
Сообщ.
#74
,
|
|
|
У меня даже с этим Rewrite(f); ... DeleteFile("name.txt") все равно ничего не идет. Удаляю что хочу.
Думал в Exe не подгружается Dll попробовал загрузить статично. Результат тот же. Одно значит - либо я не то списал(Ctrl+C - Shift+Ins), либо Delphi у меня плохие Dll создает(проверял, отличные dll!). Но описанный выше пример с DeleteFileA ничего не сбережет на моем компьютере! Попробовал даже Sleep(3000); поставить между Close(f) и Deletefile("name.txt") - Файл создается и отлично удаляется! Почему же все-таки у меня не идет, а у всех идет этот пример Если бы он работал, то этот алгоритм я думаю на многое можно было бы применить!!! Не знаю что добавить. Кто может обьясните, пожалуйста, почему у меня на MsgBox хук ставится а на DeleteFileA нет, хотя не у кого больше проблем нет с этой функцией, кстати и на SHFileOperationA() у меня хук тоже не работает. Гости прийдут сегодня и все!!! |
Сообщ.
#75
,
|
|
|
Слушай, а ты точно ничего не перепутал? У меня все отлично компилится и работает!
Вот исходники и компилированный проект. В сообщении "Не закрывать, пока идет работа!" кнопку Ок не давить, пока удаляешь файлы (т.е. не закрывать). Да чего я объясняю, все итак понятно. Кстати, а как ты хук на SHFileOperationA ставишь? Там же целая структура есть.. Кроме того, замечено, что DLL'ка как-то не сразу выгружается: Файл (DLL) не удалялась пару минут... 2All: Ну кто же знает, как поставить хук на SHFileOperationA? Добавлено в : Кстати, компилино в Delphi 7... Прикреплённый файлDeleteFileHook.zip (31.53 Кбайт, скачиваний: 154) |
Сообщ.
#76
,
|
|
|
У кого еще не работает?
|
Сообщ.
#77
,
|
|
|
Цитата ZShell, 27.01.04, 01:23 Слушай, а ты точно ничего не перепутал? ? Ну я ж даже строку указал, которая не выполняется. Нетрудно понять, что без неё хук не сработает, т.к. он ставится после этого условия. |
Сообщ.
#78
,
|
|
|
У меня не работает
|
Сообщ.
#79
,
|
|
|
У меня тоже не работает!!!
|
Сообщ.
#80
,
|
|
|
Хм.... А у вас не работает и мой откомпилиный пример?
Тогда почему у меня все работает ?! XP Professional, Microsoft Windows XP [Версия 5.1.2600], Delphi 7. Добавлено в : Да! Ну как там насчет хука на SHFileOperationA? |
Сообщ.
#81
,
|
|
|
Вот, хотел поэкспериментировать (может, мне с Делфи повезло), ан нет, вот пример, компилиный в Delphi3 Client/Server (с исходником, пришлось немного изменить, правда) - работает отлично!
Добавлено в : Оба примера (компилиный в Delphi 3 и Delphi 7 (есть еще и 5, но это уже борщ:)) ОТЛИЧНО РАБОТАЮТ в Win98SE/WinME/WinXP - проверено лично, а врать мне резону нет! Т.е. это не должно зависить ни от компилятора, ни от ОСи. Но все же можно попробовать компилировать исходник для Delphi 3 в Delphi 7 - вдруг заработает? (У меня компилится и работает). Опять таки при условии использования ИМЕННО функции DeleteFileA(), например: procedure TForm1.Button1Click(Sender: TObject); var f: File; begin AssignFile(f,'file.txt'); ReWrite(f); CloseFile(f); DeleteFile('file.txt'); end; А теперь давайте всем миром навалимся на SHFileOperationA - IMHO, она используется чаще и, отсюда следует, ее применение гораздо интереснее (перехваты не только удаления, реализованного в Виндовс, но копирования и перемещения файлов!!). Добавлено в : Оба примера (компилиный в Delphi 3 и Delphi 7 (есть еще и 5, но это уже борщ:)) ОТЛИЧНО РАБОТАЮТ в Win98SE/WinME/WinXP - проверено лично, а врать мне резону нет! Т.е. это не должно зависить ни от компилятора, ни от ОСи. Но все же можно попробовать компилировать исходник для Delphi 3 в Delphi 7 - вдруг заработает? (У меня компилится и работает). Опять таки при условии использования ИМЕННО функции DeleteFileA(), например: procedure TForm1.Button1Click(Sender: TObject); var f: File; begin AssignFile(f,'file.txt'); ReWrite(f); CloseFile(f); DeleteFile('file.txt'); end; А теперь давайте всем миров навалимся на SHFileOperationA - ее использование гораздо более широко, да и она-то как раз и является "стандартной удалялкой файлов в Винде". А как вам еще и перехват копирования и переноса файлов?! Добавлено в : (Я не тормоз, это у меня инет такой!;)) Прикреплённый файлFileDeleteHookD3_31kb_.zip (31.11 Кбайт, скачиваний: 149) |
Сообщ.
#82
,
|
|
|
Вот для отлова SHFileOperationA:
library Mouse_mes; uses sysutils, windows, messages, shellapi; type TImageImportDescriptor=packed record OriginalFirstThunk: DWORD; TimeDateStamp: DWORD; ForwarderChain: DWORD; Name: DWORD; FirstThunk: DWORD; end; PImageImportDescriptor=^TImageImportDescriptor; var hook: HHook = 0; PEHeader:PImageNtHeaders; ImageBase:cardinal; //function MyHookProcedure(lpFileName: PChar): boolean;stdcall; function MyHookProcedure(const lpFileOp: TSHFileOpStructA): Integer; stdcall; begin MessageBox(HWND(nil), 'DeleteFile(): call', 'Bla-bla', MB_OK); ExitProcess(0); result := 0; end; procedure ProcessImports(PImports:PImageImportDescriptor); var PImport:PImageImportDescriptor; PRVA_Import:LPDWORD; ProcAddress:pointer; Temp_Cardinal:cardinal; begin{1} ProcAddress := GetProcAddress(GetModuleHandle('shell32.dll'), 'SHFileOperationA'); PImport:=PImports; while PImport.Name <> 0 do begin{2} PRVA_Import:=LPDWORD(pImport.FirstThunk+ImageBase); while PRVA_Import^ <> 0 do begin{3} if PPointer(PRVA_Import) ^= ProcAddress then begin{4} VirtualProtect(PPointer(PRVA_Import),4,PAGE_READWRITE,Temp_Cardinal); PPointer(PRVA_Import)^:=@MyHookProcedure; VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal); end;{1} Inc(PRVA_Import); end;{2} Inc(PImport); end;{3} end;{4} procedure DllEntryPoint(reson:longint);stdcall; begin case reson of DLL_PROCESS_ATTACH: begin DisableThreadLibraryCalls(hInstance); ImageBase := GetModuleHandle(nil); PEHeader := pointer(int64(ImageBase) + PImageDosHeader(ImageBase)._lfanew);//pe header ProcessImports(pointer(PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress+ImageBase)); end; end; end; function nexthook(code:integer;wParam,lParam:longint):longint;stdcall; begin result:=callnexthookex(hook,code,wParam,lParam); end; procedure sethook(flag:bool);export; stdcall; begin if flag then hook:=setwindowshookex(wh_getmessage,@nexthook,hInstance,0) else begin unhookwindowshookex(hook); hook:=0; end; end; exports sethook; begin DLLProc:=@DllEntryPoint; DllEntryPoint(DLL_PROCESS_ATTACH) end. Все тоже самое! Добавлено в : Exe для проверки: uses ShellAPI; function SimpleCopyFiles(_pfrom,_pto: string): boolean; var lpFileOp: TSHFILEOPSTRUCT; begin with lpFileOp do begin Wnd:=form1.handle; wFunc:=FO_COPY; pFrom:=PChar(_pfrom); pTo:=PChar(_pto); fFlags:=0; fFlags:=(fFlags OR FOF_RENAMEONCOLLISION); end; if SHFileOperation(lpFileOp)<>0 then Result:=FALSE else Result:=TRUE; end; onClick: SimpleCopyFiles('aaa', 'bbb'); |
Сообщ.
#83
,
|
|
|
:ZShell
Нет. И все-таки этот пример у меня не работает... |
Сообщ.
#84
,
|
|
|
:xZero
А вот пример с SHFileOperationA идет без проблем если использую указанный пример. Но если копирую через систему, то не работает. Видать там всеже не эта функция используется. Может кто знает. Хотя меня интересует скорее процес удаления А может я и ошибаюсь насчет системы. Кстати попробовал половить другие функции!!! Все ловится кроме DeleteFileA ->>> Паралокс! B) Добавлено в : Знаете. Хотя сейчас мне это уже не нужно(Слава богу музыка осталась цела), я все равно хочу добраться до истины.... Тема та довольно интересная. |
Сообщ.
#85
,
|
|
|
Тема очень интересная. Сейчас кстати проверю код xZero
|
Сообщ.
#86
,
|
|
|
Может еще SHFileOperationW использоваться.. Или у него еще родственные функции есть...
|
Сообщ.
#87
,
|
|
|
Прикольно... Эксперименты с SHFileOperation привели у меня к следующему:
SHFileOperationA сработала 1 раз, поймав удаление файла с длинным именем. И это с учетом того, что я гонял файлы туда-сюда, удалял и создавал их средствами системы (WinXP) по многу раз. Т.е. что-то тут не так, раз хук срабатывает "раз на миллион". SHFileOperationW (с использованием WideChar) не сработала ни разу! Хотя, может, я мало пробовал. Но мы же боремся за срабатывание с первого раза, не так ли? Люди, у кого есть MSDN, что там про нее пишуть? На microsoft лезть не хочу - тормозит ужасно! |
Сообщ.
#88
,
|
|
|
SHFileOperationW у меня тоже не работает. А кстати что такое MSDN?
|
Сообщ.
#89
,
|
|
|
Возможно, не успевает поймать все, т.к. липнет к эксплореру".
Добавлено в : Цитата Du-Xa @ 29.01.04, 16:34 А кстати что такое MSDN? Все, о чем мы говорили в этой ветке - может это неи то, с чего надо начинать? Может я неправильно выразлся! Но я хотел сказать, что на протяжении этой ветки никто из нас ни разу не открыл спецификацию ре файлов и не поглядел её, ни кто не попытался поизучать подобные темы, поискав их в инете - верно? Мы будем изучать это, такими шагами, очень и очень долго! Может мы постараемся все понять с нуля!? А то мы просто изменяем в данном коде одно, два слова и пытаемся дождаться когда же он заработает - верно? |
Сообщ.
#90
,
|
|
|
Вы правы. Мы стоим на одном месте, меняя слова, но не понимая сути. Но я еще нигде не видел инфы по этому поводу, и по этому здесь и задал такой вопрос. Я с hook'ами некогда не работал раньше, и вот понадобилось. MSDN часто слышал это слово, понимаю примерно так: описание windows функций, типа огромная библиотека по windows для програмистов - это так?...
|
Сообщ.
#91
,
|
|
|
На Microsоft лезть опасно, там сейчас вирус ходит
|
Сообщ.
#92
,
|
|
|
Цитата Andrey_Kun @ 31.01.04, 10:43 На Microsоft лезть опасно, там сейчас вирус ходит А там эту MSDN скачать можно или она уж очень-очень большая... Кстати а что он делает этот вирус-не трой ли, а то у меня у сайта почему-то кем то пароль сменился. Я парился неделю, просил админов выслать мне новый на другой ящик. |
Сообщ.
#93
,
|
|
|
Цитата Du-Xa @ 31.01.04, 15:39 А там эту MSDN скачать можно или она уж очень-очень большая. На ваделенке можно. 1,6 гектара. Качай.. |
Сообщ.
#94
,
|
|
|
Для начала, что бы не создавать новой ветки, можно сюда бросать все статьи на тему перехвата и хуков (лучше ссылки). Когда каждый из нас с десяток статей прочитает и перепробует все что в них написано, то можно будет пробовать самому. Так же по этой теме нам неоюходимо описание формата испольняемых фалов. Так что уже можно начинать.
|
Сообщ.
#95
,
|
|
|
Предлогаю всем начать заливать на http://forum.sources.ru/ MSDN.
Не весь конечно, но по чуть четь, кто сколько сможет. |
Сообщ.
#96
,
|
|
|
А зачем заливать, если можно с Microsoft с таким же успехом прочитать. Может лучше ссылки на интересные странички пооставлять с этого MSDN?
|
Сообщ.
#97
,
|
|
|
Кстати у меня при использовании хука на SHFileOperation комп летал, поэтому мне не верится что это может быть тормоз системы.
|
Сообщ.
#98
,
|
|
|
Короче в коде гдето есть ошибка, это польбому
Кстати а с С++ коды никто переводить на Делфи не пробовал? |
Сообщ.
#99
,
|
|
|
Какие коды, любые, пробовал. Но я в си не силен.
|
Сообщ.
#100
,
|
|
|
Ну... Может и так. Но зачем нам, например, спецификация ЕХЕ для перехвата WinAPI? Или я не совсем понимаю что-то..
|
Сообщ.
#101
,
|
|
|
Цитата Не совсем. А как ты их собрался перехватывать не зная, что и куда писать и ваще не зная как устроен РЕ файл? ZShell, 2.02.04, 07:49 Но зачем нам, например, спецификация ЕХЕ для перехвата WinAPI? Или я не совсем понимаю что-то.. |
Сообщ.
#102
,
|
|
|
2 Alex а ты можешь чтонибудь поконкретнее посоветовать
|
Сообщ.
#103
,
|
|
|
Цитата Andrey_Kun, 2.02.04, 13:47 2 Alex а ты можешь чтонибудь поконкретнее посоветовать А что советовать, хер его знает, у меня всё нормально работает, я даже скиншот давал, попросил друга проверить - у него то работает, то - нет. (кстати у меня тоже только в ФАРе работает ) В разделе WinApi есть такая же тема от Demo_S, но там тоже всё глухо - короче непонятно, толь винда функции другие какие-нибудь вызывает, то ли не для всех процессов хук ставится. ИМХО мужно делать не так, т.е. не таблицы импортов править в каждом процессе, а таблицу экспорта в kernel32.dll, как это сделать знаю только для 9х, и то геммора полно, а для лигнейки НТ нужно драйвер писать - пример нужно искать... |
Сообщ.
#104
,
|
|
|
Alex: А для 9x не подбросищь примерчик?
|
Сообщ.
#105
,
|
|
|
Цитата Song,4.01.04, 20:50 Цитата xZero, 4.01.04, 20:25 и готовь .... ээээ ммм, ладно шутю =) Да правильно-правильно, пусть готовит ИЮХК[CODE] Цитата Цитата Цитата |
Сообщ.
#106
,
|
|
|
GigABytE: Спасибо. Я все понял.
|
Сообщ.
#107
,
|
|
|
Цитата Du-Xa, 2.02.04, 18:13 Alex: А для 9x не подбросищь примерчик? Его ещё сделать надо, завтра постараюсь... ЗЫ. Я не Alex, а .alex... |
Сообщ.
#108
,
|
|
|
Буду очень благодарен .alex
|
Сообщ.
#109
,
|
|
|
Короче засада, я часа 3 убил на создание примера, а он собака не работает! В общем, всё перехватывается на ура, т.е. если создать свою прогу которая вызывает DeleteFile() – то всё отлично ловится, но ни для ФАРа, ни для Explorer’a, ни нехера не работает!!! Я смотрел с помощь ApiSpy’я работу ФАРа и Explorer’a, и ваще офигел – они не вызывают ни DeleteFile(), ни SHFileOperation() (хотя «грузят» их с помощью GetProcAddress()), и ваще никакой какой-либо другой функции которая может удалить файл, хотя все другие функции для работы с файлами, такие как CreateFile()/ReadFile()/…, они вызывают и используют. Надо думать…
ЗЫ. Попробую спросить на RSDN |
Сообщ.
#110
,
|
|
|
2 Alex ты свой пример скинь на сайт
|
Сообщ.
#111
,
|
|
|
Цитата Andrey_Kun, 4.02.04, 05:46 2 Alex ты свой пример скинь на сайт Пожалуйста. ЗЫ. в коде подробные комментарии ЗЫЫ. работает только для 9х! Прикреплённый файлHiJack_DeleteFile.zip (33.25 Кбайт, скачиваний: 156) |
Сообщ.
#112
,
|
|
|
Короче, вот что мне ответили на RSDN:
Цитата Ищи в разделе Shell Extensions тему "Copy Hook Handlers". Normally, users and applications can copy, move, delete, or rename folders with few restrictions. By implementing a copy hook handler, you can control whether or not these operations take place. For instance, implementing such a handler allows you to prevent critical folders from being renamed or deleted. ЗЫ. Так что дерзай... ЗЗЫ. надеюсь MSDN у тебя есть? |
Сообщ.
#113
,
|
|
|
A kak otlavlivatj sobsenija pri instalacii menja interesuet kakie faili kuda kupirujutsa i cto propisalosj v registr
|
Сообщ.
#114
,
|
|
|
Цитата HELL @ 18.02.04, 07:07 A kak otlavlivatj sobsenija pri instalacii menja interesuet kakie faili kuda kupirujutsa i cto propisalosj v registr RegMon, FileMon + source |
Сообщ.
#115
,
|
|
|
Не совсем понял дайте хотябы какой-то кусочек программы на делфи что бы отловить событие на копирование(если ето тоже самое что и при инсталяции и будет ли она различать копирую я файл или ето инсталяция)
ПЛИЗ-З-З |
Сообщ.
#116
,
|
|
|
RegMon, FileMon это такие утилиты, которые помогают отловить работу с файлами (и) или реестром.
Есть еще рульная прога regshot. сравнивает реестр до и после инсталяции проги, находит отличия. Хотя такая утилита есть где-то в винде встроенная. А насчет разницы копирования и инсталяции, то filemon'у все пофигу. Он смотрит с какими файлами ты общаешся и по какому смещению вот и все. |
Сообщ.
#117
,
|
|
|
Тоесть если прога будет запущена и будет постоянно просматривать какие файлы куда переместились то она не различит толи я скопировал грппу файлов толи я происталировал программу
|
Сообщ.
#118
,
|
|
|
2 DuXa реально работает LockFile
|
Сообщ.
#119
,
|
|
|
А если мне нужно свою дату для проги придумать, то что мне отлавливать?
думал procedure GetLocalTime(var lpSystemTime: TSystemTime); Но не работает. Хочу чтобы 2Gis(Карта города) думала что я ее запускаю в прошлом году и в ней бы работали все функции (поиск). |
Сообщ.
#120
,
|
|
|
просто перед запуском меняешь тек. дата, а после меняешь обратно
|
Сообщ.
#121
,
|
|
|
Не. Функциями проги я буду пользоваться во время всей её работы, и при этом там всякие word'ы работать правильно не будут (а может что-нибудь shareware по хитрее сделанное). Дату вставлю, забуду что левая и капут. Мне нужно чтобы эта ерунда не мешала другим прогам.
|
Сообщ.
#122
,
|
|
|
Я СДЕЛАЛ ЭТО, не то что вы подумали
Прикреплённый файлno_del.zip (18.17 Кбайт, скачиваний: 227) |
Сообщ.
#123
,
|
|
|
2 Скачали, Работает? Кстати это только для НТ\ХР\2000
|
Сообщ.
#124
,
|
|
|
Цитата Andrey_Kun @ 31.03.04, 03:15 2 Скачали, Работает? Кстати это только для НТ\ХР\2000 А где *.pas, *.dpr? |
Сообщ.
#125
,
|
|
|
При у даление файла появляться диалог!
Е сли класс окна=диалог и текст начинаеться с 'Вы дествительно хотите удалить...' то закрыть этот диалог!:D Может ещё чтонибудь отследить можно. |
Сообщ.
#126
,
|
|
|
Цитата tigrix @ 31.03.04, 09:02 При у даление файла появляться диалог! Е сли класс окна=диалог и текст начинаеться с 'Вы дествительно хотите удалить...' то закрыть этот диалог!:D Может ещё чтонибудь отследить можно. А что случится если это окно не появляется? =) |
Сообщ.
#127
,
|
|
|
я вас чего то не пойму. Просто функция DeleteFileA перехваьтывается и при удалении файла выдаётся мсжбокс "Не надо удалять .. файл"
|
Сообщ.
#128
,
|
|
|
2 Andrey_kun: работает, выдает msg и не удаляется.
|
Сообщ.
#129
,
|
|
|
в 2000 ???
|
Сообщ.
#130
,
|
|
|
Не не пашет у меня Xp !!!
|
Сообщ.
#131
,
|
|
|
Скачал, набираю в windows commandere команду del имя_файла, так вот удаляет и нет проблем, вот, потом нажимаю DELETE в нем же (windows commander) появляется сообщение, что удалять не надо, а файл все равно удаляется . В итоге работает только по SHIFT+DELETE, не удаляется. вот.
|
Сообщ.
#132
,
|
|
|
2 Andrey_Kun: у меня Вин2000, пытался удалить через командную строку, эксплорером, вин_командером (с шифтом и без) - результат один: "НЕ УДАЛЯЕТСЯ", "ОТКЗАНО В ДОСТУПЕ".
|
Сообщ.
#133
,
|
|
|
Значит работает у большинства. Просто он исп. другие АПИ. Но главное сама система перехвата работает
|