Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to create an IP packet with variable byte order (binary data) in Python
    primarykey
    data
    text
    <p>I've been more than a day trying to solve this one. I need to create a IP Packet in Python, but the length of the fields are different. Every time I have a field bigger than 1 byte I need to change the byte order to big endian. So what I did was to pack each variable separately and save everything in a file. I'm saving in a file because I need to do the checksum after packing and then pack all over again with the checksum (If someone has a better idea is more than welcome).</p> <p>I'm having two problems: </p> <p>1) The packet that I generate is bigger than the original one from were I parsed the information (the IP packet I generate only change in one field that is the TTL, but it should remain the same size)</p> <p>2) When I parse my packet (stream of data in the file), some information has change (I didn't change it).</p> <p>This is the original packet information:</p> <pre><code>Ver: 4 HL: 12 TOS: 0 LEN: 50 ID= 456 OFF: 16384 TTL: 5 PROT: 6 CHSUM: 30512 SRC: 16885952 DST: 167880896 rem_head: ['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q'] data: ['A', 'A'] </code></pre> <p>This result is from parsing the packet. Then I verify the check sum and decrease the TTL by one and reassemble the packet like this:</p> <pre><code>pk_cksum=0x0000 arch= open('packet.out', 'w') arch.write( struct.pack('B',byte) ) arch.write( struct.pack('&gt;B', pk_tos) ) arch.write( struct.pack('&gt;H', pk_len) ) arch.write( struct.pack('&gt;H', pk_id) ) arch.write( struct.pack('&gt;H',pk_off) ) arch.write( struct.pack('B', pk_ttl) ) arch.write( struct.pack('B', pk_p) ) arch.write( struct.pack('&gt;H', pk_cksum) ) arch.write( struct.pack('&lt;I', pk_src) ) arch.write( struct.pack('&lt;I', pk_dst) ) if (pk_hl&gt;5): for i in range(len(pk_head)): arch.write(struct.pack('c', pk_head[i])[0]) if (pk_len&gt;(pk_hl*4)): for j in range(len(pk_data)): arch.write(struct.pack('c', pk_data[j])[0]) arch.close() </code></pre> <p>To verify if the packing was successful I use my same code to parse this last packet and then I get this information:</p> <pre><code>Ver: 4 HL: 12 TOS: 0 LEN: 50 ID= 456 OFF: 16384 TTL: 4 PROT: 6 CHSUM: 0 SRC: 16885952 DST: 218212544 1101 0000 0001 1010 1000 1100 0000 rem_head: ['\n', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q'] data: ['Q', 'A'] </code></pre> <p>As you see, the destination address changed and I have a '\n' in the head, but my original variable doesn't have And the data have a Q that not suppose to have.</p> <p>Can someone tell me what I'm doing wrong?</p> <p>Thanks</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload