Avatar billede jakobdo Ekspert
25. november 2003 - 10:08 Der er 51 kommentarer og
1 løsning

Hvordan finder jeg hvilke programmer der bruger hvilke porte?

Hej,
jeg ville gerne lave et program, som kan vise hvilke programmer, der har hvilke porte åben?

F.eks. ved jeg at RPC (svchost bruger port 135), men hvordan finder jeg ud af det via kode?

Gerne et lille eksempel!
Jeg har lavet et program som viser alle aktive processer, måske det kan bruges?
Avatar billede jakobdo Ekspert
25. november 2003 - 10:44 #1
Arne, hvor er du når jeg skal bruge hjælp? :o)
Avatar billede arne_v Ekspert
25. november 2003 - 10:48 #2
Jeg er her, men jeg har ikke nogen løsning.

De fleste bruger teknikken at de checker hvilke porte der er noget
som lytter på og så slår de portene op i IANA's liste.

Den kode kan man få en start på ved at finde noget source til
netstat.

Men du vil jo også vide hvilke programmer der lytter på en given port og
det har jeg ikke nogen gode bud på.
Avatar billede jakobdo Ekspert
25. november 2003 - 10:49 #3
Øv...
Et program som gør det jeg vil, kan hentes her: http://www.foundstone.com/index.htm?subnav=resources/navigation.htm&subcontent=/resources/proddesc/fport.htm

men jeg ville jo gerne selv lave det...
Avatar billede jakobdo Ekspert
25. november 2003 - 14:32 #4
Hvis nu vi gør det lidt mindre svært...
Hvis jeg f.eks. ved at port 135 er åben på min puter, kan jeg så finde ud af hvad som lytter på den/hvilket program?
Er der nogen måde hvor jeg kan få alle åbne porte?
Eller er det simpelthen bare ved at teste connect mod alle porte fra en ende af?
Avatar billede jakobdo Ekspert
25. november 2003 - 18:53 #5
Hvis jeg vil se om en port er åben eller ej, kan jeg vel oprette en socket, og derefter connect...
Hvis den connecter ok, så er der vel hul...

Eller er denne antagelse forkert?
Avatar billede arne_v Ekspert
25. november 2003 - 19:00 #6
Det er en måde at finde de porte hvor der er noget.
Avatar billede arne_v Ekspert
25. november 2003 - 19:18 #7
Du behøver iøvrigt ikke engang en non-windows-utility.

netstat kan også gøre det.

Se:
  http://support.microsoft.com/default.aspx?scid=kb;EN-US;281336
