Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Перехват функции в собственном приложении

Delphi , Компоненты и Классы , Процедуры и Функции

Перехват функции в собственном приложении

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

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 для перехвата функции в своей собственной приложении.

Код определяет два процедура: RedirectCall и UndoRedirectCall. Первый procedure заменяет оригинальную реализацию функции на новую, а второй - восстанавливает оригинальную реализацию.

Вот что каждый procedure делает:

  1. RedirectCall: Procedure принимает три параметра:
    • FromAddr: адрес оригинальной функции (например, TApplication.MessageBox)
    • ToAddr: адрес замены функции (например, MyNewMessageBox)
    • SaveRedir: указатель на запись TSaveRedir, которая используется для хранения параметров оригинальной функции Procedure выполняет следующие действия:
    • Проверяет, можно ли изменить виртуальную память защиты для оригинальной функции.
    • Если можно, то сохраняет параметры оригинальной функции в запись SaveRedir и заменяет оригинальную функцию на новую, которая вызывает замену функции.
  2. UndoRedirectCall: Procedure принимает один параметр: SaveRedir, который является указателем на запись TSaveRedir, содержащую параметры оригинальной функции.

Procedure выполняет следующие действия: * Проверяет, можно ли изменить виртуальную память защиты для оригинальной функции. * Если можно, то восстанавливает параметры оригинальной функции из записи SaveRedir и заменяет замену функции на оригинальную.

В примере кода procedure RedirectCall вызывается в разделе инициализации для замены функции TApplication.MessageBox на новую, называемую MyNewMessageBox. Procedure UndoRedirectCall вызывается в разделе финализации для восстановления оригинальной реализации функции TApplication.MessageBox.

Функция MyNewMessageBox - это пример замены для функции TApplication.MessageBox. Она просто отображает сообщение с пользовательским текстом.

Обработчик события Button1Click вызывает оригинальную функцию TApplication.MessageBox, но поскольку она была заменена новой реализацией в MyNewMessageBox, то будет отображаться другое сообщение, отличное от ожидаемого.

В статье описывается способ перехвата функций в собственном приложении с помощью реализации кастомной функции 'MessageBox' на примере языка программирования Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процедуры и Функции ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 03:22:08/0.0057260990142822/0