Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 13.7.2013
Репутация: нет Всего: нет
|
Доброго всем времени суток! Попалась как-то (на хакер.ру что-ли) статейка как продвинуть собственный сайт, т. е.: при гуглении "футбол" первым из "примерно 30 500 результов" браузеру подсовывается "... наши футболисты ...." ну и соответсвенно ссылочка на www.ufo_007.com(например). С обработкой текста проблем нет, а вот с перехватом трафика... В статье воспевается advAPIHook но тут я чо-то слегонца недопонял - вернее не стал разбираться т. к. подвернулось следующее: Код | library AppSniffDll;
uses // madshi components madRemote, madCodeHook, madStrings,
// windows units Windows, Winsock, SysUtils, Messages;
{$I defs.inc}
{$R *.RES}
var sendNextHook : function(s: TSocket; Buf : Pointer; Len, Flags: Integer): Integer; stdcall; recvNextHook : function(s: TSocket; Buf : Pointer; Len, Flags: Integer): Integer; stdcall; sendtoNextHook : function(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr; tolen: Integer): Integer; stdcall; recvfromNextHook : function(s: TSocket; var Buf; len, flags: Integer; var from: TSockAddr; var fromlen: Integer): Integer; stdcall; wsasendNextHook : function(s: TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesSent : DWORD; dwFlags : DWORD; lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall; wsarecvNextHook : function(s: TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesRecvd : DWORD; var lpFlags : DWORD; lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall; closesocketNextHook : function(s: TSocket): Integer; stdcall; listenNextHook : function(s : TSocket; backlog : integer): integer; stdcall; gethostbynameNextHook : function(name : PChar): PHostEnt; stdcall;
ClientWindow : integer; showmsgbox : boolean = false;
procedure SendMsg(msg : TIPCMessage); begin msg.Pid := GetCurrentProcessID; SendIpcMessage('AppSniff', @msg, sizeOf(msg)); end; ... function recvHookProc(s: TSocket; Buf : Pointer; Len, Flags: Integer): Integer; stdcall; var msg : TIPCMessage; size : Integer; saddr : TSockAddrIn; slen : Integer; begin if showmsgbox then MessageBox(0, 'recv', 'info', 0); //call the real winsock function Size := recvNextHook(s, Buf, Len, Flags); if Size > 0 then // send message to user interface begin msg.Operation := OT_Recv; msg.Sock := s; msg.Size := Size; msg.Address := Cardinal(Buf); msg.IP := 0; msg.Port := 0; msg.HostName := ''; sLen := sizeof(TSockaddrIn); // figure out the ip and port for the communication if GetPeerName(s, saddr, sLen) = 0 then begin move(saddr.sin_addr, msg.IP, sizeof(Cardinal)); msg.Port := ntohs(saddr.sin_port); end; SendMsg(msg); end; Result := Size; end;
function sendHookProc(s: TSocket; Buf : Pointer; Len, Flags: Integer): Integer; stdcall; var msg : TIPCMessage; saddr : TSockAddrIn; slen : Integer; begin if showmsgbox then MessageBox(0, 'send', 'info', 0); if Len > 0 then // send message to user interface begin msg.Operation := OT_Send; msg.Sock := s; msg.Size := Len; msg.Address := Cardinal(Buf); msg.IP := 0; msg.Port := 0; msg.HostName := '';// figure out the ip and port for the communication sLen := sizeof(TSockaddrIn); if GetPeerName(s, saddr, sLen) = 0 then begin move(saddr.sin_addr, msg.IP, sizeof(Cardinal)); msg.Port := ntohs(saddr.sin_port); end; SendMsg(msg); end; Result := sendNextHook(s, Buf, Len, Flags);//call the real winsock function end; ... procedure InitDll(_ClientWindow : integer); stdcall; begin ClientWindow := _ClientWindow; OutputDebugString(PChar('ClientWindow is ' + IntToStr(ClientWindow))); end;
exports InitDll;
begin showmsgbox := PosText('Mailtest.exe', ParamStr(0)) > 0; if showmsgbox then MessageBox(0, 'am in mailtest.exe', 'info', 0); ClientWindow := 0; CollectHooks; hookapi('ws2_32.dll', 'listen', @listenHookProc, @listenNextHook); hookapi('ws2_32.dll', 'gethostbyname', @gethostbynameHookProc, @gethostbynameNextHook); hookapi('ws2_32.dll', 'closesocket', @closesocketHookProc, @closesocketNextHook); hookapi('ws2_32.dll', 'send', @sendHookProc, @sendNextHook); hookapi('ws2_32.dll', 'recv', @recvHookProc, @recvNextHook); hookapi('ws2_32.dll', 'WSASend', @WSASendHookProc, @WSASendNextHook); hookapi('ws2_32.dll', 'WSARecv', @WSARecvHookProc, @WSARecvNextHook); hookapi('ws2_32.dll', 'sendto', @sendtoHookProc, @sendtoNextHook); hookapi('ws2_32.dll', 'recvfrom', @recvfromHookProc, @recvfromNextHook); FlushHooks; end.
|
и в самом AppSniff - Main.pas такая процедурка: Код | procedure TMainForm.HandleMessage(var Message: TMessage); var msg : TIPCMessage; Buffer : array[0..MAX_PATH] of Char; Proc, i : Cardinal; BytesRead : Cardinal; DataBytes : PByteArray; inaddr : in_addr; AppName : string; Proto : string; FullPath : string; RemoteIP : string; RemotePort : string; DataStr : string; Oper : string; DbgMsg : string; Color : TColor; ConnIndex : integer; StatIndex : integer; begin if Message.wParam <> 777 then begin Message.Result := 0; Exit; end; // process data Move(pointer(Message.lParam)^, msg, sizeOf(Msg)); ReplyMessage(1); // not interested in 1 byte messages if msg.Size = 1 then Exit; // prepare processname ProcessIdToFilename(msg.Pid, Buffer); AppName := ExtractFileName(Buffer); FullPath := Process(AppName).ExeFile; DbgMsg := AppName; // extract data from message DataStr := ''; if (msg.Operation = OT_Send) or (msg.Operation = OT_WSASend) or (msg.Operation = OT_Recv) or (msg.Operation = OT_WSARecv) or (msg.Operation = OT_SendTo) or (msg.Operation = OT_RecvFrom) then begin if msg.Size > 0 then begin GetMem(DataBytes, msg.Size); // open remote process Proc := OpenProcess(PROCESS_VM_READ, False, msg.Pid); // check result if Proc > 0 then begin if ReadProcessMemory(Proc, Pointer(msg.Address), DataBytes, msg.Size, BytesRead) then begin msg.Size := BytesRead; for i:=0 to msg.Size - 1 do DataStr := DataStr + Chr(DataBytes[i]); end; // close handle to process CloseHandle(Proc); end; FreeMem(DataBytes); end; end; DbgMsg := DbgMsg + ', size=' + IntToStr(msg.size); DbgMsg := DbgMsg + ', sock=' + IntToStr(msg.sock); RemoteIP := ''; - далее идёт добыча txt.данных для ВиртуалТриВью и 3-х РичЕдитов
|
Так вот - по поводу вышеизложенного вопрос: можно ли отправить ДЛЛке ответ? Что-то в роде: Код | procedure TMainForm.HandleMessage(var Message: TMessage); ... SendIpcMessage('AppSniffDll', @msg, sizeOf(msg)); ... а в ДЛЛке: procedure HandleMessage(var Message: TMessage);
|
Ведь она ( ДЛЛка) при отправке заложила msg.Pid Оперы или она перехватит сообщение? Если "Да", то как порвать "мосты" (параллелного прослушивания): убрать recvNextHook и Опера оглохнет - вот тут как я соображаю и нужно ответное сообщение с полученными и обработанными данными ну и убрав sendNextHook проверить ответ оперы и отослать его получателю (за ислючением - если юзер тыкнет на www.ufo_007.com которого не существует). Или я заблуждаюсь? - Дык поправьте, наставьте на путь истинный. И заранее - спасибо за любую инфу вплоть до банального перечня процедур и функций из которых можно вылепить нечто подобное необходимому.
Присоединённый файл ( Кол-во скачиваний: 10 )
Defs.inc 1,32 Kb
|