На пике славы: «взлом» поисковых систем BUG(O)R Хакер, номер #095, стр. 095-090-2 Это, как ты понимаешь, создает процесс, который в своем адресном пространстве будет содержать библиотеку main.dll. Чтобы внедрить DLL в уже запущенный процесс нужно использовать функцию InjectDll. Она предельно проста, разобраться с ней большого труда не составит, но здесь, в экспериментальном режиме, я буду использовать создание процесса с внедрением DLL. Создадим пустую DLL - этакий шаблон, от которого мы будем отталкиваться. Именно эта DLL будет устанавливать перехват на функции и содержать в себе код, который будет выполняться вместо оригинального при перехвате: Фрагмент кода главной DLL'ки procedure DLLEntryPoint(dwReason: DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin //Код, который будет выполнен, когда DLL подгрузится к процессу end; DLL_PROCESS_DETACH: begin // Соответственно, код, выполняющийся в процессе осуществления выгрузки DLL из адресного пространства процесса end; end; end; begin DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. Логично, что при получении процедурой DLLEntryPoint сообщения DLL_PROCESS_ATTACH нам нужно установить перехват на функции. HookProc('ws2_32.dll', 'recv', @Nrecv, @Trecv); HookProc('ws2_32.dll', 'send', @Nsend, @Tsend); HookProc('ws2_32.dll', 'WSARecv', @NWSARecv, @TWSARecv); HookProc('ws2_32.dll', 'WSASend', @NWSASend, @TWSASend); Описание параметров дано в комментариях к библиотеке advApiHook, его я и приведу: Установка перехвата функции из Dll в текущем процессе. lpModuleName - имя модуля; lpProcName - имя функции; NewProc - адрес функции замены; OldProc - здесь будет сохранен адрес моста к старой функции. В случае отсутствия модуля в текущем АП, будет сделана попытка его загрузить. Параметр OldProc должен содержать указатель на адрес моста, фактически он определяется в var как прототип перехватываемого кода. Соответственно, для четырех перехватываемых функций эти прототипы будут выглядеть так: var i, flag, ThID: dword; len, a, b, bt: dword; link: pChar; szString: PChar = '<a class=l href="http://www.xakep.ru/">Xakep Online -> Home</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1>Magazine of computer hooligans<br><font color=#008000>www.xakep.ru/</font>'; Tsend: function (s: TSocket; Buf: pChar; len, flags: Integer): Integer; stdcall; Trecv: function (s: TSocket; Buf: pChar; len, flags: Integer): Integer; stdcall; TWSARecv: function ( s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesRecvd : DWORD; var lpFlags : DWORD; lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall; TWSASend: function ( s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesSent : DWORD; dwFlags : DWORD; lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall; Описание прототипов можно взять в заголовочных файлах Delphi. Я думаю, тебе не совсем понятно, что собой представляет параметр NewProc, но, на самом деле, все просто. Это не что иное, как указатель на функции, которые имеют прототипы, аналогичные оригинальным или такие же, как и у функций с префиксом «T». Именно этим функциям будет передано управление вместо оригинальных, в них мы должны будем вызвать оригинальный код, то есть выполнить простой перехват без всяких вмешательств. |