Map Port to Process oder Process to Port - Welche WINAPI Befehle sind hierbei hilfreich ?



  • Hi,

    ich möchte gerne eine application alias fport ( foundstone ) oder MS PortQry ( http://www.microsoft.com/downloads/thankyou.aspx?familyId=89811747-C74B-4638-A2D5-AC828BDC6983&displayLang=en&oRef=http%3A%2F%2Fwww.microsoft.com%2Fdownloads%2Fdetails.aspx%3Ffamilyid%3D69BA779B-BAE9-4243-B9D6-63E62B4BCD2E%26displaylang%3Den ) schreiben.

    Sie soll also angeben welche Ports im listening / connected ... Status sind und die Prozesse die den Port nutzen angeben.

    Durchwühle jetzt schon seit Stunden die API aber finde nichts passendes bräuchte einen Anfangspunkt.

    tia

    MFG c°h°





  • das sieht ja shconmal grossartig aus danke 🙂



  • bekomme das nur leider nicht zum laufen

    lässt sich zwar compilieren macht aber speicherprobleme der Fehler wird anscheinend durch folgende codezeile verursacht:

    [...]
    DWORD (WINAPI *pAllocateAndGetTcpExTableFromStack)(
      PMIB_TCPEXTABLE *pTcpTable,  // buffer for the connection table
      BOOL bOrder,               // sort the table?
      HANDLE heap,
      DWORD zero,
      DWORD flags
    );
    [...]
    PMIB_TCPEXTABLE tcpExTable;
    [...]
    error = pAllocateAndGetTcpExTableFromStack( &tcpExTable, TRUE, GetProcessHeap(), 2, 2 );
    

    Fehler: "Die Anweisung in "0x00000000" verweist auf Speicher in "0x00000000" Der Vorgang read konnte nicht auf dem Speicher durchgeführt werden."

    dachte es liegt an GetProcessHeap aber über diese Codezeile läuft er einfach drüber :

    if( GetProcessHeap() == NULL ){ 
    			printf("error %d",GetLastError());
    			return;
    		}
    

    ich kann leider nicht debuggen bzw weiss nicht wie mir das bei der Fehlerfindung helfen könnte.

    Danke für jede Hilfe



  • Du hast aber mittels "ExApisArePresent" geprüft ob die Funktionen da sind, oder?



  • ja

    [...]
    	exPresent = ExApisArePresent();
    
    	if( exPresent ) {
    [...]
    

    leider ists das nicht 😞



  • Da fällt mir ein ich hatte die Prozedur abgeändert

    mein code

    BOOLEAN
    ExApisArePresent(
    	VOID
    	)
    {
    	if(GetProcAddress( LoadLibrary( "iphlpapi.dll"), "AllocateAndGetTcpExTableFromStack" )== NULL) return FALSE;
    
    	if(GetProcAddress( LoadLibrary( "iphlpapi.dll"), "AllocateAndGetUdpExTableFromStack" )== NULL ) return FALSE;
    
    	if(GetProcAddress( GetModuleHandle( "kernel32.dll" ),"CreateToolhelp32Snapshot" )== NULL ) return FALSE;
    
    	if(GetProcAddress( GetModuleHandle( "kernel32.dll" ),"Process32First" ) == NULL ) return FALSE;
    
    	if(GetProcAddress( GetModuleHandle( "kernel32.dll" ), "Process32Next" ) == NULL ) return FALSE;
    	return TRUE;
    }
    

    urspünglicher code

    BOOLEAN
    ExApisArePresent(
    	VOID
    	)
    {
    	pAllocateAndGetTcpExTableFromStack = (PVOID) GetProcAddress( LoadLibrary( "iphlpapi.dll"), 
    				"AllocateAndGetTcpExTableFromStack" );
    	if( !pAllocateAndGetTcpExTableFromStack ) return FALSE;
    
    	pAllocateAndGetUdpExTableFromStack = (PVOID) GetProcAddress( LoadLibrary( "iphlpapi.dll"), 
    				"AllocateAndGetUdpExTableFromStack" );
    	if( !pAllocateAndGetUdpExTableFromStack ) return FALSE;
    
    	pCreateToolhelp32Snapshot = (PVOID) GetProcAddress( GetModuleHandle( "kernel32.dll" ),
    				"CreateToolhelp32Snapshot" );
    	if( !pCreateToolhelp32Snapshot ) return FALSE;
    
    	pProcess32First = (PVOID) GetProcAddress( GetModuleHandle( "kernel32.dll" ),
    				"Process32First" );
    	if( !pProcess32First ) return FALSE;
    
    	pProcess32Next = (PVOID) GetProcAddress( GetModuleHandle( "kernel32.dll" ),
    				"Process32Next" );
    	if( !pProcess32Next ) return FALSE;
    	return TRUE;
    }
    

    Der ursprüngliche Code erzeugte Kovertierungsfehler:

    \MyProjects\netstatp\main.cpp(269) : error C2440: '=' : cannot convert from 'void *' to 'unsigned long (__stdcall *)(MIB_TCPEXTABLE ** ,int,void *,unsigned long,unsigned long)'
            Conversion from 'void*' to pointer to non-'void' requires an explicit cast
    \MyProjects\netstatp\main.cpp(273) : error C2440: '=' : cannot convert from 'void *' to 'unsigned long (__stdcall *)(MIB_UDPEXTABLE ** ,int,void *,unsigned long,unsigned long)'
            Conversion from 'void*' to pointer to non-'void' requires an explicit cast
    \MyProjects\netstatp\main.cpp(277) : error C2440: '=' : cannot convert from 'void *' to 'void *(__stdcall *)(unsigned long,unsigned long)'
            Conversion from 'void*' to pointer to non-'void' requires an explicit cast
    \MyProjects\netstatp\main.cpp(281) : error C2440: '=' : cannot convert from 'void *' to 'int (__stdcall *)(void *,struct tagPROCESSENTRY32 *)'
            Conversion from 'void*' to pointer to non-'void' requires an explicit cast
    \MyProjects\netstatp\main.cpp(285) : error C2440: '=' : cannot convert from 'void *' to 'int (__stdcall *)(void *,struct tagPROCESSENTRY32 *)'
            Conversion from 'void*' to pointer to non-'void' requires an explicit cast
    

    Die (PVOID) Kovertierung mag mein Compiler irgendwie nicht

    Return Werte von GetProcAddress:
    -If the function succeeds, the return value is the address of the exported function or variable.

    -If the function fails, the return value is NULL. To get extended error information, call GetLastError.

    also sollte meine Version doch auch gehen oder ?



  • Ach ich hab den Denkfehler in meinem Codes gefunden die Entrypoints der Befehle werden ja so garnicht gespeichert.

    Nur das Konvertierungsproblem besteht leider immernoch.



  • Habs endlich hinbekommen 🙂
    danke nochmal für eure Hilfe

    BOOLEAN
    ExApisArePresent(
    	VOID
    	)
    {
    	pAllocateAndGetTcpExTableFromStack =  ( unsigned long (__stdcall*)(MIB_TCPEXTABLE ** ,int,void *,unsigned long,unsigned long)) GetProcAddress( LoadLibrary( "iphlpapi.dll"), "AllocateAndGetTcpExTableFromStack");
    
    	if( !pAllocateAndGetTcpExTableFromStack ) return FALSE;
    
    	pAllocateAndGetUdpExTableFromStack = ( unsigned long (__stdcall *)(MIB_UDPEXTABLE ** ,int,void *,unsigned long,unsigned long)) GetProcAddress( LoadLibrary( "iphlpapi.dll"), "AllocateAndGetUdpExTableFromStack" );
    	if( !pAllocateAndGetUdpExTableFromStack ) return FALSE;
    
    	pCreateToolhelp32Snapshot = (void *(__stdcall *)(unsigned long,unsigned long)) GetProcAddress( GetModuleHandle( "kernel32.dll" ), "CreateToolhelp32Snapshot" );
    	if( !pCreateToolhelp32Snapshot ) return FALSE;
    
    	pProcess32First = (int (__stdcall *)(void *,struct tagPROCESSENTRY32 *)) GetProcAddress( GetModuleHandle( "kernel32.dll" ), "Process32First" );
    	if( !pProcess32First ) return FALSE;
    
    	pProcess32Next = (int (__stdcall *)(void *,struct tagPROCESSENTRY32 *)) GetProcAddress( GetModuleHandle( "kernel32.dll" ), "Process32Next" );
    	if( !pProcess32Next ) return FALSE;
    	return TRUE;
    }
    

    MFG ch


Anmelden zum Antworten