Skip to content

Instantly share code, notes, and snippets.

@HoShiMin
Last active August 29, 2015 14:19
Show Gist options
  • Save HoShiMin/c1b94cdf4f5b9020d418 to your computer and use it in GitHub Desktop.
Save HoShiMin/c1b94cdf4f5b9020d418 to your computer and use it in GitHub Desktop.
Пример перехвата MessageBoxW средствами HookAPI.pas
library HookLib;
{
Это пример библиотеки, перехватывающей функцию MessageBoxW средствами HookAPI.
}
uses
Windows,
HookAPI,
MicroDAsm;
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
// Эти флаги нужны только для вырезания ненужного мусора из dll'ки, на функционал не влияют:
{$SETPEFLAGS $0002 or $0004 or $0008 or $0010 or $0020 or $0200 or $0400 or $0800 or $1000}
{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
var
// Адрес оригинальной функции:
MessageBoxW: Pointer;
// Адрес скопированного оригинального начала (использовать, если нужно вызвать оригинальную функцию):
TrueMessageBoxW: function(Handle: THandle; Text, Caption: PChar; Flags: LongWord): BOOL; stdcall;
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
// Перехваченная функция, которой будет передано управление при попытке вызова MessageBoxW:
function HookedMessageBoxW(Handle: THandle; Text, Caption: PChar; Flags: LongWord): BOOL; stdcall;
var
NewText, NewCaption: string;
begin
// Подменяем параметры (меняем текст):
NewText := 'Функция MessageBoxW перехвачена!' + #13#10 +
'Оригинальный текст:' + #13#10 +
Text + #13#10 +
'Оригинальный заголовок:' + #13#10 +
Caption;
NewCaption := 'LOL HOOKED :3';
// Вызываем оригинальную функцию с новыми параметрами:
Result := TrueMessageBoxW(Handle, PChar(NewText), PChar(NewCaption), MB_ICONASTERISK);
end;
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
// Обработка загрузки и выгрузки библиотеки
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
// Инициализация библиотеки:
procedure DLLMain(dwReason: LongWord);
begin
case dwReason of
// При загрузке библиотеки:
DLL_PROCESS_ATTACH:
begin
// Получаем адрес функции в библиотеке:
MessageBoxW := GetProcAddress(GetModuleHandle('user32.dll'), 'MessageBoxW');
// Перехватываем MessageBoxW:
SetHook(MessageBoxW, @HookedMessageBoxW, @TrueMessageBoxW);
end;
// При выгрузке библиотеки:
DLL_PROCESS_DETACH:
begin
// Снимаем перехват:
UnHook(MessageBoxW, @TrueMessageBoxW);
end;
end;
end;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Этот код получит управление при загрузке библиотеки:
begin
// Назначаем DLLMain для обработки событий загрузки и выгрузки библиотеки:
DllProc := @DLLMain;
DllProc(DLL_PROCESS_ATTACH);
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment