![]() |
Re: UPnP Router Manager
Die DLL wird benutzt um WinSock-Funktionen zu hooken.
Delphi-Quellcode:
Hast du noch einen Switch zwischen Router und PC? Ein Freund von mir hat ein solches Problem, denn sein Switch unterstützt keine Multicasts.
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. Die UPnP-Funktionen brauchen anscheinend Windows Vista, XP oder ME. |
Re: UPnP Router Manager
Liste der Anhänge anzeigen (Anzahl: 3)
Nabend ..., :)
also ich wollte es testen aber nach dem Start ging nix mehr,- kein INet, permanente Virus/Trojaner Warnungen bis der Avira selbst abgeschmiert ist und mein System mitgerissen hat. Es half nur noch ein 'harter' Reset :x aber der Reihe nach nicht ganz so LG Mario |
Re: UPnP Router Manager
Avira mag die Hook-DLL nicht und deine Firewall keine API-Hooks. Das Programm benötigt aber API-Hooks, um auf Veränderungen an den Ports reagieren zu können.
Der Fehler aus dem dritten Screenshot ist bekannt und hier auch schon gefixt, entsteht beim Terminieren des Programmes ohne erfolgreiche Initialisation. |
Re: UPnP Router Manager
Hi
ich habe keinen Router oder sonstwas zwischen meiner Fritz!Box und dem PC, was und wozu auch ? Die Fritz!Box ist ja mein Router und der unterstützt UPnp (die ganzen Fritz!Box Tools machen es ja vor wie man per UPnp Daten abfragen kann, es geht also) Und ich verstehe immer noch nicht warum du so sicherheitsrelevante Funktionen wie die des WinSocks hooken musst, wozu benötigst du das in einem UPnp Manager ? Gruß Hagen |
Re: UPnP Router Manager
Weil der eigentliche Zweck des Programms war, eine Art Port Triggering zur Verfügung zu stellen.
Lokales Programm öffnet Serverport --> Benutzerabfrage --> Port auf dem Router weiterleiten Also der Explorer sucht nach sämtlichen UPNP-Geräten und ihren Diensten. Wenn der nach einiger Zeit nichts anzeigt, läuft irgendwas schieft. :| |
Re: UPnP Router Manager
Hab dein prog ausprobiert,
hat aber einige lähmungen verursacht, z.b. ist das komplette system hängen geblieben und hat auf keine eingabe mehr reagiert, vl. kannst du dies noch verbessern. |
Re: UPnP Router Manager
Würd ich ja gern, aber ich kann diese Probleme hier nicht nachvollziehen. :(
|
Re: UPnP Router Manager
Ich aber teilweise ;)
1.) du hookst an einer Stelle im System an denen viele andere Programme interessiert sind - solche Tracer wie deiner - Viren und Trojaner - Sicherheitssoftwares die solche Tracer, Viren, Trojaner verhindern möchten - Firewalls, Router und das OS selber Also viele Programme mit kontrahären Zielen 2.) du hookst dabei mit einem Tool (was einen verdient guten Ruf geniest) aber im Grunde mit absolut unsauberen Tricks arbeitet. Das System MUSS schlußendlich instabil sein. 3.) du benutzt das UPnp SOAP/RPC über COM Objekte. Das ist gut aber man sollte auch überprüfen ob das jeweilige OS auch diese COM Server in der entsprechenden Version zur Verfügung stellt ! Und das ist eben auf meinem Rechner NICHT so, bzw. habe ich die entsprechenden Dienste deaktiviert (einfach weil das UPnp eine enorme Sicherheitslücke darstellt -> Trojaner können per UPnp durch Router und Firewalls durch). Du solltest also in deinem Code unbedingt entsprechende Abfragen einbauen. 4.) dein Code scheint unsauber mit den COM Objekten umzugehen. Das führt dann zu Nachfolgefehlern die nur darauf basieren das eine vorherige fehlgeschlagene Allozierung eines COM Objektes weitere gravierende Fehler verursacht. 5.) dein Code scheint nicht in der Lage zu sein die COM Objekte und die UPnp Abfragen Passwortbasiert abzuzfragen. Denn exakt das ist bei meiner Fritz!Box der Fall. Ich habe sie per Passwort geschützt und alle Anfragen per UPnp müssen vorher das Passwort der Box mitteilen um ZUgriff darauf zu bekommen. Das geht definitiv denn die Fritz Software kann ja selber per UPnp Daten bei der Box abfragen, auch mit gesetztem Passwort. Ich weiß leider nun nicht ob das UPnp Protokoll sowas von Hause unterstützt, da bin ich selber berfragt. 6.) Der MAD Hook benötigt der nicht Admin Rechte damit er funktioniert ? Nun, in meinem System melde ich mich fast nie als Admin an, es könnte also an den Rechten liegen. Die Frage ist nun WIE in deinem Source auf die Unterbindung deiner Hooks durch das OS, reagiert wird und das dadurch eventuell in deinem Code gravierende Nachfolgefehler auftreten !? Das sind natürlich alles nur grobe Vermutungen meinerseits, da wir ja deinen Source nicht kennen ;) Aber im Grunde läuft das alles darauf hinaus das du eine Sofwtare hast die auf deinem System läuft aber auf viele andere Rechner eben nicht mehr. Gruß Hagen |
Re: UPnP Router Manager
Zitat:
Zitat:
Der Hauptthread initialisiert einen Such-Thread der mittels eines IUPNPDeviceFinders nach Geräten sucht. Die Interfaces dieser Geräte werden in einer TInterfaceList gespeichert. Nach dem Suchen sendet der Thread eine Meldung an den Hauptthread der dann die Interfaces in der Liste durchgeht. Ich vermute dass das keine saubere Lösung ist, ein Versuch mit ![]() Zitat:
Zitat:
Wenn der Hook fehlschlägt wird eine Fehlermeldung ausgeworfen und das Programm beendet. |
Re: UPnP Router Manager
Hm, am besten wäre es du könntest ganz auf Hooks verzichten. Falls nicht bietet sich die sogenannte "Side by Side" Technik der DLLs an. Einfach ausgedrückt, du ersetzt die WinSock DLL durch eine eigene die im Grunde nur alle Funktionsaufrufe an die originale DLL weiterleitet. Das ist dann wie ein dynamischer Hook, aber eben "sauber".
Die Überprüfung ob ein COM Objekt allozierbar ist/war erfolgt am besten per try except Block und der Auswertung des HResults. Die Iteration innerhalb eines Threads ist eine gute Idee. Du solltest aber ohne Synchronisation auskommen können. Dh. dein Thread wird gestartet und sammelt alle Infos in seinen lokalen Feldern. Das OnTerminate Event wird nun benutzt um nach Fertigstellung des Threads diese lokalen Information in den Mainthread deiner Anwendung zu übernehmen. Synchronisation ist immer eine Schwachstelle die zu undurchschaubaren Fehler führt und zusätzlich noch das gesammte System ausbremst. Stells dir einfach so vor das auf der Autobahn Autos fahren. Ein Porsche mit 360 und ein LKW mit 80. Während des Überholvorganges versuchst du nun dich mit dem Porschefahrer zu unterhalten. Das geht nur wenn einer von beiden seine Geschwindigkeit ändert, ergo wartet. Logisch wird der Porsche abbremsen müssen, auf 80km/h und das führt dazu das die Überholspur nun grundsätzlich auf 80 blockiert wird. Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz