Advertisement
Guest User

Untitled

a guest
Apr 25th, 2015
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.88 KB | None | 0 0
  1. library Lib;
  2.  
  3. {
  4.  
  5.   Это пример библиотеки, перехватывающей функцию MessageBoxW средствами HookAPI.
  6.  
  7. }
  8.  
  9. uses
  10.   Windows,
  11.   HookAPI,
  12.   MicroDAsm,
  13.   ProcessAPI;
  14.  
  15. //HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
  16.  
  17. // Эти флаги нужны только для вырезания ненужного мусора из dll'ки, на функционал не влияют:
  18. {$SETPEFLAGS $0002 or $0004 or $0008 or $0010 or $0020 or $0200 or $0400 or $0800 or $1000}
  19. {$WEAKLINKRTTI ON}
  20. {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
  21.  
  22. //HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
  23.  
  24.  
  25.  
  26. var
  27.   // Адрес оригинальной функции:
  28.   MessageBoxW: Pointer;
  29.  
  30.   EnumProcesses: Pointer;
  31.   ProcessesIDs: Array of UInt;
  32.   cb : UInt;
  33.   BytesReturned: UInt;
  34.  
  35.   // Адрес скопированного оригинального начала (использовать, если нужно вызвать оригинальную функцию):
  36.   TrueMessageBoxW: function(Handle: THandle; Text, Caption: PChar; Flags: LongWord): BOOL; stdcall;
  37.   TrueEnumProcesses: function(ProcessesIDs: Pointer; cb : UInt; BytesReturned : Pointer): BOOL; stdcall;
  38.  
  39.   {_Out_  DWORD *pProcessIds,
  40.   _In_   DWORD cb,
  41.   _Out_  DWORD *pBytesReturned}
  42.  
  43. //HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
  44.  
  45.  
  46. // Перехваченная функция, которой будет передано управление при попытке вызова MessageBoxW:
  47. function HookedMessageBoxW(Handle: THandle; Text, Caption: PChar; Flags: LongWord): BOOL; stdcall;
  48. var
  49.   NewText, NewCaption: string;
  50. begin
  51.   // Подменяем параметры (меняем текст):
  52.   NewText := 'Функция MessageBoxW перехвачена!' + #13#10 +
  53.              'Оригинальный текст:'              + #13#10 +
  54.              Text                               + #13#10 +
  55.              'Оригинальный заголовок:'          + #13#10 +
  56.              Caption;
  57.  
  58.   NewCaption := 'LOL HOOKED :3';
  59.  
  60.   // Вызываем оригинальную функцию с новыми параметрами:
  61.   Result := TrueMessageBoxW(Handle, PChar(NewText), PChar(NewCaption), MB_ICONASTERISK);
  62. end;
  63.  
  64.  
  65.  
  66.  
  67. //TrueEnumProcesses: function(PProcessIDs: Pointer; cb : UInt; BytesReturned : UInt)
  68.  
  69. // Перехваченная функция, которой будет передано управление при попытке вызова EnumProcess:
  70. function HookedEnumProcesses (ProcessesIDs: Pointer; cb : UInt; BytesReturned : Pointer): BOOL; stdcall;
  71. var
  72.   OldPids: Array of UInt;
  73.   NewPids: Array of UInt;
  74.   i: UInt;
  75.   info: PROCESS_INFO;
  76. begin
  77.   // Подменяем параметры:
  78.   OldPids := ProcessesIDs;
  79.  
  80.   for i in OldPids do
  81.   begin
  82.     GetProcessInfo(i, info, true);
  83.     if Not (info.ProcessName = 'cmd.exe') Then
  84.     begin
  85.       SetLength(NewPids, Length(NewPids) + 1);
  86.       NewPids[Length(NewPids)] := i;
  87.     end;
  88.   end;
  89.  
  90.  
  91.   // Вызываем оригинальную функцию с новыми параметрами:
  92.   //Result := TrueMessageBoxW(Handle, PChar(NewText), PChar(NewCaption), MB_ICONASTERISK);
  93.   Result := TrueEnumProcesses(NewPids, cb, BytesReturned);
  94. end;
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101. //HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
  102. //                   Обработка загрузки и выгрузки библиотеки
  103. //HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
  104.  
  105. // Инициализация библиотеки:
  106. procedure DLLMain(dwReason: LongWord);
  107. begin
  108.   case dwReason of
  109.     // При загрузке библиотеки:
  110.     DLL_PROCESS_ATTACH:
  111.     begin
  112.  
  113.       SetLength(ProcessesIDs, 32767);
  114.  
  115.  
  116.       // Получаем адрес функции в библиотеке:
  117.       MessageBoxW := GetProcAddress(GetModuleHandle('user32.dll'), 'MessageBoxW');
  118.  
  119.       // Перехватываем MessageBoxW:
  120.       SetHook(MessageBoxW, @HookedMessageBoxW, @TrueMessageBoxW);
  121.       //Перехватываем EnumProcesses:
  122.       SetHook(EnumProcesses, @HookedEnumProcesses, @TrueEnumProcesses);
  123.     end;
  124.  
  125.     // При выгрузке библиотеки:
  126.     DLL_PROCESS_DETACH:
  127.     begin
  128.       // Снимаем перехват:
  129.       UnHook(MessageBoxW, @TrueMessageBoxW);
  130.     end;
  131.   end;
  132. end;
  133.  
  134. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  135.  
  136. // Этот код получит управление при загрузке библиотеки:
  137. begin
  138.   // Назначаем DLLMain для обработки событий загрузки и выгрузки библиотеки:
  139.   DllProc := @DLLMain;
  140.   DllProc(DLL_PROCESS_ATTACH);
  141. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement