Seite 1 von 1

Programm hinter Port ermitteln

Verfasst: 21.09.2005 12:58
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]

Verfasst: 21.09.2005 13:05
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$)

Verfasst: 21.09.2005 13:10
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:

Verfasst: 21.09.2005 13:14
von IcedCoffee
:freak: der code von Hroudtwolf geht bei mir
:freak: aber meiner nicht [naja egal] THX