1. #!/usr/bin/env ruby
  2.  
  3. WANT = 0x44d4 # checksum you want
  4. IS = 0x50d4 # checksum it is
  5. # your IP header
  6. DATA = [0x4500, 0x0028, 0x1e4f, 0x4000, 0x7b06, 0x0, 0xXXXX, 0xXXXX, 0xXXXX, 0xXXXX]
  7.  
  8. ELEMENT = [
  9. 'version+ihl+tos',
  10. 'packet length',
  11. 'id',
  12. 'fragmentation info',
  13. 'ttl+protocol',
  14. 'checksum',
  15. 'saddr upper',
  16. 'saddr lower',
  17. 'daddr upper',
  18. 'daddr lower',
  19. ]
  20.  
  21. def csum data
  22. sum = data.inject(0){|r,m|r+m}
  23. sum1 = (sum & 0xffff0000) >> 16
  24. sum2 = (sum & 0xffff)
  25. sum = (sum1+sum2)^0xffff
  26. sum
  27. end
  28.  
  29. my_data = DATA.dup
  30. offset = nil
  31.  
  32. 65535.times do |x|
  33. my_data[0] = x
  34. result = csum(my_data)
  35. offset = IS-result if result==WANT
  36. if result==IS
  37. unless my_data[0] == DATA[0]
  38. warn 'packet incorrectly entered'
  39. exit 42
  40. end
  41. end
  42. end
  43.  
  44. 10.times do |element|
  45. next if element == 5 # checksum is 0
  46. puts '------ element: %d (%s) -------' % [element, ELEMENT[element]]
  47. x = DATA[element]
  48. puts 'we have %016b (%x)' % [x, x]
  49. puts 'we want %016b (%x)' % [x+offset, x+offset]
  50. end