Содержание материала

Приложение:
 

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

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить