Показать сообщение отдельно

  #37  
Старый 09.12.2007, 13:23
4nob1oz
Познающий
Регистрация: 09.07.2007
Сообщений: 42
Провел на форуме:
88752

Репутация: 72
По умолчанию

Меня знакомый недавно просил как смотреть открытые порты, как я ему не объяснял он так и не смог посмотреть их Накодил прогу ему быстренько. Показывает открытые TCP и UDP порты на машине с процессом который сообтвествует открытому порту.

Не пинайте за то что так всё криво и лишние хедеры висят, мне лень править. Да и процессы тоже криво определяет по pid ну короче может кому то и сгодится.

Код:
#include <Winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <Iphlpapi.h>
#include <conio.h>
#include <Tlhelp32.h>
#include <psapi.h>

#pragma comment ( lib, "Iphlpapi.lib" )
#pragma comment ( lib, "Ws2_32.lib" )
#pragma comment ( lib, "psapi.lib" )

typedef struct _MIB_TCPROW_EX
{
DWORD dwState; // MIB_TCP_STATE_*
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
DWORD dwProcessId;
} MIB_TCPROW_EX, *PMIB_TCPROW_EX;

typedef struct _MIB_TCPTABLE_EX
{
DWORD dwNumEntries;
MIB_TCPROW_EX table[ANY_SIZE];
} MIB_TCPTABLE_EX, *PMIB_TCPTABLE_EX;

typedef struct _MIB_UDPROW_EX
{
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwProcessId;
} MIB_UDPROW_EX, *PMIB_UDPROW_EX;

typedef struct _MIB_UDPTABLE_EX
{
DWORD dwNumEntries;
MIB_UDPROW_EX table[ANY_SIZE];
} MIB_UDPTABLE_EX, *PMIB_UDPTABLE_EX;

typedef DWORD (WINAPI *PROCALLOCATEANDGETTCPEXTABLEFROMSTACK)(PMIB_TCPTABLE_EX*,BOOL,HANDLE,DWORD,DWORD);
PROCALLOCATEANDGETTCPEXTABLEFROMSTACK lpfnAllocateAndGetTcpExTableFromStack = NULL;

typedef DWORD (WINAPI *PROCALLOCATEANDGETUDPEXTABLEFROMSTACK)(PMIB_UDPTABLE_EX*,BOOL,HANDLE,DWORD,DWORD);
PROCALLOCATEANDGETUDPEXTABLEFROMSTACK lpfnAllocateAndGetUdpExTableFromStack = NULL;

TCHAR *PrintProcessNameAndID( DWORD processID )
{
   	TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
    // Get a handle to the process.
    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
    // Get the process name.
    if (NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
        }
    }

    CloseHandle( hProcess );
		
	return (TCHAR *)&szProcessName;
}

int main()
{
	PMIB_TCPTABLE_EX pTcpTableEx;
	PMIB_UDPTABLE_EX pUdpTableEx;
	DWORD dwSize = 0,dwSizeUDP = 0;
	DWORD i = 0,j = 0;
	DWORD dwTcpErr,dwUdpErr;
	DWORD pid;
	char *ip_ptr,*ip_udp_ptr;
	unsigned short *port_ptr,*port_udp_ptr;
	HMODULE hMudule;
	
	hMudule = LoadLibrary("Iphlpapi.dll");

	if(hMudule == NULL) return 0;

	lpfnAllocateAndGetTcpExTableFromStack = (PROCALLOCATEANDGETTCPEXTABLEFROMSTACK)GetProcAddress(hMudule,"AllocateAndGetTcpExTableFromStack");
	lpfnAllocateAndGetUdpExTableFromStack = (PROCALLOCATEANDGETUDPEXTABLEFROMSTACK)GetProcAddress(hMudule,"AllocateAndGetUdpExTableFromStack");

	if (lpfnAllocateAndGetTcpExTableFromStack == NULL) return 0;
	if (lpfnAllocateAndGetUdpExTableFromStack == NULL) return 0;

	pTcpTableEx = (MIB_TCPTABLE_EX *) malloc(sizeof(MIB_TCPTABLE_EX));
	if(pTcpTableEx == NULL){ printf("Can't allocate memory."); GlobalFree(pTcpTableEx); }

	pUdpTableEx = (MIB_UDPTABLE_EX *) malloc(sizeof(MIB_UDPTABLE_EX));
	if(pUdpTableEx == NULL){ printf("Can't allocate memory."); GlobalFree(pUdpTableEx); }

	dwTcpErr = lpfnAllocateAndGetTcpExTableFromStack(&pTcpTableEx,TRUE,GetProcessHeap(),0,2);
	dwUdpErr = lpfnAllocateAndGetUdpExTableFromStack(&pUdpTableEx,TRUE,GetProcessHeap(),0,2);
	
	if(dwTcpErr == ERROR_SUCCESS)
	{
		printf("\n\nOpened TCP Ports\n");
		printf("----------------\n\n");
		for(i=0; i<pTcpTableEx->dwNumEntries;i++)
		{
			ip_ptr = (char *)&pTcpTableEx->table[i].dwLocalAddr;
			port_ptr = (unsigned short *)&pTcpTableEx->table[i].dwLocalPort;
			pid = pTcpTableEx->table[i].dwProcessId;
			if(pid == 4)
			{
			printf("%s:%ld <---> System\n",inet_ntoa(*(struct in_addr *)ip_ptr),htons(*port_ptr));
			}
			else
			{
				printf("%s:%ld <---> %s\n",inet_ntoa(*(struct in_addr *)ip_ptr),htons(*port_ptr),PrintProcessNameAndID(pid));
			}
		}
	}

	if(dwUdpErr == ERROR_SUCCESS)
	{
		printf("\n\nOpened UDP Ports\n");
		printf("----------------\n\n");
		for(i=0; i<pUdpTableEx->dwNumEntries;i++)
		{
			ip_udp_ptr = (char *)&pUdpTableEx->table[i].dwLocalAddr;
			port_udp_ptr = (unsigned short *)&pUdpTableEx->table[i].dwLocalPort;
			pid = pUdpTableEx->table[i].dwProcessId;
			if(pid == 4)
			{
			printf("%s:%ld <---> System\n",inet_ntoa(*(struct in_addr *)ip_udp_ptr),htons(*port_udp_ptr));
			}
			else
			{
				printf("%s:%ld <---> %s\n",inet_ntoa(*(struct in_addr *)ip_udp_ptr),htons(*port_udp_ptr),PrintProcessNameAndID(pid));
			}
		}
	}

	printf("\n\nPress any key to exit...");
	_getch();

	return 0;
}
 
Ответить с цитированием