From: Gyoung-Yoon Noh Date: 2006-07-25T13:17:54+09:00 Subject: Re: bit-struct and constructing ARP messages. You can achieve the goal using Array#pack / String#unpack by hand. But there are already good libraries supporting C function calling and type conversion in Ruby: ruby-dl2[1], ruby-dlx[2]. [1]: http://rubyforge.org/cgi-bin/viewvc.cgi/ruby-dl2/doc/struct.txt?revision=1.2&root=ruby-dl2&view=markup [2]: http://ruby-dlx.rubyforge.org/ HTH, On 7/25/06, Kevin Waters wrote: > Hello all. > > I have been trying to write a ARP packet injector script for Ruby > and did quite a bit of research on how to construct ARP Reply datagrams > and what not, and now that I think I have an idea how to construct them > but also I'd like to transmit them to a host. > > Courtesy of bit-struct I am able to craft and fill in the headers of an > IPv4 datagram with ease, but transmitting this information is not so > easy. What I'd like to know is is there some specific syntax using > Socket#new for just transmitting packets not to any specific TCP port?, > this is a snippet from the script: > > ------------------------------------------------------------------------------ > class IP < BitStruct > unsigned :ip_v, 4, "Version" > unsigned :ip_hl, 4, "Header length" > unsigned :ip_tos, 8, "TOS" > unsigned :ip_len, 16, "Length" > unsigned :ip_id, 16, "ID" > unsigned :ip_off, 16, "Frag offset" > unsigned :ip_ttl, 8, "TTL" > unsigned :ip_p, 8, "Protocol" > unsigned :ip_sum, 16, "Checksum" > octets :ip_src, 32, "Source addr" > octets :ip_dst, 32, "Dest addr" > rest :body, "Body of message" > > note " rest is application defined message body" > > initial_value.ip_v = 4 > initial_value.ip_hl = 5 > end > > def mk_dgram(src_ip,dst_ip,src_h,dst_h) > arp_msg = ['1', '0x800', '6', '4', '2', src_h, src_ip, dst_h, > dst_ip] > > ip = IP.new > ip.ip_tos = 0 > ip.ip_len = 0 > ip.ip_id = 0 > ip.ip_off = 0 > ip.ip_ttl = 255 > ip.ip_p = 255 > ip.ip_sum = 0 > ip.ip_src = src_ip > ip.ip_dst = dst_ip > ip.body = arp_msg.to_s > ip.ip_len = ip.length > puts ip.inspect_detailed > > # TRANSMISSION CODE WOULD GO HERE > # ..... > end > ----------------------------------------------------------------------------- > > Now I'm stuck with transmitting this datagram, any idea how I would > implement this?. Also I'm just taking a guess there as how to craft an > ARP Message encapsulated in an IP datagram so if you know the correct > way of doing that too your feedback is much appreciated. > > I apologize in advance if this was not an appropriate place to post this > subject . > > > -- > Posted via http://www.ruby-forum.com/. > > -- http://nohmad.sub-port.net