![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Перехват функции в собственном приложенииDelphi , Компоненты и Классы , Процедуры и ФункцииПерехват функции в собственном приложении
Оформил: DeeCo type TSaveRedir = packed record Addr: Pointer; Bytes: array[0..4] of Byte; end; PSaveRedir = ^TSaveRedir; procedure RedirectCall(FromAddr, ToAddr: Pointer; SaveRedir: PSaveRedir); var OldProtect: Cardinal; NewCode: packed record JMP: Byte; Distance: Integer; end; begin if not VirtualProtect(FromAddr, 5, PAGE_EXECUTE_READWRITE, OldProtect) then RaiseLastWin32Error; 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); if not VirtualProtect(FromAddr, 5, OldProtect, OldProtect) then RaiseLastWin32Error; end; procedure UndoRedirectCall(const SaveRedir: TSaveRedir); var OldProtect: Cardinal; begin if not VirtualProtect(SaveRedir.Addr, 5, PAGE_EXECUTE_READWRITE, OldProtect) then RaiseLastWin32Error; Move(SaveRedir.Bytes, SaveRedir.Addr^, 5); if not VirtualProtect(SaveRedir.Addr, 5, OldProtect, OldProtect) then RaiseLastWin32Error; end; // Example: Replace Application.MessageBox with your own. function MyNewMessageBox(Self: TApplication; const Text, Caption: PChar; Flags: Longint): Integer; begin ShowMessage('New Messagebox'); //.... end; procedure TForm1.Button1Click(Sender: TObject); begin Application.MessageBox('You'll never see this Text / Diesen Text wirst du nie sehen'', '...', MB_OK); end; var S: TSaveRedir; initialization RedirectCall(@TApplication.MessageBox, @MyNewMessageBox, @S); finalization UndoRedirectCall(S); Пример использования библиотеки runtime Delphi для перехвата функции в своей собственной приложении. Код определяет два процедура: Вот что каждый procedure делает:
Procedure выполняет следующие действия:
* Проверяет, можно ли изменить виртуальную память защиты для оригинальной функции.
* Если можно, то восстанавливает параметры оригинальной функции из записи В примере кода procedure Функция Обработчик события В статье описывается способ перехвата функций в собственном приложении с помощью реализации кастомной функции 'MessageBox' на примере языка программирования Delphi. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Процедуры и Функции ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |