|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Перехват Api. Мониторинг файловой системы
Доброго времени суток!
Хочу сделать в своем приложении мониторинг файловой системы: удаление, перемещение, переименование, копирование файлов и дирректорий. Хотелось бы узнать две вещи: - Какие функции надо перехватить? - В какой процесс внедрить свою длл, и как это проще сделать. В идеале внедрить свою dll. Т.е. надо из юзер мода. Без использования драйверов. Если метод будет палиться антивирусом, не страшно, главное чтобы корректно работало. ОС Windows 7. Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} type TSaveRedir = packed record Addr: Pointer; Bytes: array[0..4] of Byte; end; type PSaveRedir = ^TSaveRedir; var S: TSaveRedir; procedure RedirectCall(FromAddr, ToAddr: Pointer; SaveRedir: PSaveRedir); var OldProtect: Cardinal; NewCode: packed record JMP: Byte; Distance: Integer; end; begin VirtualProtect(FromAddr, 5, PAGE_EXECUTE_READWRITE, OldProtect); if Assigned(SaveRedir) then begin SaveRedir^.Addr := FromAddr; Move(FromAddr^, SaveRedir^.Bytes, 5); end; NewCode.JMP := $E9; NewCode.Distance := PChar(ToAddr) - PChar(FromAddr) - 5; Move(NewCode, FromAddr^, 5); VirtualProtect(FromAddr, 5, OldProtect, OldProtect); end; procedure UndoRedirectCall(const SaveRedir: TSaveRedir); var OldProtect: Cardinal; begin VirtualProtect(SaveRedir.Addr, 5, PAGE_EXECUTE_READWRITE, OldProtect); Move(SaveRedir.Bytes, SaveRedir.Addr^, 5); VirtualProtect(SaveRedir.Addr, 5, OldProtect, OldProtect); end; function MyNewMessageBox(Self: TApplication; const Text, Caption: PChar; Flags: Longint): Integer; begin ShowMessage('New Messagebox'); Result := 0; end; procedure TForm1.Button1Click(Sender: TObject); begin Application.MessageBox('test', '!!!', MB_OK); end; initialization RedirectCall(@TApplication.MessageBox, @MyNewMessageBox, @S); finalization UndoRedirectCall(S); end. Последний раз редактировалось who_know777, 07.04.2021 в 20:59. |