Приложение:
Code: |
//////////////////////////////////////////////////////////////////////////////// // // **************************************************************************** // * Unit Name : uMain // * Purpose : Демонстрационный пример хука и подмены API в приложениях... // * Author : Александр (Rouse_) Багель // * Version : 1.00 // **************************************************************************** //
unit uMain;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ActiveX;
const // Константы нотификаций NOTIFY_DLL_INJECT = 1; NOTIFY_API_CALL = 2; NOTIFY_API_INTERCEPT_SUCCESS = 3; NOTIFY_API_INTERCEPT_FAILED = 4;
type TLogData = record AppName: ShortString; // Имя приложения FuncName: String[8]; // Имя функции FuncPointer: Integer; // Адрес функции IP: String[15]; // IP адрес Port: Cardinal; // Порт Buff: array [0..$FFFF] of Char; // Содержимое буффера BuffSize: Word; // Размер буфера end; PLogData = ^TLogData;
THADemo = class(TForm) memReport: TMemo; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private procedure WMCopyData(var Msg: TMessage); message WM_COPYDATA; end;
function SetHook(Wnd: HWND): BOOL; stdcall; external 'HookDLL.dll' name 'SetHook'; function RemoveHook: BOOL; stdcall; external 'HookDLL.dll' name 'RemoveHook';
var HADemo: THADemo;
implementation
{$R *.dfm}
{ TForm1 }
procedure THADemo.FormCreate(Sender: TObject); begin if not SetHook(Handle) Then MessageBox(Handle, 'Невозможно установить хук.', PChar(Application.Title), MB_OK OR MB_ICONHAND); end;
procedure THADemo.FormClose(Sender: TObject; var Action: TCloseAction); begin if not RemoveHook Then MessageBox(Handle, 'Невозможно снять хук.', PChar(Application.Title), MB_OK OR MB_ICONHAND); end;
procedure THADemo.WMCopyData(var Msg: TMessage); const ReportInject = 'Библиотека внедрена в приложение "%s", функция "%s" имеет адрес: $%s'; ReportIntercept = 'Приложение: "%s" IP %s:%d размер данных = %d буфер = "%s"'; ReportSucceeded = 'Перехват функции "%s" в модуле "%s" успешен.'; ReportFailed = 'Перехват функции "%s" в модуле "%s" неуспешен!!!'; var Data: TLogData; Buffer: String; begin Data := PLogData(PCopyDataStruct(Msg.LParam)^.lpData)^; // Типы нотификаций case PCopyDataStruct(Msg.LParam)^.dwData of NOTIFY_DLL_INJECT: // Пришло уведомление о внедрении библиотеки в удаленный процесс with Data do memReport.Lines.Add(Format(ReportInject, [AppName, FuncName, IntToHex(Data.FuncPointer, 8)])); NOTIFY_API_CALL: // Уведомление о вызове функции begin SetLength(Buffer, Data.BuffSize); Move(Data.Buff[0], Buffer[1], Data.BuffSize); with Data do memReport.Lines.Add(Format(ReportIntercept, [AppName, IP, Port, BuffSize, Buffer])); end; NOTIFY_API_INTERCEPT_SUCCESS: // Уведомление о удачной подмене таблицы импорта with Data do memReport.Lines.Add(Format(ReportSucceeded, [FuncName, AppName])); NOTIFY_API_INTERCEPT_FAILED: // Уведомление о неудачной подмене таблицы импорта with Data do memReport.Lines.Add(Format(ReportFailed, [FuncName, AppName])); end; end;
end. |
Автор: Александр (Rouse_) Багель
Демонстрационный пример перехвата вызовов API функций, посредством изменения таблицы импорта.
Александр (Rouse_) Багель
https://rouse.drkb.ru
- << Назад
- Вперёд
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!