Avatar billede jakobdo Ekspert
26. november 2003 - 09:36 #8
Den netstat jeg har her (Windows 2k Pro) der har jeg ikke denne option -o...
Men stadig væk, jeg vil kunne lave det selv... :o(
Avatar billede jakobdo Ekspert
26. november 2003 - 09:38 #9
Det virker kun på XP Pro og Home Edition...
Avatar billede jakobdo Ekspert
27. november 2003 - 16:15 #10
Jeg har fundet frem til lidt hjælp! Man skal bruge denne funktion: GetTcpTable og GetUdpTable...
Avatar billede arne_v Ekspert
27. november 2003 - 16:24 #11
Den ser ud til at kunne lave en netstat.

Men jeg kan ikke lige se process info.
Avatar billede jakobdo Ekspert
27. november 2003 - 16:35 #12
Nej, og det er jo der problemet ligger... :o(
Avatar billede jakobdo Ekspert
27. november 2003 - 16:35 #13
Jeg har ingen ide til hvordan jeg får pid frem fra en port!
Avatar billede jakobdo Ekspert
27. november 2003 - 16:38 #14
Og man skal jo starte et sted...
Avatar billede arne_v Ekspert
27. november 2003 - 23:26 #15
Nu ved jeg ikk ehvor langt du er kommet, men her er et lille
stykke simpelt kode:

#include <iostream>

using namespace std;

#include <windows.h>

// I have a compiler setup problem - this is a hack
#define PMIB_ICMP_EX void*

#include <iphlpapi.h>

int main()
{
  char buf[100000];
  DWORD len = sizeof(buf);
  GetTcpTable((MIB_TCPTABLE *)buf,&len,1);
  MIB_TCPTABLE *table = (MIB_TCPTABLE *)buf;
  MIB_TCPROW *row = table->table;
  for(int i=0;i<table->dwNumEntries;i++)
  {
      cout << ntohs((short)row[i].dwLocalPort) << endl;
  }
  return 0;
}
Avatar billede jakobdo Ekspert
28. november 2003 - 09:05 #16
Hej Arne,
så langt er jeg også! Mangler at få PID og dermed kunne finde hvilket program som bruger hvilken port... :o(

Men takker stadig for din hjælp! :o)
Avatar billede arne_v Ekspert
28. november 2003 - 21:37 #17
Bingo !

Der er 2 udokumenterede kald i IPHLPAPI:
  AllocateAndGetTcpExTableFromStack
  AllocateAndGetUdpExTableFromStack

Du kan læse mere her:

http://www.codetools.com/internet/enetstatasp.asp

og hente noget fungerende kode her:

http://www.sysinternals.com/files/netstatp.zip
Avatar billede jakobdo Ekspert
30. november 2003 - 13:36 #18
Du giver aldrig op! :o) Men det er lidt noget skidt, der virker kun på Xp og 2K... :o(

Men takker anyways... :o)
Avatar billede arne_v Ekspert
30. november 2003 - 13:40 #19
Det foundstone du selv har fundet siger også:
  fport supports Windows NT4, Windows 2000 and Windows XP

Det er jo meget muligt at man ikek kan på 95/98/ME.
Avatar billede arne_v Ekspert
30. november 2003 - 13:40 #20
Og - nej jeg bryder mig ikke om at give op - kan andre lave det - så kan det
jo lade sig gøre.
Avatar billede jakobdo Ekspert
01. december 2003 - 10:04 #21
Det tool jeg allerede har lavet, viser kørende processer, og det skal lige siges, hvis det køres på Win9X, siger den fejl i psapi, så der er muligt det ikke kan laves! Men jeg roder stadig, skal nok sige til hvis jeg finder mere info.
Avatar billede arne_v Ekspert
01. december 2003 - 10:38 #22
Man kan godt finde kørende processer på 95/98/ME - man skal bare
kalde lidt anderledes, hvis jeg husker rigtigt.
Avatar billede arne_v Ekspert
01. december 2003 - 10:40 #23
Avatar billede arne_v Ekspert
11. december 2003 - 21:10 #24
Kommet videre ?
Avatar billede jakobdo Ekspert
12. december 2003 - 09:21 #25
Desværre, jeg er gået lidt i stå...
Hvilket måske skyldes at jeg ikke kan finde nogle includes på min puter som understøtter:

AllocateAndGetTcpExTableFromStack
AllocateAndGetUdpExTableFromStack
Avatar billede arne_v Ekspert
12. december 2003 - 10:01 #26
Udokumenterede kald er ikke i .h filer - du bliver bødt til selv
at erklære dem.
Avatar billede arne_v Ekspert
12. december 2003 - 10:01 #27
nødt
Avatar billede jakobdo Ekspert
12. december 2003 - 10:53 #28
Ok, sidder lige og leger med at hente funktioner ud af en DLL, nyt for mig! (jeg har mange bolde i luften for tiden...)
Avatar billede jakobdo Ekspert
12. februar 2004 - 09:14 #29
Lukker
Avatar billede jakobdo Ekspert
26. februar 2004 - 13:43 #30
Så er jeg tilbage til det gamle problem igen... Hvordan finder jeg ud af at erklære disse 2 udokumenterede kald?
Avatar billede arne_v Ekspert
26. februar 2004 - 13:47 #31
Du putter bare erklæringen i din kode. I den .cpp fil som kalder dem.

Download et af de eksempler som bruger dem og kopier erklæring derfra.
Avatar billede jakobdo Ekspert
26. februar 2004 - 14:01 #32
Det jeg mener er, hvordan ved jeg hvad jeg skal kalde funktionen med, og hvordan finder jeg ud af hvad den returnere?
Avatar billede jakobdo Ekspert
26. februar 2004 - 14:03 #33
Jeg har et eksempel som gør følgende:

DWORD (WINAPI *pAllocateAndGetTcpExTableFromStack)(PMIB_TCPEXTABLE *pTcpTable, BOOL bOrder, HANDLE heap, DWORD zero, DWORD flags);
pAllocateAndGetTcpExTableFromStack = (PVOID) GetProcAddress( LoadLibrary( "iphlpapi.dll"), "AllocateAndGetTcpExTableFromStack" );

Men jeg får fejlen:
Error E2034 tcpudpex.cpp 16: Cannot convert 'void *' to 'unsigned long (__stdcal
l *)(MIB_TCPEXTABLE * *,int,void *,unsigned long,unsigned long)'

