AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte UPnP Router Manager
Thema durchsuchen
Ansicht
Themen-Optionen

UPnP Router Manager

Ein Thema von Mystic · begonnen am 7. Mai 2006 · letzter Beitrag vom 12. Aug 2006
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
Benutzerbild von Mystic
Mystic
Registriert seit: 18. Okt 2003
Aus meinem RouterTimer entstanden ist der UPnP Router Manager:

Ein Tool zum automatischen Anlegen von Weiterleitungen auf einem Router mit UPnP-Unterstützung, sobald ein Prozess einen Server-Port öffnet (natürlich mit Benutzer-Rückfrage). Es war ursprünglich für mich selbst gedacht (vielleicht erklärt das den Mangel an Dokumentation ).

Das Tool ist noch in der Entwicklung. Verbesserungsvorschläge sind herzlichst willkommen.

Keine Installiation ist nötig. Das Programm speichert seine Einstellungen in den Dateien Settings.ini und Lists.dat im Programmverzeichnis.

Getestet nur mit Windows XP und einem Netgear FM114P Router. Benötigt wahrscheinlich Admin-Rechte auf Grund des API-Hooks (sicher bin ich mir nicht).

Braucht Windows XP oder Vista!

3. Update 10.06.2006
Angehängte Dateien
Dateityp: zip routerman_164.zip (696,1 KB, 355x aufgerufen)
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
 
Benutzerbild von Mystic
Mystic

 
Turbo Delphi für Win32
 
#31
  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
  Mit Zitat antworten Zitat
Hobby-Programmierer

 
Delphi XE Starter
 
#32
  Alt 25. Jun 2006, 21:35
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
aber der Reihe nach

nicht ganz so LG Mario
Miniaturansicht angehängter Grafiken
msg_382.png   msg2_674.png   msg3_675.png  
Mario
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

 
Turbo Delphi für Win32
 
#33
  Alt 25. Jun 2006, 21:44
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.
Jan Steffens
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#34
  Alt 26. Jun 2006, 09:43
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
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

 
Turbo Delphi für Win32
 
#35
  Alt 26. Jun 2006, 12:32
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.
Jan Steffens
  Mit Zitat antworten Zitat
Van HelF

 
Delphi 7 Personal
 
#36
  Alt 26. Jun 2006, 12:45
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.
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

 
Turbo Delphi für Win32
 
#37
  Alt 26. Jun 2006, 12:48
Würd ich ja gern, aber ich kann diese Probleme hier nicht nachvollziehen.
Jan Steffens
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#38
  Alt 26. Jun 2006, 13:46
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
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

 
Turbo Delphi für Win32
 
#39
  Alt 28. Jun 2006, 16:56
Zitat von negaH:
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.
Wie kann ich auf das Vorhandensein der Server prüfen?

Zitat von negaH:
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.
Darüber hab ich mir auch schon Gedanken gemacht. Vorallem das übertragen von COM-Objekten zwischen zwei Threads in dieser STA-Applikation.

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 MSDN-Library durchsuchenCoMarshalInterThreadInterfaceInStream schlug allerdings fehl.

Zitat von negaH:
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.
Dieser Passwortschutz ist dann aber eine proprietäre Erweiterung... ich kann in den IGD-Spezifikationen nichts darüber finden.

Zitat von negaH:
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 !?
Der Hook hookt alle Prozesse der aktuellen Session. Sollte man das lieber auf "aktueller User" umstellen? Ich hab zugegeben keine Ahnung was genau eine Session ist.

Wenn der Hook fehlschlägt wird eine Fehlermeldung ausgeworfen und das Programm beendet.
Jan Steffens
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#40
  Alt 28. Jun 2006, 17:28
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz