Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хуки 
V
    Опции темы
darkmamba
Дата 2.3.2009, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 16.10.2008

Репутация: нет
Всего: 1



Привет уважаемые формчане! Поделитесь с нубом полезной информацией, надо сделать хук на месаджбокс (для простоты взял именно его), чтобы понять как это работает а с чем его есть нужно, перелопатил тонну страничек про хуки, но так толком ничего и непонял, может ктонибуть объяснить все по порядку, что нужно сделать чтоб поймать месаджбокс, и сделать с ним ченибуть (просто закрыть или сменить текст в нем), отдельное спасибо тем кто отзовется помочь, не буду против от примерчика, я нехочу чтобы вы все сделали за меня но и нехочу чтобы дали просто ссылки на msdn или другие подобные справочники, я просто немогу все переварить в глове, нужны образы ) Спасибо за внимание, надеюсь хоть у кавонибуть на форуме найдется пара тройки минут)
PM MAIL   Вверх
MetalFan
Дата 2.3.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



ищи по форуму по ключевым словам: перехват API функций, advApiHook
уже было.
з.ы. все не так просто, как кажется... и "две-три минуты" тут никак не хватит


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
darkmamba
Дата 3.3.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 16.10.2008

Репутация: нет
Всего: 1



MetalFan, согласен, но нужно с чего то начинать

Вот пример, прокоментируйте пожалуйста, а то он не работет (с notepad.exe)

Код

library Mouse_mes; 

uses 
  sysutils, 
  windows, 
  messages; 

type 
   TImageImportDescriptor=packed record 
    OriginalFirstThunk    : DWORD; 
    TimeDateStamp         : DWORD; 
    ForwarderChain        : DWORD; 
    Name                  : DWORD; 
    FirstThunk            : DWORD; 
  end; 
  PImageImportDescriptor=^TImageImportDescriptor; 

var filename:array[0..max_path-1] of char; 
    hook:HHook=0; 
    PEHeader:PImageNtHeaders; 
    ImageBase:cardinal; 

function MyHookProcedure(hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; 
stdcall; 
begin 
  result:=MessageBoxA(0, 'Notepad', 'my hook', 0); 
  //Но уже через нашу табл. импорта 
end; 

procedure ProcessImports(PImports:PImageImportDescriptor); 
    Var 
        PImport:PImageImportDescriptor; 
        PRVA_Import:LPDWORD; 
        ProcAddress:pointer; 
        Temp_Cardinal:cardinal; 
    begin{1} 
      ProcAddress:=GetProcAddress(GetModuleHandle('USER32.DLL'), 'MessageBoxA'); 
      PImport:=PImports; 
      while PImport.Name<>0 do 
        begin{2} 
          PRVA_Import:=LPDWORD(pImport.FirstThunk+ImageBase); 
          while PRVA_Import^<>0 do 
          begin{3} 
            if PPointer(PRVA_Import)^=ProcAddress 
               then 
                 begin{4} 
                   VirtualProtect(PPointer(PRVA_Import),4,PAGE_READWRITE,Temp_Cardinal); 
                   PPointer(PRVA_Import)^:=@MyHookProcedure; //пишем свою... 
                  VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal); 
                 end;{1} 
            Inc(PRVA_Import); 
          end;{2} 
       Inc(PImport); 
   end;{3} 
end;{4} 

procedure DllEntryPoint(reson:longint);stdcall; 
begin 
 case reson of 
  DLL_PROCESS_ATTACH: 
     begin 
      DisableThreadLibraryCalls(hInstance); 
      ZeroMemory(@FileName, SizeOf(FileName)); 
      GetModuleFileName(GetModuleHandle(nil), @FileName, SizeOf(FileName)); 

         if Pos('NOTEPAD.EXE',AnsiUpper(@FileName))<>0 then //сейчас я хочу попробовать все это дело надо  нотепадом 
         begin 
           ImageBase:=GetModuleHandle(nil); 
           PEHeader:=pointer(int64(ImageBase)+PImageDosHeader(ImageBase)._lfanew);//pe header 
          ProcessImports(pointer(PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress+ImageBase)); 
          end; 
      end; 
  end; 
end; 

function nexthook(code:integer;wParam,lParam:longint):longint;stdcall; 
begin 
  result:=callnexthookex(hook,code,wParam,lParam); 
end; 

procedure sethook(flag:bool);export; stdcall; 
begin 
 if flag then 
    hook:=setwindowshookex(wh_getmessage,@nexthook,hInstance,0) 
 else 
   begin 
    unhookwindowshookex(hook); 
    hook:=0; 
   end; 
end; 

exports sethook; 

begin 
  DLLProc:=@DllEntryPoint; 
  DllEntryPoint(DLL_PROCESS_ATTACH) 
end. 

EXE: 

program Project2; 
uses windows; 

var 
   sethook:procedure(flag:bool)stdcall; 
   hDll:hModule; 

begin 
  hDll:=LoadLibrary('Mouse_mes.dll'); 
  @sethook:=GetProcAddress(hDll, 'sethook'); 
  sethook(true); 
  messagebox(0,'Не закрывай, пока идет работа','',0); 
  sethook(false); 
  FreeLibrary(hDll); 
end. 

PM MAIL   Вверх
darkmamba
Дата 4.3.2009, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 16.10.2008

Репутация: нет
Всего: 1



Бог с этим примером, вот метод сплайсинг

Код

[size=6]DLL:[/size]

const
  THREAD_ALL_ACCESS      = $001F03FF;
  THREAD_SUSPEND_RESUME  = $00000002;

type
  PFunctionRestoreData = ^ TFunctionRestoreData;
  TFunctionRestoreData = packed record
    Address:Pointer;
    val1:Byte;
    val2:DWORD;
   end;

var
SystemFunctionBridge:TFunctionRestoreData;

procedure MyFunction;
begin
showmessage('Ôóíêöèÿ ïåðåõâà÷åíà');
end;

function SetCodeHook(ProcAddress, NewProcAddress: pointer; RestoreDATA:PFunctionRestoreData):boolean;
var
  OldProtect, JMPValue:DWORD;
begin
  Result:=False;
  if not VirtualProtect(ProcAddress,5,PAGE_EXECUTE_READWRITE,OldProtect) then exit;
  JMPValue := DWORD (NewProcAddress) - DWORD (ProcAddress) - 5;
  RestoreDATA^.val1:= Byte(ProcAddress^);
  RestoreDATA^.val2:= DWORD(Pointer(DWORD(ProcAddress)+1)^);
  RestoreDATA^.Address:=ProcAddress;
  byte(ProcAddress^):=$E9;
  DWORD(Pointer(DWORD(ProcAddress)+1)^):=JMPValue;
  Result:=VirtualProtect(ProcAddress,5,OldProtect,OldProtect);
end;

function SetProcedureHook(ModuleHandle: HMODULE; ProcedureName : PChar; NewProcedureAddress :Pointer;RestoreDATA : PFunctionRestoreData) :Boolean;
var
  ProcAddress:Pointer;
begin
  ProcAddress:=GetProcAddress(ModuleHandle,ProcedureName);
  Result:=SetCodeHook(ProcAddress,NewProcedureAddress,RestoreDATA);
end;

function LoadLibrary_Ex(ProcessID:DWORD;LibName:PChar):boolean;
var
  pLL,pDLLPath:Pointer;
  hProcess,hThr:THandle;
  LibPathLen,_WR,ThrID:DWORD;
begin
  Result:=False;
  LibPathLen:=Length(string(LibName));
  hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
  if hProcess=0 then exit;
  pDLLPath:=VirtualAllocEx(hProcess,0,LibPathLen+1,MEM_COMMIT,PAGE_READWRITE);
  if DWORD(pDLLPath)=0 then exit;
  pLL:=GetProcAddress(GetModuleHandle(kernel32),'LoadLibraryA');
  WriteProcessMemory(hProcess,pDLLPath,LibName,LibPathLen+1,_WR);
  hThr:=CreateRemoteThread(hProcess,0,0,pLL,pDLLPath,0,ThrID);
  if hThr=0 then exit;
  Result:=CloseHandle(hProcess);
end;

function UnHookCodeHook(RestoreDATA:PFunctionRestoreData):Boolean;
var
  ProcAddress:Pointer;
  OldProtect,JMPValue:DWORD;
begin
  Result:=False;
  ProcAddress:=RestoreDATA^.Address;
  if not VirtualProtect(ProcAddress,5,PAGE_EXECUTE_READWRITE,OldProtect) then exit;
  Byte(ProcAddress^):=RestoreDATA^.val1;
  DWORD(Pointer(DWORD(ProcAddress)+1)^):=RestoreDATA^.val2;
  Result:=VirtualProtect(ProcAddress,5,OldProtect,OldProtect);
end;

procedure DLLEntryPoint(dwReason:DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
     begin
      SetProcedureHook(GetModuleHandle('user32.dll'),'MessageBoxA',@MyFunction,@SystemFunctionBridge);
     end;
    DLL_PROCESS_DETACH:
     begin
      UnHookCodeHook(@SystemFunctionBridge);
     end;
   end;
end;

begin
   DllProc:= @DLLEntryPoint; 
   DLLEntryPoint(DLL_PROCESS_ATTACH);
end.

[size=6]EXE:[/size]

procedure TForm1.Button1Click(Sender: TObject);
begin
  LoadLibrary(pchar(ExtractFileDir(Application.ExeName)+'\'+'ИМЯ.dll'));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
messagebox(0,'123','321',mb_ok);
end;


Вроде перехватывает, НО почемуто вылазит 2 раза showmessage, может это из-за того что это относится к классу messageBox ? посмотрите плз еще код может где ошибка?

Это сообщение отредактировал(а) darkmamba - 4.3.2009, 20:50
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.