Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;
  2. ; Automated dhcp client
  3. ;
  4. ; v 1.1
  5. ;
  6. ; by the hidden player
  7. ;
  8.  
  9. DEBUG equ 1
  10. TIMEOUT equ 60 ; in seconds
  11.  
  12. use32
  13.  
  14.                org    0x0
  15.  
  16.                db     'MENUET01'              ; 8 byte id
  17.                dd     0x01                    ; header version
  18.                dd     START                   ; start of code
  19.                dd     IM_END                  ; size of image
  20.                dd     I_END                   ; memory for app
  21.                dd     I_END                   ; esp
  22.                dd     0x0 , 0x0               ; I_Param , I_Icon
  23.  
  24. include 'macros.inc'
  25.  
  26. if DEBUG = 1
  27. include 'debug.inc'
  28. end if
  29.  
  30.  
  31. START:                          ; start of execution
  32.  
  33.     mov     eax,40                 ; Report events
  34.     mov     ebx,10000000b          ; Only Stack
  35.     int     0x40
  36.  
  37.     mov     eax,52                 ; first, enable the stack
  38.     mov     ebx,2
  39.     mov     ecx,0x00000383
  40.     int     0x40
  41.  
  42. if DEBUG = 1
  43.     newline
  44.     dps  "DHCP: Stack Initialized"
  45.     newline
  46. end if
  47.  
  48.     mov     eax, 53                ; then, read in the status
  49.     mov     ebx, 255
  50.     mov     ecx, 6
  51.     int     0x40
  52.  
  53.     cmp     eax,0                  ; if eax is zero, no driver was found
  54.     jne     @f
  55.  
  56. if DEBUG = 1
  57.     dps  "DHCP: No Card detected"
  58.     newline
  59. end if
  60.  
  61.     jmp  close
  62.  
  63.    @@:
  64. if DEBUG = 1
  65.     dps  "DHCP: Detected card: "
  66.     dph  eax
  67.     newline
  68. end if
  69.  
  70.     ; now that the stack is running, lets start the dhcp request
  71.  
  72.     ; First, open socket
  73.     mov     eax, 53
  74.     mov     ebx, 0
  75.     mov     ecx, 68                 ; local port dhcp client
  76.     mov     edx, 67                 ; remote port - dhcp server
  77.     mov     esi, -1                 ; broadcast
  78.     int     0x40
  79.  
  80.     mov     [socketNum], eax
  81.  
  82. if DEBUG = 1
  83.     dps   "DHCP: Socket opened: "
  84.     dpd   eax
  85.     newline
  86. end if
  87.  
  88.     ; Setup the first msg we will send
  89.     mov     byte [dhcpMsgType], 0x01 ; DHCP discover
  90.     mov     dword [dhcpLease], esi   ; esi is still -1 (-1 = forever)
  91.  
  92. ;***************************************************************************
  93. ;   Function
  94. ;      buildRequest
  95. ;
  96. ;   Description
  97. ;      Creates a DHCP request packet.
  98. ;
  99. ;***************************************************************************
  100. buildRequest:
  101.     ; Clear dhcpMsg to all zeros
  102.     xor     eax,eax
  103.     mov     edi,dhcpMsg
  104.     mov     ecx,512
  105.     cld
  106.     rep     stosb
  107.  
  108.     mov     edx, dhcpMsg
  109.  
  110.     mov     [edx], byte 0x01                ; Boot request
  111.     mov     [edx+1], byte 0x01              ; Ethernet
  112.     mov     [edx+2], byte 0x06              ; Ethernet h/w len
  113.     mov     [edx+4], dword 0x11223344       ; xid
  114.     mov     [edx+10], byte 0x80             ; broadcast flag set
  115.     mov     [edx+236], dword 0x63538263     ; magic number
  116.  
  117.     ; option DHCP msg type
  118.     mov     [edx+240], word 0x0135
  119.     mov     al, [dhcpMsgType]
  120.     mov     [edx+240+2], al
  121.  
  122.     ; option Lease time = infinity
  123.     mov     [edx+240+3], word 0x0433
  124.     mov     eax, [dhcpLease]
  125.     mov     [edx+240+5], eax
  126.  
  127. ;    ; option requested IP address
  128.     mov     [edx+240+9], word 0x0432
  129. ;    mov     eax, [dhcpClientIP]
  130. ;    mov     [edx+240+11], eax
  131.  
  132.     ; option request list
  133.     mov     [edx+240+15], word 0x0437
  134.     mov     [edx+240+17], dword 0x0f060301
  135.  
  136.     ; Check which msg we are sending
  137.     cmp     [dhcpMsgType], byte 0x01
  138.     jne     br001
  139.  
  140.     ; "Discover" options
  141.     ; end of options marker
  142.     mov     [edx+240+21], byte 0xff
  143.  
  144.     mov     [dhcpMsgLen], dword 262
  145.     jmp     ctr000
  146.  
  147. br001:
  148.     ; "Request" options
  149.  
  150.     ; server IP
  151.     mov     [edx+240+21], word 0x0436
  152.     mov     eax, [dhcpServerIP]
  153.     mov     [edx+240+23], eax
  154.  
  155.     ; end of options marker
  156.     mov     [edx+240+27], byte 0xff
  157.  
  158.     mov     [dhcpMsgLen], dword 268
  159.  
  160. ctr000:
  161.  
  162.     ; write to socket ( send broadcast request )
  163.     mov     eax, 53
  164.     mov     ebx, 4
  165.     mov     ecx, [socketNum]
  166.     mov     edx, [dhcpMsgLen]
  167.     mov     esi, dhcpMsg
  168.     int     0x40
  169.  
  170.     ; Setup the DHCP buffer to receive response
  171.  
  172.     mov     eax, dhcpMsg
  173.     mov     [dhcpMsgLen], eax      ; Used as a pointer to the data
  174.  
  175.     ; now, we wait for data from remote
  176.  
  177. wait_for_data:
  178.     mov     eax,23                 ; wait here for event   NOTE a TIME-OUT should be placed here
  179.     mov     ebx,TIMEOUT*100
  180.     int     0x40
  181.  
  182.     ; Any data in the UDP receive buffer?
  183.     mov     eax, 53
  184.     mov     ebx, 2
  185.     mov     ecx, [socketNum]
  186.     int     0x40
  187.  
  188.     cmp     eax, 0
  189.     jne     ctr002
  190.  
  191. if DEBUG = 1
  192.     dps  "DHCP: Timeout!"
  193.     newline
  194. end if
  195.  
  196.     jmp    close
  197.  
  198.     ; we have data - this will be the response
  199. ctr002:
  200.  
  201.     mov     eax, 53
  202.     mov     ebx, 3
  203.     mov     ecx, [socketNum]
  204.     int     0x40                ; read byte - block (high byte)
  205.  
  206.     ; Store the data in the response buffer
  207.     mov     eax, [dhcpMsgLen]
  208.     mov     [eax], bl
  209.     inc     dword [dhcpMsgLen]
  210.  
  211.     mov     eax, 53
  212.     mov     ebx, 2
  213.     mov     ecx, [socketNum]
  214.     int     0x40                ; any more data?
  215.  
  216.     cmp     eax, 0
  217.     jne     ctr002              ; yes, so get it
  218.  
  219.     ; depending on which msg we sent, handle the response
  220.     ; accordingly.
  221.     ; If the response is to a dhcp discover, then:
  222.     ;  1) If response is DHCP OFFER then
  223.     ;  1.1) record server IP, lease time & IP address.
  224.     ;  1.2) send a request packet
  225.     ;  2) else exit ( display error )
  226.     ; If the response is to a dhcp request, then:
  227.     ;  1) If the response is DHCP ACK then
  228.     ;  1.1) extract the DNS & subnet fields. Set them in the stack
  229.     ;  2) else exit ( display error )
  230.  
  231.  
  232.     cmp     [dhcpMsgType], byte 0x01    ; did we send a discover?
  233.     je      discover
  234.     cmp     [dhcpMsgType], byte 0x03    ; did we send a request?
  235.     je      request
  236.  
  237.     ; should never get here - we only send discover or request
  238.     jmp     close
  239.  
  240. discover:
  241.  
  242.     call    parseResponse
  243.  
  244.     ; Was the response an offer? It should be
  245.     cmp     [dhcpMsgType], byte 0x02
  246.     jne     close                  ; NO - so quit
  247.  
  248.     ; send request
  249.     mov     [dhcpMsgType], byte 0x03 ; DHCP request
  250.     jmp     buildRequest
  251.  
  252. request:
  253.  
  254.     call    parseResponse
  255.  
  256.     ; Was the response an ACK? It should be
  257.     cmp     [dhcpMsgType], byte 0x05
  258.     jne     close                  ; NO - so quit
  259.  
  260. close:
  261.  
  262.     ; close socket
  263.     mov     eax, 53
  264.     mov     ebx, 1
  265.     mov     ecx, [socketNum]
  266.     int     0x40
  267.  
  268. if DEBUG = 1
  269.     dps  "DHCP: Exiting"
  270.     newline
  271. end if
  272.  
  273.     mov     eax,-1                 ; at last, exit
  274.     int     0x40
  275.  
  276.  
  277. ;***************************************************************************
  278. ;   Function
  279. ;      parseResponse
  280. ;
  281. ;   Description
  282. ;      extracts the fields ( client IP address and options ) from
  283. ;      a DHCP response
  284. ;      The values go into
  285. ;       dhcpMsgType,dhcpLease,dhcpClientIP,dhcpServerIP,
  286. ;       dhcpDNSIP, dhcpSubnet
  287. ;      The message is stored in dhcpMsg
  288. ;
  289. ;***************************************************************************
  290. parseResponse:
  291.  
  292. if DEBUG = 1
  293.     dps  "DHCP: Data received, parsing response"
  294.     newline
  295. end if
  296.  
  297.     mov     edx, dhcpMsg
  298.  
  299.     pusha
  300.  
  301.     mov     eax,52          ; Set Client IP
  302.     mov     ebx,3
  303.     mov     ecx, [edx+16]
  304.     int     0x40
  305.  
  306. if DEBUG = 1
  307.     dps  "DHCP: Client: "
  308.  
  309.     xor   esi,esi
  310.    .loop:
  311.  
  312.     pusha
  313.     movzx eax,byte[edx+esi+16]
  314.     call  debug_outdec
  315.     popa
  316.  
  317.     inc   esi
  318.     cmp   esi,4
  319.     jne   .loop
  320.  
  321.     newline
  322. end if
  323.  
  324.     popa
  325.  
  326.     ; Scan options
  327.  
  328.     add     edx, 240        ; Point to first option
  329.  
  330. pr001:
  331.     ; Get option id
  332.     mov     al, [edx]
  333.     cmp     al, 0xff        ; End of options?
  334.     je      pr_exit
  335.  
  336.     cmp     al, 53          ; Msg type is a single byte option
  337.     jne     pr002
  338.  
  339.     mov     al, [edx+2]
  340.     mov     [dhcpMsgType], al
  341.     add     edx, 3
  342.     jmp     pr001           ; Get next option
  343.  
  344. pr002:
  345.     ; All other (accepted) options are 4 bytes in length
  346.     inc     edx
  347.     movzx   ecx, byte [edx]
  348.     inc     edx             ; point to data
  349.  
  350.     cmp     al, 54          ; server id
  351.     jne     pr0021
  352.     mov     eax, [edx]      ; All options are 4 bytes, so get it
  353.     mov     [dhcpServerIP], eax
  354.     jmp     pr003
  355.  
  356. pr0021:
  357.     cmp     al, 51          ; lease
  358.     jne     pr0022
  359.  
  360. if DEBUG = 1
  361.     pusha
  362.     dps  "DHCP: lease:  "
  363.  
  364.     cmp  dword[edx],-1
  365.     jne  no_lease_forever
  366.     dps  "forever"
  367.     jmp  lease_newline
  368.    no_lease_forever:
  369.     dpd  [edx]
  370.    lease_newline:
  371.     newline
  372.     popa
  373. end if
  374.  
  375.     jmp     pr003
  376.  
  377. pr0022:
  378.     cmp     al, 1           ; subnet mask
  379.     jne     pr0023
  380.  
  381.     pusha
  382.     mov     eax,52
  383.     mov     ebx,12
  384.     mov     ecx,[edx]
  385.     int     0x40
  386.  
  387.  
  388. if DEBUG = 1
  389.     dps  "DHCP: Subnet: "
  390.  
  391.     xor   esi,esi
  392.    .loop:
  393.  
  394.     pusha
  395.     movzx eax,byte[edx+esi]
  396.     call  debug_outdec
  397.     popa
  398.  
  399.     inc   esi
  400.     cmp   esi,4
  401.     jne   .loop
  402.  
  403.     newline
  404. end if
  405.  
  406.     popa
  407.  
  408.     jmp     pr003
  409.  
  410. pr0023:
  411.     cmp     al, 6           ; dns ip
  412.     jne     pr0024
  413.  
  414.     pusha
  415.  
  416.     mov     eax,52
  417.     mov     ebx,14
  418.     mov     ecx,[edx]
  419.     int     0x40
  420.  
  421.  
  422. if DEBUG = 1
  423.     dps  "DHCP: DNS IP: "
  424.  
  425.     xor   esi,esi
  426.    .loop:
  427.  
  428.     pusha
  429.     movzx eax,byte[edx+esi]
  430.     call  debug_outdec
  431.     popa
  432.  
  433.     inc   esi
  434.     cmp   esi,4
  435.     jne   .loop
  436.  
  437.     newline
  438. end if
  439.  
  440.     popa
  441.  
  442. pr0024:
  443.     cmp     al, 3           ; gateway ip
  444.     jne     pr003
  445.  
  446.     pusha
  447.  
  448.     mov     eax,52
  449.     mov     ebx,11
  450.     mov     ecx,[edx]
  451.     int     0x40
  452.  
  453.  
  454. if DEBUG = 1
  455.     dps  "DHCP: Gateway:"
  456.  
  457.     xor   esi,esi
  458.    .loop:
  459.  
  460.     pusha
  461.     movzx eax,byte[edx+esi]
  462.     call  debug_outdec
  463.     popa
  464.  
  465.     inc   esi
  466.     cmp   esi,4
  467.     jne   .loop
  468.  
  469.     newline
  470. end if
  471.  
  472.     popa
  473.  
  474. pr003:
  475.     add     edx, ecx
  476.     jmp     pr001
  477.  
  478. pr_exit:
  479.  
  480. if DEBUG = 1
  481.     dps  "DHCP: Done"
  482.     newline
  483. end if
  484.  
  485.     jmp close
  486.  
  487.  
  488. ; DATA AREA
  489.  
  490. IM_END:
  491.  
  492. dhcpMsgType:    db  0
  493. dhcpLease:      dd  0
  494. ;dhcpClientIP:   dd  0
  495. dhcpServerIP:   dd  0
  496.  
  497. dhcpMsgLen:     dd  0
  498. socketNum:      dd  0xFFFF
  499. dhcpMsg:        rb  512
  500.  
  501. I_END: