
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Страницы: (9) 1 [2] 3 4 ... 8 9 все ( Перейти к последнему сообщению ) |
Сообщ.
#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() - попробуй перехватить её ![]() У меня в ФАРе работает... |