Programm hinter Port ermitteln

Anfängerfragen zum Programmieren mit PureBasic.
IcedCoffee
Beiträge: 115
Registriert: 09.07.2005 12:11
Wohnort: Fürstenwald [Internat], Berlin[wen keine lust auf Internat], Wildau[Einfamilienhaus]
Kontaktdaten:

Programm hinter Port ermitteln

Beitrag von IcedCoffee »

moin

ich habe bei http://www.pb-club.de/ im Source-Archiv den code gefunden [Programm hinter Port ermitteln]

Code: Alles auswählen

;ACHTUNG:
;FUNKTIONIERT NUR MIT WINDOWS 2000 UND WINDOWS XP !

#TOKEN_QUERY=8
#TOKEN_ADJUST_PRIVILEGES=32
#PROCESS_DUP_HANDLE=64
#STANDARD_RIGHTS_ALL=2031616
#GENERIC_ALL=268435456


Procedure.s GetUsedPorts(ProcessID)
  Global GetPorts_AlreadyCalled
  
  Select OSVersion()
    Case #PB_OS_Windows_2000
      OSDepType=26
    Case #PB_OS_Windows_XP
      OSDepType=28
    Default
      ProcedureReturn ""
  EndSelect
  
  If GetPorts_AlreadyCalled=0
    
    NewToken.TOKEN_PRIVILEGES
    OldToken.TOKEN_PRIVILEGES
    FoundPorts=0
    AdvapiInst=LoadLibrary_("advapi32.dll")
    If AdvapiInst
      Addr1=GetProcAddress_(AdvapiInst,"LookupPrivilegeValueA")
      Addr2=GetProcAddress_(AdvapiInst,"OpenProcessToken")
      Addr3=GetProcAddress_(AdvapiInst,"AdjustTokenPrivileges")
      If  Addr10 And Addr20 And Addr30
        Result=CallFunctionFast(Addr2,GetCurrentProcess_(),#TOKEN_ADJUST_PRIVILEGES|#TOKEN_QUERY,@A)
        If Result
          Result=CallFunctionFast(Addr1,"","SeDebugPrivilege",OldToken\Privileges[0]\Luid)
          If Result
            NewToken\PrivilegeCount=1
            NewToken\Privileges[0]\Attributes=#SE_PRIVILEGE_ENABLED
            NewToken\Privileges[0]\Luid\LowPart=OldToken\Privileges[0]\Luid\LowPart
            NewToken\Privileges[0]\Luid\HighPart=OldToken\Privileges[0]\Luid\HighPart
            CallFunctionFast(Addr3,A,0,NewToken,SizeOf(TOKEN_PRIVILEGES),OldToken,@dummy)
          EndIf
        EndIf
      EndIf
      FreeLibrary_(AdvapiInst)
    EndIf
    If Result=0
    Else
      GetPorts_AlreadyCalled=-1
    EndIf
  EndIf
  
  QuerySizePtr=GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,20)
  
  If QuerySizePtr=0:ProcedureReturn "":EndIf
  NtQuerySystemInformation_(16,QuerySizePtr,20,0)
  Size=(PeekL(QuerySizePtr)-1)*16+20
  GlobalFree_(QuerySizePtr)
  If Size0:Ports.s+",":EndIf
  FoundPorts+1
  Ports.s+Str(htons_(SockName\sin_port)&$FFFF) ; LINE 62
;EndIf             
             
;EndIf           
CloseHandle_(hNewSocket)
;EndIf
CloseHandle_(Process)
;EndIf       
;EndIf     
;EndIf
   
;Next

GlobalFree_(Addr)
ProcedureReturn Ports.s
EndProcedure


;Beispiel:
InitNetwork()
CreateNetworkServer(120)
CreateNetworkServer(121)

Ports$=GetUsedPorts.s(GetCurrentProcessId_()) ; Wenn ein port öfters vorhanden ist, sind es verschiedene Protokolle.

MessageRequester("Ports",Ports$)
aber irgent wie will der nicht
weil der compiler immer sagt "Line 62: This var doesn't habe a Structure"
und kann mir auch einer sagen warum in dem code so viele EndIf waren [die habe ich jetzt erst mal alle aus kommentiert]
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag von Hroudtwolf »

Scheint ein Copy/Paste Prob gegeben zu haben.
Denn ich hab mir eben den Code geholt und er geht.

Code: Alles auswählen

 ;ACHTUNG:
;FUNKTIONIERT NUR MIT WINDOWS 2000 UND WINDOWS XP !

#TOKEN_QUERY=8
#TOKEN_ADJUST_PRIVILEGES=32
#PROCESS_DUP_HANDLE=64
#STANDARD_RIGHTS_ALL=2031616
#GENERIC_ALL=268435456

Procedure.s GetUsedPorts(ProcessID)
  Global GetPorts_AlreadyCalled
 
  Select OSVersion()
  Case #PB_OS_Windows_2000
  OSDepType=26
  Case #PB_OS_Windows_XP
  OSDepType=28
  Default
  ProcedureReturn ""
  EndSelect
 
  If GetPorts_AlreadyCalled=0
   
    NewToken.TOKEN_PRIVILEGES
    OldToken.TOKEN_PRIVILEGES
    FoundPorts=0
    AdvapiInst=LoadLibrary_("advapi32.dll")
    If AdvapiInst
      Addr1=GetProcAddress_(AdvapiInst,"LookupPrivilegeValueA")
      Addr2=GetProcAddress_(AdvapiInst,"OpenProcessToken")
      Addr3=GetProcAddress_(AdvapiInst,"AdjustTokenPrivileges")
      If  Addr1<>0 And Addr2<>0 And Addr3<>0
        Result=CallFunctionFast(Addr2,GetCurrentProcess_(),#TOKEN_ADJUST_PRIVILEGES|#TOKEN_QUERY,@A)
        If Result
          Result=CallFunctionFast(Addr1,"","SeDebugPrivilege",OldToken\Privileges[0]\Luid)
          If Result
            NewToken\PrivilegeCount=1
            NewToken\Privileges[0]\Attributes=#SE_PRIVILEGE_ENABLED
            NewToken\Privileges[0]\Luid\LowPart=OldToken\Privileges[0]\Luid\LowPart
            NewToken\Privileges[0]\Luid\HighPart=OldToken\Privileges[0]\Luid\HighPart
            CallFunctionFast(Addr3,A,0,NewToken,SizeOf(TOKEN_PRIVILEGES),OldToken,@dummy)
          EndIf
        EndIf
      EndIf
      FreeLibrary_(AdvapiInst)
    EndIf
  If Result=0
  Else
  GetPorts_AlreadyCalled=-1
  EndIf
  EndIf

  QuerySizePtr=GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,20)
 
  If QuerySizePtr=0:ProcedureReturn "":EndIf
  NtQuerySystemInformation_(16,QuerySizePtr,20,0)
  Size=(PeekL(QuerySizePtr)-1)*16+20
  GlobalFree_(QuerySizePtr)
  If Size<=4:ProcedureReturn "":EndIf
 
  Addr=GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,Size)
  If Addr=0:ProcedureReturn "":EndIf
 
  NtQuerySystemInformation_(16,Addr,Size,0)
  For Count=0 To Size-16 Step 16
    AppProcessID=PeekW(Addr+Count+4)&$FFFF
    Type=PeekB(Addr+Count+8)&$FF
    hSocket=PeekW(Addr+Count+10)&$FFFF
   
    If AppProcessID=ProcessID
     
      If Type=OSDepType
       
        Process=OpenProcess_(#PROCESS_DUP_HANDLE,0,ProcessID)
        If Process
          DuplicateHandle_(Process,hSocket,GetCurrentProcess_(),@hNewSocket,#STANDARD_RIGHTS_ALL|#GENERIC_ALL,0,0)
          If hNewSocket
           
            FileType=GetFileType_(hNewSocket)
           
            If FileType=3
                         
              SockNameSize=SizeOf(sockaddr_in)
              If getsockname_(hNewSocket,SockName.sockaddr_in,@SockNameSize)=0
               
                If FoundPorts>0:Ports.s+",":EndIf
                FoundPorts+1
                Ports.s+Str(htons_(SockName\sin_port)&$FFFF)
              EndIf             
             
            EndIf           
            CloseHandle_(hNewSocket)
          EndIf
         CloseHandle_(Process)
        EndIf       
      EndIf     
    EndIf
   
  Next

  GlobalFree_(Addr)
  ProcedureReturn Ports.s
EndProcedure


;Beispiel:
InitNetwork()
CreateNetworkServer(120)
CreateNetworkServer(121)

Ports$=GetUsedPorts.s(GetCurrentProcessId_()) ; Wenn ein port öfters vorhanden ist, sind es verschiedene Protokolle.

MessageRequester("Ports",Ports$)
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Also bei mir funktioniert der Originalcode von dem Link, den du gepostet hast, einwandfrei.

Der Compiler gibt keine Fehler aus, auch sind da keine EndIfs zuviel.

Ich benutze PB3.94.


Edit: Dein Code funktioniert bei mir auch.
Edit2: Meinte Hroudwolfs Code... hab garnicht so richtig gecheckt, das da zwei Code gepostet wurden /:-> :freak:
Zuletzt geändert von Laurin am 21.09.2005 13:19, insgesamt 1-mal geändert.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
IcedCoffee
Beiträge: 115
Registriert: 09.07.2005 12:11
Wohnort: Fürstenwald [Internat], Berlin[wen keine lust auf Internat], Wildau[Einfamilienhaus]
Kontaktdaten:

Beitrag von IcedCoffee »

:freak: der code von Hroudtwolf geht bei mir
:freak: aber meiner nicht [naja egal] THX
Antworten