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


Автор: artful 17.9.2007, 21:09
Скажите почему при перехвате апи с библиотеки WinSock перехват осуществляется великолепно в браузерах мазила и эксплорер но опера не подчиняется этому перехвату... неужели она не использует винсок? Помогите решить проблему...

Код

library newsock;
{$R *.res}

uses
  windows,winsock,Classes,SysUtils,dialogs;

type
 OldCode = packed record
  One: dword;
  two: word;
 end;

far_jmp = packed record
  PuhsOp: byte;
  PushArg: pointer;
  RetOp: byte;
 end;
 

var
JmpSend: far_jmp;
OldSend: OldCode;
SendAdr: pointer;
 
function newsend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
 Written: dword;

begin

WriteProcessMemory(INVALID_HANDLE_VALUE, SendAdr,@OldSend, SizeOf(OldCode), Written);
ShowMessage('test');
Result := send(s,Buf,len, flags);
WriteProcessMemory(INVALID_HANDLE_VALUE, SendAdr,@JmpSend, SizeOf(far_jmp), Written);
end;

Procedure SetHook();
var
 hwsock32: dword;
 Bytes: dword;
begin
try
  hwsock32 := GetModuleHandle('wsock32.dll');// использование библиотеки WS2_32.dll ни к чему не привело
  SendAdr  := GetProcAddress(hwsock32, 'send');


   ReadProcessMemory(INVALID_HANDLE_VALUE, SendAdr, @OldSend, SizeOf(OldCode), Bytes);
  JmpSend.PuhsOp  := $68;
  JmpSend.PushArg := @newsend;
  JmpSend.RetOp   := $C3;
  WriteProcessMemory(INVALID_HANDLE_VALUE, SendAdr, @JmpSend, SizeOf(far_jmp), Bytes);

except end;
end;

Procedure Unhook();
var
 Bytes: dword;
begin
try

  WriteProcessMemory(INVALID_HANDLE_VALUE, SendAdr, @OldSend, SizeOf(OldCode), Bytes);

  except end;
end;


Function MessageProc(code : integer; wParam : word;
                    lParam : longint) : longint; stdcall;
begin
 CallNextHookEx(0, Code, wParam, lparam);
 Result := 0;
end;

Procedure SetGlobalHookProc();
begin
try
 SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
 Sleep(INFINITE);
 except end;
end;

Procedure SetGlobalHook;
var
 hMutex: dword;
 TrId: dword;
begin
try
 hMutex := CreateMutex(nil, false, 'DigitalHook');
 if GetLastError = 0 then
 CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
 CloseHandle(hMutex);
 except end;
end;


procedure DLLEntryPoint(dwReason: DWord);
begin
try
  case dwReason of
    DLL_PROCESS_ATTACH: begin
                          SetGlobalHook;
                          SetHook;
                        end;
    DLL_PROCESS_DETACH: UnHook;
  end;
 except end;
end;


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

Автор: dumb 17.9.2007, 22:37
потому что опера не использует send. она использует WSASend.

Автор: artful 17.9.2007, 23:23
Большое спосибо  smile 

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