Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
Turbo Delphi für Win32
|
Re: UPnP Router Manager
25. Jun 2006, 21: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.
|