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?
Annonceindlæg fra COMM2IG
25. november 2003 - 10:44
#1
Arne, hvor er du når jeg skal bruge hjælp? :o)
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å.
25. november 2003 - 10:49
#3
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?
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?
25. november 2003 - 19:00
#6
Det er en måde at finde de porte hvor der er noget.
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(
26. november 2003 - 09:38
#9
Det virker kun på XP Pro og Home Edition...
27. november 2003 - 16:15
#10
Jeg har fundet frem til lidt hjælp! Man skal bruge denne funktion: GetTcpTable og GetUdpTable...
27. november 2003 - 16:24
#11
Den ser ud til at kunne lave en netstat. Men jeg kan ikke lige se process info.
27. november 2003 - 16:35
#12
Nej, og det er jo der problemet ligger... :o(
27. november 2003 - 16:35
#13
Jeg har ingen ide til hvordan jeg får pid frem fra en port!
27. november 2003 - 16:38
#14
Og man skal jo starte et sted...
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; }
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)
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)
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.
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.
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.
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.
01. december 2003 - 10:40
#23
11. december 2003 - 21:10
#24
Kommet videre ?
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
12. december 2003 - 10:01
#26
Udokumenterede kald er ikke i .h filer - du bliver bødt til selv at erklære dem.
12. december 2003 - 10:01
#27
nødt
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...)
12. februar 2004 - 09:14
#29
Lukker
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?
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.
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?
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(
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.
26. februar 2004 - 14:07
#35
Jojo, men det skla jeg jo starte med! Har du et bedre kode eksempel?
26. februar 2004 - 14:08
#36
Du bør lave en typdef og så typecaste til den definerede type.
26. februar 2004 - 14:09
#37
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");
26. februar 2004 - 14:17
#39
MYPROC er jo defineret forkert i forhold til den signatur den skal have. Hvad fejl får du ?
26. februar 2004 - 14:20
#40
C:\Tools>runtime + LoadLibrary - GetProcAddress - Error: 127 message via alternative method
26. februar 2004 - 14:34
#41
Fejl kode 127, dækker over: 127 The specified procedure could not be found. ERROR_PROC_NOT_FOUND
26. februar 2004 - 14:36
#42
Hmm. Den siger at AllocateAndGetTcpExTableFromStack ikke er i iphlpapi.dll
26. februar 2004 - 14:37
#43
Roger, og jeg bruger ellers win2k!
26. februar 2004 - 14:38
#44
Kan teste en winxp senere...
26. februar 2004 - 14:39
#45
Det mærkelig er dog at kører jeg Fport så får jeg fint PID vs port.
26. februar 2004 - 14:43
#46
Hm. netstatp.h siger: // // Undocumented extended information structures available // only on XP and higher //
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!
26. februar 2004 - 15:16
#48
AllocateAndGetTcpExTableFromStack er først fra XP men AllocateAndGetTcpTableFromStack skulle være der fra 2000 !
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; );
26. februar 2004 - 15:19
#50
Nope. Det er kun Ex som indeholder process ID.
26. februar 2004 - 15:20
#51
Så må den utility jo gøre det samme som Ex rutinerne i iphlpapi.dll gør.
26. februar 2004 - 15:43
#52
Meget mærkeligt...
Kurser inden for grundlæggende programmering