UPNP / Portscan
Hallo,
Ich möchte folgendes hinbekommen: Alle UPNP Devices finden, nach offenen Ports scannen und selbst Ports öffnen und schließen: Zunächst habv ich die UPNP Dll in Delphi importiert. Mit den dann zur Verfügung stehenden Interfaces kann ich die Geräte auch finden:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var UPnPDeviceFinder : IUPnPDeviceFinder; UPnpDevices : IUPnpDevices; EnumVariant, EnumVariant2 : IEnumVariant; rgvar, rgvar2 : OleVariant; celtFetched, celtFetched2 : Cardinal; UPnpDevice : IUPnpDevice; Counter, Counter2 : Integer; Erg : HResult; UPnpService : IUPnpService; begin Memo1.Lines.Clear; Counter := 0; UPnPDeviceFinder := CoUPnPDeviceFinder.Create; UPnpDevices := UPnPDeviceFinder.FindByType('upnp:rootdevice', 0); Memo1.Lines.Add('Number of UPnP devices: ' + IntToStr(UPnpDevices.Count)); lblDisplay.Caption := IntToStr(UPnpDevices.Count) + ' UPnp-Geräte gefunden'; try EnumVariant := IEnumVariant(UPnpDevices._NewEnum); while (EnumVariant.Next(1, rgvar, celtFetched) = S_OK) do begin UPnpDevice := IUPnpDevice(IUnknown(rgvar)); Inc(Counter); Memo1.Lines.Add('Device: ' + IntToStr(Counter)); Memo1.Lines.Add(UPnpDevice.FriendlyName); Memo1.Lines.Add(UPnpDevice.UniqueDeviceName); Memo1.Lines.Add('Services: ' + IntToStr(UPnpDevice.Services.Count)); Memo1.Lines.Add(''); Memo1.Lines.Add(UPnpDevice.PresentationURL); // UPnpDevice.Services.Item[]. EnumVariant2 := IEnumVariant(UPnpDevice.Services._NewEnum); Erg := EnumVariant2.Next(1, rgvar2, celtFetched2); Counter2 := 0; while (Erg = S_OK) do begin UPnpService := IUPnPService(IDispatch(rgvar2)); Inc(Counter2); Memo1.Lines.Add('Service: ' + IntToStr(Counter2)); Memo1.Lines.Add('ServiceID: ' + UPnpService.Id); Erg := EnumVariant2.Next(1, rgvar2, celtFetched2); end; end; except end; end; An dem Rest der Aufgabe bin ich leider am verzweifeln. Vielen Dank im Voraus, mit freundlichen Grüßen Christian Kauer |
Re: UPNP / Portscan
Hi
und Willkommen in der DP! :dp: Fragen die sich auf Arbeiten beziehen sind immer sehr ungern gesehen (da schon in den AGBs die du bei der Anmeldung bekommen hast steht, dass dies kein Forum ist, in dem solche Aufgaben gelöst werden). Was deinen Code angeht, so würde ich dir empfehlen, dass du den etwas mehr strukturierst. Nicht falsch verstehen, der ist natürlich strukturiert, aber ein paar Leerzeilen und mehr als eine Methode machen den leichter lesbar. An sich solltest du in einer Methode immer nur eine Sache machen. In deinem Fall kannst du z.B. leicht die Anzeige (Eintragen ins Memo) von dem Finden der UPNPs trennen. Je kleiner eine Methode, desto übersichtlicher (weniger Fehler, leichter wiederverwendbar/austauschbar). Was deine ausstehenden Probleme angeht, so ist es halt so eine Sache, dir einfach eine Lösung zu posten. Wiederspricht irgendwie dem wofür ein Forum gut ist. Deshalb mal die Frage, wie weit ist es mit deinem Wissen her? Hast du irgendeinen Ansatz? Kennst du schon bestimmte Komponenten, die sich eventuell eignen würden? Und andere wissen was du für Komponenten hast, wäre auch die Delphi Version hier interessant. Gruß Der Unwissende |
Re: UPNP / Portscan
Liste der Anhänge anzeigen (Anzahl: 1)
Moin!
An etwas ähnlichem arbeite ich zurzeit auch gerade. Ich wär dir deshalb sehr dankbar wenn du mir den Code, mit dem du die DLL einbunden hast schicken könntest. Zu deinem Problem: Ich weiß nicht wie die Funktion das bisher darstellt, aber wenn du das so ähnlich darstellen lässt wie es das Intel Device Spy Tool und anschließend in dieser Liste z.B. nach "AddPortMapping" oder "DeletePortMapping" suchst, kannst du auch aus dem jeweils übergeordneten Listenelement die URL rauslesen an die du den Befehl schicken musst. So is zumindest mein Plan wenn jemand ne bessere Idee hat -> bitte posten :-D Grüße, MrPayne |
Re: UPNP / Portscan
moin zusammen,
ich plage mich zur zeit auch mit dem thema upnp herum. aufgelistet kriege ich die geräte auch schon aber danach hört es bei mir auch auf. es muss doch leute geben die da durchblicken :) . @mr payne: die dll lässt sich unter projekt/typ bibliothek importieren einbinden. danach hast du unter dem active x reiter diverse komponenten. mfg jonny guitar |
Re: UPNP / Portscan
Ah danke für den Tipp!
Aber sucht der bei euch auch so lange nach Geräten (20 sek oder so)? |
Re: UPNP / Portscan
ja, 10 - 15 sekunden sucht der bei mir auch.
aber ich hätte noch eine bitte. mir hat ein bekannter ein beispiel python quellcode geschickt:
Delphi-Quellcode:
es gibt ja nun auch UPnpService.InvokeAction. kann mir einer das Service.InvokeAction("AddPortMapping",["",Port,"TCP",Port,LocalIP,True,"BitTorrent"," "],"") nach delphi übersetzen?
import win32com.client
from pythoncom import CoInitialize,CoUninitialize def AddPortMapping(Port,LocalIP): try: CoInitialize() DeviceFinder=win32com.client.Dispatch("UPnP.UPnPDeviceFinder") Connections=DeviceFinder.FindByType("urn:schemas-upnp-org:service:WANIPConnection:1",0) Connection=Connections.__getitem__(0) Service=Connection.Services.__getitem__(0) Service.InvokeAction("AddPortMapping",["",Port,"TCP",Port,LocalIP,True,"BitTorrent",""],"") return True except: return False def ReleasePortMapping(Port): try: CoInitialize() DeviceFinder=win32com.client.Dispatch("UPnP.UPnPDeviceFinder") Connections=DeviceFinder.FindByType("urn:schemas-upnp-org:service:WANIPConnection:1",0) Connection=Connections.__getitem__(0) Service=Connection.Services.__getitem__(0) r=[] Service.InvokeAction("DeletePortMapping",["",Port,"TCP"],r) finally: return UPnpService.InvokeAction('AddPortMapping', [0, 1000, 'TCP', 1000, '192.168.0.1', True, 'TEST', 0], '') gibt nur fehler aus mfg Jonny |
Re: UPNP / Portscan
Eventuell ist ja AddPortMapping nicht erlaubt auf dem Router... bei der FritzBox kann man das z.B. einstellen.
|
Re: UPNP / Portscan
morgen zusammen,
also upnp ist auf dem router aktiviert. ich denke das sollte funktionieren. aber es kommen ja auch erstmal fehler von delphi: UPnpService.InvokeAction('AddPortMapping', [0, 1000, 'TCP', 1000, '192.168.0.1', True, 'TEST', 0], '') bei den beiden Portangaben 1000 kommt "Konstantenausdruck verletzt untere Grenzen" bei der ip angabe und dem Portnamen 'test' kommt "inkompatible Typen integer und string" vielleicht weiss ja einer weiter mfg Jonny |
Re: UPNP / Portscan
bei InvokeAction musst du doch alle Werte als Variant übergeben oder ?
|
Re: UPNP / Portscan
also die drei parameter sind:
bstrActionName: WideString; vlnActionArgs: OleVariant; pvOutActionArgs: OleVariant; Also demnach ja. Oder wolltest du mich jetzt irgendwo drauf stoßen weil irgendwas dummes gemacht habe? sehe mittlerweile den wald vor lauter bäumen nicht ;) mfg Jonny |
Re: UPNP / Portscan
Liste der Anhänge anzeigen (Anzahl: 1)
also ich mache das so...
Delphi-Quellcode:
Sollte das nicht funktionieren dann ist es vom Router evtl nicht erlaubt!
procedure AddPortClick(WANIPConn:UPnPService);
var sOut : OleVariant; sArg : OleVariant; ret : OleVariant; begin if not Assigned(WANIPConn) then exit; try sOut := VarArrayCreate([0, 0], varVariant); sArg := VarArrayCreate([0, 7], varVariant); sArg[0] := ''; //RemoteHost sArg[1] := 1000; //ExternalPort sArg[2] := 'TCP'; //Protocol sArg[3] := 1000; //InternalPort sArg[4] := '192.168.178.5'; //InternalClient sArg[5] := 1; //Enabled sArg[6] := 'TestMapping'; //PortMappingDescription sArg[7] := 0; //LeaseDuration ret := WANIPConn.InvokeAction('AddPortMapping', sArg, sOut); if ret = S_OK then lbDebug.Items.Add('Port Freischaltung erfolgreich !') else lbDebug.Items.Add('Port Freischaltung fehlgeschlagen !'); VariantClear(sArg); VariantClear(sOut); except end; end; Mein Testprogramm hänge ich mal mit an es öffnet den Port 1000. |
Re: UPNP / Portscan
moin zusammen,
das codebeispiel funktioniert einwandfrei, nun hätte ich noch weitere fragen: 1)suchst man die devices so a) UPnPDeviceFinder.FindByType('urn:schemas-upnp-org:service:WANIPConnection:1', 0) oder b) UPnPDeviceFinder.FindByType('upnp:rootdevice', 0). 2) sehe ich das richtig das ich beim löschen des ports folgendes machen muss? WANIPConn.InvokeAction('DeletePortMapping', sArg, sOut) wobei sARg aus '', Port, 'TCP' besteht? 3) kennst einer eine möglichkeit alle offenen ports auf einem device per upnp aufzulisten? mit aller besten grüssen Jonny |
Re: UPNP / Portscan
Hi,
zu 1. kann man so machen .. ich persönlich benutze UPnPMonitor.CreateAsyncFind mit einem CallBack zu 2. Port löschen
Delphi-Quellcode:
zu 3. ja kenne ich ^^
procedure DelPortClick(WANIPConn:UPnPService);
var sOut : OleVariant; sArg : OleVariant; ret : OleVariant; begin if not Assigned(WANIPConn) then exit; try sOut := VarArrayCreate([0, 0], varVariant); sArg := VarArrayCreate([0, 2], varVariant); sArg[0] := ''; //RemoteHost sArg[1] := 1000; //ExternalPort sArg[2] := 'TCP'; //Protocol ret := WANIPConn.InvokeAction('DeletePortMapping', sArg, sOut); if ret = S_OK then ShowMessage('Port löschung erfolgreich !') else ShowMessage('Port löschung fehlgeschlagen !'); VariantClear(sArg); VariantClear(sOut); except end; end;
Delphi-Quellcode:
procedure GetPortList(WANIPConn:UPnPService;lbDebug:TListBox);
var sOut : OleVariant; sArg : OleVariant; ret : OleVariant; iCount : Integer; x : Integer; begin if not Assigned(WANIPConn) then exit; try // Portmappings zählen iCount := WANIPConn.QueryStateVariable('PortMappingNumberOfEntries'); sOut := VarArrayCreate([0, 7], varVariant); sArg := VarArrayCreate([0, 0], varVariant); //Alle Portmappings durchlaufen for x := 0 to iCount - 1 do begin sArg[0] := x; ret := WANIPConn.InvokeAction('GetGenericPortMappingEntry', sArg, sOut); lbDebug.Items.Add( sOut[0] + '-' //RemoteHost + IntToStr(sOut[1]) + '-' //ExternalPort + sOut[2] + '-' //Protocol + IntToStr(sOut[3]) + '-' //InternalPort + sOut[4] + '-' //InternalClient + IntToStr(sOut[5]) + '-' //Enabled + sOut[6] + '-' //PortMappingDescription + IntToStr(sOut[7]) //LeaseDuration ); end; VariantClear(sArg); VariantClear(sOut); except end; end; |
Re: UPNP / Portscan
nabend zusammen,
also das port anlegen und wieder löschen funktioniert nur wenn ich die devices per: UPnPDeviceFinder.FindByType('urn:schemas-upnp-org:service:WANIPConnection:1', 0) gesucht habe. suche ich über UPnPDeviceFinder.FindByType('upnp:rootdevies', 0) so folgt der fehler: "EOLEException: Die Besitzer-SID eines Abonnements auf Einzelbenutzerbasis ist nicht vorhanden". Die suche nach offenen Ports funktioniert leider in beiden fällen nicht, beim iCount := WANIPConn.QueryStateVariable('PortMappingNumberOfE ntries'); kommt die fehlermeldung "OLE-Fehler 80040212" oder "OLE-Fehler 80040213" hat vielleicht einer eine idee? mfg Jonny |
Re: UPNP / Portscan
Zitat:
Achte darauf das FindByType('urn:schemas-upnp-org:service:WANIPConnection:1', 0) vollständig durch ist bevor du versuchst auf den Service zuzugreifen!! |
Re: UPNP / Portscan
aso, ich hatte auch schon festgestellt, dass die suche unterschiedlich lang dauert. bei deinem beispielprogramm geht es wesentlich schneller als bei mir.
kann es bei der suche nach den ports vielleicht sein, dass er gar keine findet und deswegen die fehlermeldung schmeisst? mfg Jonny |
Re: UPNP / Portscan
Wenn du mir mal dein Projekt per PN Schickst schaue ich es mir mal an ... ansonsten versuche es so wie ich mit AsyncFind und CallBack.
|
Re: UPNP / Portscan
Wie kann ich eigentlich bei einem Service abrufen welche StateVariables und welche Actions es gibt?
|
Re: UPNP / Portscan
du kannst dir die Dokumentation durchlesen .... www.upnp.org :wink:
In diesem Fall die des InternetGatewayDevices |
Re: UPNP / Portscan
Du meinst des sind immer die Selben? Stimmt bei meinem 2 Routern nur bedingt...
|
Re: UPNP / Portscan
Naja das liegt wohl daran das nicht auf jedem Router alles vom Standart implementiert ist.
|
Re: UPNP / Portscan
Zum Thema Devices suchen:
Zitat:
|
Re: UPNP / Portscan
Zitat:
Und CreateAsyncFind gehört zum TUPnPDeviceFinder !! Das Callback Interface sieht dann so aus, und muss selst noch deklariert werden.
Delphi-Quellcode:
type
IUPnPDeviceFinderCallback = interface(IUnknown)['{415A984A-88B3-49F3-92AF-0508BEDF0D6C}'] procedure DeviceAdded(iFindData: Integer; UPnPDevice: UPnPDevice); stdcall; procedure DeviceRemoved(iFindData: Integer; wsUDN: WideString); stdcall; procedure SearchComplete(iFindData: Integer); stdcall; end; |
Re: UPNP / Portscan
Ich such nur nach Routern also InternetGatewayDevice. Thanks erstmal, werd nu versuchen ob ich das so hinkrieg :wink:
|
Re: UPNP / Portscan
Zitat:
|
Re: UPNP / Portscan
servus,
so ich habe es auch geschafft, meinen router zu finden und aufzulisten. was nun aber noch nicht klappt, sind die prozeduren addportclick und getportlist. upnp ist definitiv aktiviert. anhand eurer beispiele habe ich mir folgende funktion checkrouter() gebastelt:
Delphi-Quellcode:
mein problem ist: [b]ich bin mir nicht ganz sicher, was ich bei dem prozeduraufruf statt "WANIPconn:Upnpservice" eintrage?[b]
function checkrouter(): string;
var rhost,ehost, eport, protocol, iport, iclent, enable, pdes, leasd: olevariant; UPnPDeviceFinder : IUPnPDeviceFinder; UPnpDevices : IUPnpDevices; EnumVariant, EnumVariant2 : IEnumVariant; rgvar, rgvar2 : OleVariant; celtFetched, celtFetched2 : Cardinal; UPnpDevice : IUPnpDevice; Counter, Counter2 : Integer; Erg : HResult; UPnpService : IUPnpService; begin message('Einen Moment bitte. Suche nach Router im Netzwerk läuft...'); Counter := 0; UPnPDeviceFinder := CoUPnPDeviceFinder.Create; UPnpDevices := UPnPDeviceFinder.FindByType('urn:schemas-upnp-org:service:WANIPConnection:1', 0); message(IntToStr(UPnpDevices.Count) + ' UPnP Geräte gefunden!'); try EnumVariant := IEnumVariant(UPnpDevices._NewEnum); while (EnumVariant.Next(1, rgvar, celtFetched) = S_OK) do begin UPnpDevice := IUPnpDevice(IUnknown(rgvar)); Inc(Counter); irc('Device ' + IntToStr(Counter)+ ': ' + UPnpDevice.FriendlyName + ': ' + UPnpDevice.PresentationURL); irc(UPnpDevice.UniqueDeviceName); // UPnpDevice.Services.Item[]. EnumVariant2 := IEnumVariant(UPnpDevice.Services._NewEnum); Erg := EnumVariant2.Next(1, rgvar2, celtFetched2); Counter2 := 0; GetPortlist(IUPnPService(IDispatch(rgvar)), form1.ListBox1); // Hier möchte ich die Liste der Ports anzeigen AddPortclick(IUPnPService(IDispatch(rgvar))); // Hier möchte ich den Port 1000 freigaben; // message('Listing und Portfreigabe erfolgreich'); while (Erg = S_OK) do begin message('erg ist noch S_OK'); UPnpService := IUPnPService(IDispatch(rgvar2)); inc(counter2); message('Service: ' + IntToStr(Counter2)); message('ServiceID: ' + UPnpService.Id); Erg := EnumVariant2.Next(1, rgvar2, celtFetched2); end; end; except message('Fehler'); end; end; wenn ich es mit..
Delphi-Quellcode:
..versuche, listet er mir nur den router auf aber es kommt keine meldung, ob das portmapping erfolgreich war oder nicht.
AddPortclick(IUPnPService(IDispatch(rgvar)));
wenn ich statt "regvar" die variable "regvar2" nehme, gibt er mir aus: not assigned. bei der prozedur getportlist kommt dann die fehlermeldung: --------------------------- Debugger Exception Notification --------------------------- Project upnp.exe raised exception class EAccessViolation with message 'Access violation at address 7095E2EF in module 'upnp.dll'. Write of address 0048C914'. Process stopped. Use Step or Run to continue. ich habe auch schon versucht die prozedur erst in der while-schleife
Delphi-Quellcode:
aufzurufen, doch anhand einer test-message habe ich gemerkt, dass es gar nicht erst zu dem aufruf kommt.
while (Erg = S_OK) do
so sorry für das durcheinander, vielleicht kann man es auch einfacher erklären als ich hier meine frage gestellt habe?! habt vielen dank für eure bemühungen, viele grüße tim |
Re: UPNP / Portscan
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
du hast ja in deinem Code das Upnp Gerät schon gefunden. Jetzt fehlt dir noch der Aufbau der Innereien des Gerätes, gehe mal nach folgender Reihenfolge vor: 1. UPNP Gerät finden 2. WANConnectionDevice finden (falls du nicht direkt danach gesucht hast) 3. Services des WANConnectionDevice durchlaufen und WANIPConnection finden 4. jetzt kannst du mit der WANIPConnection weiterarbeiten um z.B. Portmappings auszulesen Du solltest dir noch das Service Template des WANIPConnection anschauen (s.Anhang). Zur Veranschaulichung hänge ich noch ein kleines Bild mit an. Gruß Thomas |
Re: UPNP / Portscan
hi tkc,
vielen dank für deine antwort! ich denke mir würde ein beispiel code am besten helfen, denn bei den folgenden punkten fehlt mir das wissen, wo und wie ich anfangen soll: 2. WANConnectionDevice finden (falls du nicht direkt danach gesucht hast) 3. Services des WANConnectionDevice durchlaufen und WANIPConnection finden ich lerne das immer am besten, wenn ich einen vorhanden beispielcode code habe und ihn nach und nach durchgehe, abändere und dann merke, was passiert. wäre es evtl möglich, wenn du mir den sourcecode von deinem kleinen testprogramm schicken könntest? ich wäre dir sehr dankbar! viele grüße tim |
Re: UPNP / Portscan
Hi,
kann ich leider nicht machen, da ich eine eigene Komponente dafür benutze und diese noch weit von einem Release weg ist ;) . Du kannst mir aber dein Projekt schicken, dann schaue ich mal danach. mfg Thomas |
Re: UPNP / Portscan
Nennt mich Thread-Leichenschänder, aber was zur Hölle hat
der Threadstarter da am Anfang gemacht? Wurde da eine ganze Klasse aus der DLL exportiert oder jede Funktion einzeln? Komischerweise finde ich auch keine der genannten Funktionen wenn ich mir die DLL via TDump anschaue. Wie man DLLs importiert (zumindest einzelne Funktionen) hab ich ja verstanden. Wieso dem Threadstarter aber Datentypen & Co zur verfügung stehen ist mir aber ein Rätzel. Wäre nett wenn mich Jemand aufklären könnte was der Threadstarter bei Zitat:
|
Re: UPNP / Portscan
*Push*
Ich kann mir nicht vorstellen das das so schwer sein kann. Wäre nett wenn mir doch noch Jemand antworten könnte. |
Re: UPNP / Portscan
Zitat:
Viele Grüße |
Re: UPNP / Portscan
Okay ich hab mir das mal bei Delphi angeschaut. Das Ding das sich dann öffnet sieht unglaublich kompliziert aus, aber ich werd mich da mal reinwuseln.
Danke für die Antwort. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:59 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