2011-06-27 14 views
8

De acuerdo, estoy ampliando el daemon proveedor de flexlm de mi empresa para que sea un poco más revelador para las aplicaciones cliente.Encontrar puertos tcp utilizados por la aplicación

Necesito poder averiguar qué puerto está escuchando lmgrd antes de que los clientes se conecten. La documentación de la API parece ser bastante estéril, y creo que conservan la mayor parte de su código en forma compilada, por lo que no puedo mirar su fuente.

¿Es posible recurrir al asombroso poder de la API de Windows para averiguar qué puertos está usando un proceso en particular? Si Process Explorer de sysinternals puede hacerlo, ¿debería poder hacerlo bien? ¿Alguien tiene código de muestra para esto?

Necesita ser compatible con Windows XP o superior ya que muchos de nuestros clientes aún no se han actualizado.

Edit: Debo notar que resulta que FLEX tiene soporte para extraer el puerto del archivo de licencia. No tengo el código en frente de mí, pero sé que esta no es la mejor manera de averiguar qué puertos está ejecutando el daemon/lmgrd de tu proveedor.

Respuesta

7

GetTcpTable2 - ver EDITAR

http://msdn.microsoft.com/en-us/library/bb408406(v=vs.85).aspx

La función GetTcpTable recupera la tabla de conexiones TCP IPv4.

Esto completará una estructura MIB_TCPTABLE.

typedef struct _MIB_TCPTABLE { 
    DWORD  dwNumEntries; 
    MIB_TCPROW table[ANY_SIZE]; 
} MIB_TCPTABLE, *PMIB_TCPTABLE; 

Y ahora el MIB_TCPROW

typedef struct _MIB_TCPROW { 
    DWORD dwState; 
    DWORD dwLocalAddr; 
    DWORD dwLocalPort; 
    DWORD dwRemoteAddr; 
    DWORD dwRemotePort; 
} MIB_TCPROW, *PMIB_TCPROW; 

EDITAR IMPORTANTE:

Es necesario utilizar GetTcpTable2 con el fin de obtener el PID correspondiente asocia también.

typedef struct _MIB_TCPROW2 { 
    DWORD      dwState; 
    DWORD      dwLocalAddr; 
    DWORD      dwLocalPort; 
    DWORD      dwRemoteAddr; 
    DWORD      dwRemotePort; 
    DWORD      dwOwningPid; 
    TCP_CONNECTION_OFFLOAD_STATE dwOffloadState; 
} MIB_TCPROW2, *PMIB_TCPROW2; 

dwOwningPid

+0

mierda. No se puede hacer. Parece que la función GetTcpTable2 es una función Vista y superior. Debería haber especificado que debería funcionar con Windows XP como mínimo ya que muchos de nuestros clientes aún no se han actualizado. Actualizaré mi publicación original. Excelente hallazgo, debo decir. – RandomInsano

+0

Entonces ... parece que la versión más cercana de Windows XP es AllocateAndGetTcpExTableFromStack http://msdn.microsoft.com/en-us/library/aa365804(v=vs.85).aspx – RandomInsano

+1

Las funciones GetTcpTable o GetExtendedTcpTable deberían se utilizará para recuperar la tabla de conexión TCP en lugar de utilizar la función AllocateAndGetTcpExTableFromStack. Nota La función AllocateAndGetTcpExTableFromStack está en desuso y no es compatible con Windows Vista y posterior.En el Kit de desarrollo de software de Microsoft Windows (SDK) lanzado para Windows Vista y posterior, el prototipo de función para AllocateAndGetTcpExTableFromStack aún se define en el archivo de encabezado Iphlpapi.h para soporte continuo en Windows Server 2003 y Windows XP. – flumpb

3

En el peor de los casos, se ha podido analizar siempre la salida:

netstat -bna 
+0

idea interesante. Más para encontrar una versión de ingeniería inversa de esa aplicación. He caído sobre el viejo código fuente winternals y veré cómo ese tipo implementó su aplicación TCPView. – RandomInsano

4

Aquí está el código que terminó con, para cualquier persona que golpea este problema después de mí

#include "stdafx.h" 
#include <windows.h> 
#include <iphlpapi.h> 

// These are just for the ntohl function in the printf below 
#include <winsock.h> 
#pragma comment(lib, "Ws2_32.lib") 

DWORD (WINAPI *pGetExtendedTcpTable)(
    PVOID pTcpTable, 
    PDWORD pdwSize, 
    BOOL bOrder, 
    ULONG ulAf, 
    TCP_TABLE_CLASS TableClass, 
    ULONG Reserved 
); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    MIB_TCPTABLE_OWNER_PID *pTCPInfo; 
    MIB_TCPROW_OWNER_PID *owner; 
    DWORD size; 
    DWORD dwResult; 

    HMODULE hLib = LoadLibrary("iphlpapi.dll"); 

    pGetExtendedTcpTable = (DWORD (WINAPI *)(PVOID,PDWORD,BOOL,ULONG,TCP_TABLE_CLASS,ULONG)) 
     GetProcAddress(hLib, "GetExtendedTcpTable"); 

    if (!pGetExtendedTcpTable) 
    { 
     printf("Could not load iphlpapi.dll. This application is for Windows XP SP2 and up.\n"); 
     return 1; 
    } 

    dwResult = pGetExtendedTcpTable(NULL,  &size, false, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0); 
    pTCPInfo = (MIB_TCPTABLE_OWNER_PID*)malloc(size); 
    dwResult = pGetExtendedTcpTable(pTCPInfo, &size, false, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0); 

    if (dwResult != NO_ERROR) 
    { 
     printf("Couldn't get our IP table"); 
     return 2; 
    } 

    printf("Iterating though table:\n"); 
    for (DWORD dwLoop = 0; dwLoop < pTCPInfo->dwNumEntries; dwLoop++) 
    { 
     owner = &pTCPInfo->table[dwLoop]; 

     printf(" PID: %5u - Port: %5u\n", owner->dwOwningPid, ntohs(owner->dwLocalPort)); 
    } 

    // Pause a moment 
    printf("Done Processing\n"); 

    return 0; 
} 
Cuestiones relacionadas