Hvordan er man fundet frem til hvordan de benyttes?
Jeg vil vide noget mere om dem! :o(
Avatar billede arne_v Ekspert
26. februar 2004 - 14:07 #34
Det eksempel er meget dårlig kode.

Bemærk iøvrigt at det ikke kalder noget. De finder kun en function pointer.
Avatar billede jakobdo Ekspert
26. februar 2004 - 14:07 #35
Jojo, men det skla jeg jo starte med!
Har du et bedre kode eksempel?
Avatar billede arne_v Ekspert
26. februar 2004 - 14:08 #36
Du bør lave en typdef og så typecaste til den definerede type.
Avatar billede arne_v Ekspert
26. februar 2004 - 14:09 #37
Avatar billede jakobdo Ekspert
26. februar 2004 - 14:14 #38
Jeg har lavet koden:

#include <stdio.h>
#include <windows.h>

typedef VOID (*MYPROC)(LPTSTR);

VOID main(VOID)
{
    HINSTANCE hinstLib;
    MYPROC ProcAdd;
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

    // Get a handle to the DLL module.
    hinstLib = LoadLibrary("iphlpapi.dll");

    // If the handle is valid, try to get the function address.
    if (hinstLib != NULL)
    {
            printf("+ LoadLibrary\n");
        ProcAdd = (MYPROC) GetProcAddress(hinstLib, "AllocateAndGetTcpExTableFromStack");

        // If the function address is valid, call the function.
        if (NULL != ProcAdd)
        {
            printf("+ GetProcAddress\n");
            fRunTimeLinkSuccess = TRUE;
            (ProcAdd) ("message via DLL function\n");
        }
        else
        {
            printf("- GetProcAddress\n");
        }

        // Free the DLL module.

        fFreeResult = FreeLibrary(hinstLib);
    }
    else
    {
        printf("- LoadLibrary\n");
    }

    // If unable to call the DLL function, use an alternative.

    if (! fRunTimeLinkSuccess)
        printf("message via alternative method\n");
}

Og den failer i dette kald:

ProcAdd = (MYPROC) GetProcAddress(hinstLib, "AllocateAndGetTcpExTableFromStack");
Avatar billede arne_v Ekspert
26. februar 2004 - 14:17 #39
MYPROC er jo defineret forkert i forhold til den signatur den skal have.

Hvad fejl får du ?
Avatar billede jakobdo Ekspert
26. februar 2004 - 14:20 #40
C:\Tools>runtime
+ LoadLibrary
- GetProcAddress - Error: 127
message via alternative method
Avatar billede jakobdo Ekspert
26. februar 2004 - 14:34 #41
Fejl kode 127, dækker over:
127 The specified procedure could not be found. ERROR_PROC_NOT_FOUND
Avatar billede arne_v Ekspert
26. februar 2004 - 14:36 #42
Hmm.

Den siger at AllocateAndGetTcpExTableFromStack ikke er i iphlpapi.dll
Avatar billede jakobdo Ekspert
26. februar 2004 - 14:37 #43
Roger, og jeg bruger ellers win2k!
Avatar billede jakobdo Ekspert
26. februar 2004 - 14:38 #44
Kan teste en winxp senere...
Avatar billede jakobdo Ekspert
26. februar 2004 - 14:39 #45
Det mærkelig er dog at kører jeg Fport så får jeg fint PID vs port.
Avatar billede arne_v Ekspert
26. februar 2004 - 14:43 #46
Hm.

netstatp.h siger:

//
// Undocumented extended information structures available
// only on XP and higher
//
Avatar billede jakobdo Ekspert
26. februar 2004 - 14:50 #47
Lige præcis, fandt også et andet eksempel...
Nu begynder det at blive mærkeligt. Hvordan F..... laver et program under 2000 samme ting!
Avatar billede arne_v Ekspert
26. februar 2004 - 15:16 #48
AllocateAndGetTcpExTableFromStack er først fra XP men
AllocateAndGetTcpTableFromStack skulle være der fra 2000 !
Avatar billede arne_v Ekspert
26. februar 2004 - 15:17 #49
typedef struct _MIB_TCPROW {
        DWORD dwState;
        DWORD dwLocalAddr;
        DWORD dwLocalPort;
        DWORD dwRemoteAddr;
        DWORD dwRemotePort;
    } MIB_TCPROW, *PMIB_TCPROW;

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

    typedef struct _MIB_UDPROW {
        DWORD dwLocalAddr;
        DWORD dwLocalPort;
    } MIB_UDPROW, *PMIB_UDPROW;

    typedef struct _MIB_UDPTABLE {
        DWORD dwNumEntries;
        MIB_UDPROW table[ANY_SIZE];
    } MIB_UDPTABLE, *PMIB_UDPTABLE;

    typedef struct _MIB_TCPROW_EX
    {
        DWORD dwState;
        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;

    DWORD WINAPI AllocateAndGetTcpTableFromStack(
        OUT PMIB_TCPTABLE *pTcpTable,
        IN BOOL bOrder,
        IN HANDLE hAllocHeap,
        IN DWORD dwAllocFlags,
        IN DWORD dwProtocolVersion;
    );

    DWORD WINAPI AllocateAndGetUdpTableFromStack(
        OUT PMIB_UDPTABLE *pUdpTable,
        IN BOOL bOrder,
        IN HANDLE hAllocHeap,
        IN DWORD dwAllocFlags,
        IN DWORD dwProtocolVersion;
    );

    DWORD WINAPI AllocateAndGetTcpExTableFromStack(
        OUT PMIB_TCPTABLE_EX *pTcpTableEx,
        IN BOOL bOrder,
        IN HANDLE hAllocHeap,
        IN DWORD dwAllocFlags,
        IN DWORD dwProtocolVersion;
    );

    DWORD WINAPI AllocateAndGetUdpExTableFromStack(
        OUT PMIB_UDPTABLE_EX *pUdpTableEx,
        IN BOOL bOrder,
        IN HANDLE hAllocHeap,
        IN DWORD dwAllocFlags,
        IN DWORD dwProtocolVersion;
    );
Avatar billede arne_v Ekspert
26. februar 2004 - 15:19 #50
Nope.

Det er kun Ex som indeholder process ID.
Avatar billede arne_v Ekspert
26. februar 2004 - 15:20 #51
Så må den utility jo gøre det samme som Ex rutinerne i iphlpapi.dll gør.
Avatar billede jakobdo Ekspert
26. februar 2004 - 15:43 #52
Meget mærkeligt...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester