Thema: Delphi UPNP / Portscan

Einzelnen Beitrag anzeigen

timi

Registriert seit: 6. Jul 2008
2 Beiträge
 
#26

Re: UPNP / Portscan

  Alt 7. Jul 2008, 15:18
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:
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;
mein problem ist: [b]ich bin mir nicht ganz sicher, was ich bei dem prozeduraufruf statt "WANIPconn:Upnpservice" eintrage?[b]

wenn ich es mit..
 AddPortclick(IUPnPService(IDispatch(rgvar))); ..versuche, listet er mir nur den router auf aber es kommt keine meldung, ob das portmapping erfolgreich war oder nicht.
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

while (Erg = S_OK) do aufzurufen, doch anhand einer test-message habe ich gemerkt, dass es gar nicht erst zu dem aufruf kommt.

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
  Mit Zitat antworten Zitat