Skocz do zawartości

Ping


Burn

Recommended Posts

Witam
Może i to dość proste, jednak ja nigdy nie zajmowalem sie programowaniem aplikacji sieciowych przy użyciu WinApi. Czy ktoś może podać przykład jak napisać (oczywiście w WinApi) funkcję która zwróci te informacjie co komenda Ping (W takiej lub podobnej postaci) z tym, że chcę mieć dostęp do poszczególnych zawartych tam informacji. Dobrze by było gdyby można podać nazwę lub adres IP.
Pozdro

Link do komentarza
Udostępnij na innych stronach

Hmmm...kiedyś kiedy jeszcze był dział download, było źródło programu typu ping...napisał je bodajże Dracula, ale nie jestem pewnien...cóż do tego najlepiej wykorzystać protokół udp, jednak nie mam nigdzie gotowej funkcji i czasu (hyh), dlatego dam ci linka do fajnego kursu: https://www.keeller.kompozytor.net/ws_wprowadzenie.php

Pozdrawiam

Link do komentarza
Udostępnij na innych stronach

Dzięki, już sobie poradziłem :) Wszystko działa :) Napisałem (w MASM) to tak:

To jest kod modułu ping.inc

include wsock32.inc
includelib wsock32.lib

PingInit PROTO
PingClean PROTO
Ping PROTO :DWORD,:DWORD,:DWORD,:WORD

.const   
    ECHO_PACKET_SIZE            equ 32 ;rozmiar pakietu danych
               
    PING_INIT_OK                equ 0
    PING_INIT_ERROR_LOADLIB     equ 1
    PING_INIT_ERROR_GETPROCADDR equ 2
    PING_INIT_ERROR_WSASTARTUP  equ 3
   
    PING_INVALID_HOSTNAME       equ -1
   
.data
   
    szIcmp            db "icmp.dll",0
    szIcmpCreateFile  db "IcmpCreateFile",0
    szIcmpCloseHandle db "IcmpCloseHandle",0
    szIcmpSendEcho    db "IcmpSendEcho",0

.data?
    
    hIcmp             dd ?
    lpIcmpCreateFile  dd ?
    lpIcmpCloseHandle dd ?
    lpIcmpSendEcho    dd ?         

.code

PingInit proc 
LOCAL wsa: WSADATA
          
        invoke LoadLibrary, offset szIcmp
        cmp eax, 0
        je errorloadlib
        mov hIcmp, eax
        
    invoke GetProcAddress, hIcmp, offset szIcmpCreateFile
    cmp eax, 0
    je errorgetprocaddr
    mov lpIcmpCreateFile, eax
    
    invoke GetProcAddress, hIcmp, offset szIcmpCloseHandle
    cmp eax, 0
    je errorgetprocaddr
    mov lpIcmpCloseHandle, eax
    
    invoke GetProcAddress, hIcmp, offset szIcmpSendEcho
    cmp eax, 0
    je errorgetprocaddr
    mov lpIcmpSendEcho, eax
    
    invoke WSAStartup, 0101h, addr wsa
    cmp eax, 0
    jne errorwsastartup
    sub eax, eax
    ret
    errorwsastartup:
    inc eax ;eax = 3 Error PING_INIT_ERROR_WSASTARTUP
    errorgetprocaddr:
    push eax
    invoke FreeLibrary, hIcmp
    pop eax
    inc eax ;eax = 2 Error PING_INIT_ERROR_GETPROCADDR
    errorloadlib:    
    inc eax ;eax = 1 Error PING_INIT_ERROR_LOADLIB
        ret
              
PingInit endp

PingClean proc
        
        invoke WSACleanup
        invoke FreeLibrary, hIcmp
        ret

PingClean endp

Ping proc uses esi lpAddr:DWORD, lpEcho:DWORD, lpOptions:DWORD, TimeOut:WORD
LOCAL addrIP: DWORD
LOCAL hIcmpFile: DWORD
LOCAL acPingBuffer[ECHO_PACKET_SIZE]: BYTE
        

         invoke inet_addr, lpAddr
         mov addrIP, eax
         
         .if eax == INADDR_NONE
                invoke gethostbyname, lpAddr
                .if eax == 0  
                    dec eax ;eax = -1 PING_INVALID_HOSTNAME                     
                ret
                .endif
                mov eax, dword ptr [eax + 12]
                mov eax, dword ptr [eax]
                mov eax, dword ptr [eax]
                mov addrIP, eax
         .endif 
                 
         invoke RtlFillMemory, addr acPingBuffer, ECHO_PACKET_SIZE, 0AAh
         
         call lpIcmpCreateFile
         mov hIcmpFile, eax
                 
         mov esi, lpEcho
         assume esi: ptr ICMP_ECHO_REPLY
         lea eax, acPingBuffer
         mov [esi].DataPointer, eax
         mov [esi].DataSize, ECHO_PACKET_SIZE
         assume esi: nothing
         
         push TimeOut
         push sizeof ICMP_ECHO_REPLY + ECHO_PACKET_SIZE
         push lpEcho
         push lpOptions
         push ECHO_PACKET_SIZE
         lea  eax, acPingBuffer
         push eax
         push addrIP
         push hIcmpFile
         call lpIcmpSendEcho
         
         push eax
         
         push hIcmpFile
         call lpIcmpCloseHandle 
         
         pop eax                 
         ret

Ping endp

Najpierw wywołuję funkcję PingInit, później Ping i odpowiednio formatuję dane które podaję/otrzymuję no i po wszystkim PingClean.
Parametry funkcji Ping to:
lpAddr - adres lub nazwa hosta
lpEcho - adres zmiennej typu ICMP_ECHO_REPLY (zwraca potrzebne mi informacje)
lpOptions - adres zmiennej typu ICMP_OPTIONS (tu podaję niektóre dane np. TTL)
TimeOut - max. czas odpowiedzi
Wydaje mi się że wszystko działa poprawnie, gdyby jednak ktos zauważył jakiś błąd to proszę o wyjaśnienie co i dlaczego jest źle.
Pozdrawiam

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...