Einzelnen Beitrag anzeigen

Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#31

Re: UPnP Router Manager

  Alt 25. Jun 2006, 20:37
Die DLL wird benutzt um WinSock-Funktionen zu hooken.

Delphi-Quellcode:
library rmHook;

{$IMAGEBASE $58a00000}

uses
  Windows,
  madCodeHook,
  Winsock,
  madStrings,
  madRemote,
  HookDataUnit in 'HookDataUnit.pas';

{$R *.res}

var
  bindNext:function(s: TSocket; var addr: TSockAddr; namelen: Integer): Integer; stdcall;
  listenNext: function(s: TSocket; backlog: Integer): Integer; stdcall;
  closesocketNext: function(s: TSocket): Integer; stdcall;
  shutdownNext: function(s: TSocket; how: Integer): Integer; stdcall;

procedure SendIPC(s: TSocket; action: TSockAction; saddr: PSockAddr = nil);
var
  session: DWord;
  data: TSockHookData;
  size: Integer;
  addr: TSockAddr;
  arrChW: array[0..MAX_PATH] of WideChar;
  x: PChar;
begin
  ZeroMemory(@data, SizeOf(TSockHookData));
  data.process := GetCurrentProcessId;
  GetModuleFileNameW(0, arrChW, MAX_PATH);
  WideToAnsi(arrChW, data.filename);
  GetFullPathName(@data.filename, MAX_PATH, @data.filename, x);
  CharLower(@data.filename);
  data.action := action;
  if saddr <> nil then
    addr := saddr^
  else
  begin
    size := SizeOf(addr);
    getsockname(s, addr, size);
  end;
  data.sockport := ntohs(addr.sin_port);
  if data.sockport = 0 then
    Exit;
  size := SizeOf(data.socktype);
  getsockopt(s, SOL_SOCKET, SO_TYPE, @data.socktype, size);
  if AmSystemProcess and (GetCurrentSessionId = 0) then
    session := GetInputSessionId
  else
    session := GetCurrentSessionId;
  SendIPCMessage(PChar('UPNPRouterMan' + IntToStrEx(session)), @data,
    SizeOf(data));
end;

function bindCallback(s: TSocket; var addr: TSockAddr; namelen: Integer):
  Integer; stdcall;
begin
  SendIPC(s, Listen, @addr);
  Result := bindNext(s, addr, namelen);
end;

function listenCallback(s: TSocket; backlog: Integer): Integer; stdcall;
begin
  SendIPC(s, Listen);
  Result := listenNext(s, backlog);
end;

function closesocketCallback(s: TSocket): Integer; stdcall;
begin
  SendIPC(s, Closed);
  Result := closesocketNext(s);
end;

function shutdownCallback(s: TSocket; how: Integer): Integer; stdcall;
begin
  SendIPC(s, Closed);
  Result := shutdownNext(s, how);
end;

begin
  HookAPI('wsock32.dll', 'bind', @bindCallback, @bindNext);
  HookAPI('wsock32.dll', 'listen', @listenCallback, @listenNext);
  HookAPI('wsock32.dll', 'closesocket', @closesocketCallback, @closesocketNext);
  HookAPI('wsock32.dll', 'shutdown', @shutdownCallback, @shutdownNext);
end.
Hast du noch einen Switch zwischen Router und PC? Ein Freund von mir hat ein solches Problem, denn sein Switch unterstützt keine Multicasts.

Die UPnP-Funktionen brauchen anscheinend Windows Vista, XP oder ME.
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat