bittwiste -- pcap capture file editor
bittwiste [ -I input ] [ -O
output ] [ -L layer ] [ -X payload ] [
-C ] [ -M linktype ] [ -D offset ] [
-R range ] [ -S timeframe ] [ -N
repeat ] [ -G gaprange ] [ -P seed ] [
-T header ] [ header-specific-options ] [ -h
]
This document describes the bittwiste program, the
pcap(3) capture file editor. Bittwiste is designed to work
only with Ethernet frame, e.g. link type DLT_EN10MB in pcap(3), with
a maximum frame size of 1514 bytes which is equivalent to an MTU of 1500
bytes, 14 bytes for Ethernet header.
Bittwiste can currently edit Ethernet, ARP, IPv4, IPv6,
ICMPv4, ICMPv6, TCP, and UDP headers. IPv6 packets with extension headers or
next header field not matching ICMPv6, TCP, or UDP are not supported;
bittwiste will simply write such packets as is to output trace file
as it encounters them in the input trace file.
If run with the -X flag, you can append your own payload
after any of the supported headers; specified using the -L and
-T flag. Bittwiste will, if not run with the -C flag,
recalculate the checksums for IPv4, ICMPv4, ICMPv6, TCP, and UDP headers,
except for the last fragment of a fragmented IPv4 datagram; bittwiste
does not currently support checksum correction for the last fragment of a
fragmented IPv4 datagram.
While parsing the packets in an input trace file, bittwiste
will skip, i.e. write to output trace file as is, any truncated packet, for
example, an ICMPv4 packet with a captured length of 25 bytes (we need at
least 28 bytes; 14 bytes for Ethernet header, minimum 20 bytes for IP
header, and 4 bytes for ICMPv4 header) does not give enough information on
its ICMPv4 header for bittwiste to read and modify it. In this case,
you can utilize the -L and -T flag to copy the original packet
up to its IP header and append your customized ICMPv4 header and data to the
packet using the -X flag. When specifying payload that covers the
ICMPv4, ICMPv6, TCP, or UDP header and its data, you can use zeros, e.g.
0000 for 2 bytes of zeros, for the header checksum which is then corrected
automatically by bittwiste.
In order to simplify the way options are specified, you can only
edit packets of a specific type supplied to the -T flag per execution
of bittwiste on an input trace file. In addition, the -T flag
must appear last among the general options which are the -I,
-O, -L, -X, -C, -M, -D, -R,
-S, -N, -G, and -P flag.
- -I input
- Input pcap based trace file. Typically, input should be a file path
to a pcap based trace file. However, for convenience, the following
template names are also accepted to load trace file from one of the
built-in templates:
- eth : Ethernet header
arp : ARP header
ip : IPv4 header
ip6 : IPv6 header
icmp : ICMPv4 header
icmp6 : ICMPv6 header
tcp : IPv4 TCP header
ip6tcp : IPv6 TCP header
udp : IPv4 UDP header
ip6udp : IPv6 UDP header
- Example: -I icmp
- -O output
- Output trace file.
- -L layer
- Copy up to the specified layer and discard the remaining data.
Value for layer must be either 2, 3, or 4 where 2 for Ethernet, 3
for ARP, IPv4, or IPv6, and 4 for ICMPv4, ICMPv6, TCP, or UDP.
- -X payload
- Append payload in hex digits to the end of each packet.
Example: -X 0302aad1
-X flag is ignored if -L and -T flag are not
specified.
- -C
- Specify this flag to disable checksum correction. Checksum correction is
applicable for non-fragmented supported packets only.
- -M linktype
- Replace the linktype stored in the pcap file header. Typically,
value for linktype is 1 for Ethernet.
Example: -M 12 (for raw IP), -M 51 (for PPPoE)
- For the complete list, see:
https://www.tcpdump.org/linktypes.html
- -D offset
- Delete the specified byte offset from each packet.
First byte (starting from link layer header) starts from 1.
-L, -X, -C and -T flag are ignored if -D
flag is specified.
Example: -D 15-40, -D 10, or -D 18-9999
- -R range
- Save only the specified range of packets.
Example: -R 5-21 or -R 9
- -S timeframe
- Save only the packets within the specified timeframe with up to
one-second resolution using DD/MM/YYYY,HH:MM:SS as the format for start
and end time in timeframe.
Example: -S 22/10/2006,21:47:35-24/10/2006,13:16:05
-S flag is evaluated after -R flag.
- -N repeat
- Duplicate packets from the input trace file repeat times.
Use this flag to create a stream of packets, each with, for example, a
random tcp sequence number, from a 1-packet trace file.
Example: -N 100000
-N flag is evaluated after -R and -S flag.
- -G gaprange
- Apply inter-packet gap between packets in microseconds from 1 to (2^31 -
1). Values in gaprange are inclusive and selected randomly. A
single value implies a fixed gap.
Example: -G 1000-10000 or -G 1000
-G flag is evaluated after -R, -S, and -N
flag.
- -P seed
- Positive integer to seed the random number generator (RNG) used, for
example, to generate random port number. If unset, current timestamp will
be used as the RNG seed.
- bittwiste uses Mersenne Twister for high-speed uniformly distributed
random number generation.
- -T header
- Edit only the specified header. Possible keywords for header
are, eth, arp, ip, ip6, icmp,
icmp6, tcp, or udp. -T flag must appear last
among the general options.
- -h
- Print version information and usage.
- Each packet that matches the type supplied to the -T flag is
modified based on the options described below:
- Options for eth (RFC 894):
- -d dmac or
omac,nmac
-
Destination MAC address. If omac and nmac are specified, any
instances of omac in the destination MAC address field will be
replaced with nmac. You can also use the string 'rand' for a random
MAC address.
- Examples:
-d 00:08:55:64:65:6a
-d rand
-d 00:08:55:64:65:6a,rand
- -s smac or
omac,nmac
-
Source MAC address. If omac and nmac are specified, any
instances of omac in the source MAC address field will be replaced
with nmac. You can also use the string 'rand' for a random MAC
address.
- Examples:
-s 00:13:20:3e:ab:cf
-s rand
-s 00:13:20:3e:ab:cf,rand
- -t type
- EtherType. Possible keywords for type are, ip, ip6, and
arp only.
- Options for arp
(RFC 826):
- -o opcode
- Operation code in integer value between 0 to 65535. For example, you can
set opcode to 1 for ARP request, 2 for ARP reply.
- -s smac or
omac,nmac
-
Sender MAC address. If omac and nmac are specified, any
instances of omac in the sender MAC address field will be replaced
with nmac. You can also use the string 'rand' for a random MAC
address.
- Examples:
-s 00:13:20:3e:ab:cf
-s rand
-s 00:13:20:3e:ab:cf,rand
- -p sip or
oip,nip
-
Sender IP address. Example: -p 192.168.0.1
If oip and nip are specified, any instances of oip in
the sender IP address field will be replaced with nip.
- -t tmac or
omac,nmac
-
Target MAC address. If omac and nmac are specified, any
instances of omac in the target MAC address field will be replaced
with nmac. You can also use the string 'rand' for a random MAC
address.
- Examples:
-t 00:08:55:64:65:6a
-t rand
-t 00:08:55:64:65:6a,rand
- -q tip or
oip,nip
-
Target IP address. Example: -q 192.168.0.2
If oip and nip are specified, any instances of oip in
the target IP address field will be replaced with nip.
- Options for
ip (RFC 791):
- -c ds_field
-
6-bit DS field (first 6-bit of 8-bit type of service field).
- Some of the service class name mapping to ds_field value from RFC
4594:
- 0 : Standard (CS0)
8 : Low-priority data (CS1)
16 : OAM (CS2)
24 : Broadcast video (CS3)
32 : Real-time interactive (CS4)
- Example: -c 16 or -c 0x10 (to classify packet for operation
and management of the network)
- For more information on DS field, see RFC 2474 and RFC 4594.
- -e ecn_field
-
2-bit ECN field (last 2-bit of 8-bit type of service field).
- ecn_field can be set to one of the 4 values below:
- 0 : Not-ECT
1 : ECT(1)
2 : ECT(0)
3 : CE
- Example: -e 3 or -e 0x03 (to indicate congestion to the end
hosts)
- For more information on ECN field, see RFC 3168.
- -i id or
oi,ni
- Identification in integer value between 0 to 65535. If oi and
ni are specified, any instances of oi in the identification
field will be replaced with ni. You can also use the string 'rand'
for a random identification.
- Example: -i 2000, -i rand, or -i 1000,rand
- -f flags
- Control flags. Possible characters for flags are:
- - : remove all flags
r : set the reserved flag
d : set the don't fragment flag
m : set the more fragment flag
- Example: -f d
If any of the flags is specified, all original flags are removed
automatically.
- -o offset
- Fragment offset in integer value between 0 to 7770. Value for
offset represents the number of 64-bit segments contained in
earlier fragments which must not exceed 7770 (62160 bytes).
- -t ttl or
ot,nt
- Time to live in integer value between 0 to 255 (milliseconds). If
ot and nt are specified, any instances of ot in the
time to live field will be replaced with nt. You can also use the
string 'rand' for a random time to live.
- Example: -t 64, -i rand, or -i 64,rand
- -p proto or
op,np
- Protocol number in integer value between 0 to 255. If op and
np are specified, any instances of op in the protocol number
field will be replaced with np. You can also use the string 'rand'
for a random protocol number. Some common protocol numbers are:
- 1 : Internet Control Message (ICMP)
6 : Transmission Control (TCP)
17 : User Datagram (UDP)
- For the complete list, see:
https://www.iana.org/assignments/protocol-numbers
- -s sip or
oip,nip
-
Source IP address. If oip and nip are specified, any instances
of oip in the source IP address field will be replaced with
nip. If CIDR notation (RFC 4632) is specified, e.g. 192.168.0.0/16,
an IP address will be selected at random from the range.
- Examples:
-s 192.168.0.1
-s 127.0.0.1,192.168.0.0/16
-s 0.0.0.0/0 (random IPv4 throughout the entire range)
- -d dip or
oip,nip
-
Destination IP address. If oip and nip are specified, any
instances of oip in the destination IP address field will be
replaced with nip. If CIDR notation (RFC 4632) is specified, e.g.
192.168.0.0/16, an IP address will be selected at random from the
range.
- Examples:
-d 192.168.0.2
-d 127.0.0.2,192.168.0.0/16
-d 0.0.0.0/0 (random IPv4 throughout the entire range)
- Options for
ip6 (RFC 8200):
- -c
ds_field
-
6-bit DS field (first 6-bit of 8-bit traffic class field).
- Some of the service class name mapping to ds_field value from RFC
4594:
- 0 : Standard (CS0)
8 : Low-priority data (CS1)
16 : OAM (CS2)
24 : Broadcast video (CS3)
32 : Real-time interactive (CS4)
- Example: -c 16 or -c 0x10 (to classify packet for operation
and management of the network)
- For more information on DS field, see RFC 2474 and RFC 4594.
- -e
ecn_field
-
2-bit ECN field (last 2-bit of 8-bit traffic class field).
- ecn_field can be set to one of the 4 values below:
- 0 : Not-ECT
1 : ECT(1)
2 : ECT(0)
3 : CE
- Example: -e 3 or -e 0x03 (to indicate congestion to the end
hosts)
- For more information on ECN field, see RFC 3168.
- -f
flow_label
-
Flow label in integer value between 0 to 1048575 or hexadecimal value
between 0x00000 to 0xfffff (20-bit).
Example: -f 0
- Value of 0 is to indicate that the packet does not belong to any flow. For
more information, see RFC 6437.
- -n next_header or
on,nn
-
Next header number in integer value between 0 to 255. If on and
nn are specified, any instances of on in the next header
field will be replaced with nn. You can also use the string 'rand'
for a random next header number. Example of next header numbers:
- 0 : IPv6 Hop-by-Hop Option (HOPOPT)
6 : Transmission Control (TCP)
17 : User Datagram (UDP)
50 : Encap Security Payload (ESP)
51 : Authentication Header (AH)
58 : ICMP for IPv6 (IPv6-ICMP)
- For the complete list, see:
https://www.iana.org/assignments/protocol-numbers
- -h hop_limit or oh,nh
-
Hop limit in integer value between 0 to 255. If oh and nh are
specified, any instances of oh in the hop limit field will be
replaced with nh. You can also use the string 'rand' for a random
hop limit. Destination host should not discard a packet with hop limit
equal to 0.
- -s sip or
oip,nip
-
Source IP address. If oip and nip are specified, any instances
of oip in the source IP address field will be replaced with
nip. If CIDR notation (RFC 4291) is specified, e.g. 2001:db8::/64,
an IP address will be selected at random from the range.
- Examples:
-s fd00::1
-s ::1,2001:db8::/64
-s ::/0 (random IPv6 throughout the entire range)
- -d dip or
oip,nip
-
Destination IP address. If oip and nip are specified, any
instances of oip in the destination IP address field will be
replaced with nip. If CIDR notation (RFC 4291) is specified, e.g.
2001:db8::/64, an IP address will be selected at random from the
range.
- Examples:
-d fd00::2
-d ::2,2001:db8::/64
-d ::/0 (random IPv6 throughout the entire range)
- Options for
icmp (RFC 792):
- -t type
- Type of message in integer value between 0 to 255. Some common messages
are:
- 0 : Echo reply
3 : Destination unreachable
8 : Echo
11 : Time exceeded
- For the complete list, see:
https://www.iana.org/assignments/icmp-parameters
- -c code
- Error code for this ICMPv4 message in integer value between 0 to 255. For
example, code for time exceeded message may have one of the
following values:
- 0 : transit TTL exceeded
1 : reassembly TTL exceeded
- For the complete list, see:
https://www.iana.org/assignments/icmp-parameters
- Options for
icmp6 (RFC 4443):
- -t type
- Type of message in integer value between 0 to 255. Some common messages
are:
- 3 : Time Exceeded
128 : Echo Request
129 : Echo Reply
- For the complete list, see:
https://www.iana.org/assignments/icmpv6-parameters
- -c code
- Code for this ICMPv6 message in integer value between 0 to 255. For
example, code for Time Exceeded message may have one of the
following values:
- 0 : hop limit exceeded in transit
1 : fragment reassembly time exceeded
- For the complete list, see:
https://www.iana.org/assignments/icmpv6-parameters
- Options for
tcp (RFC 9293):
- -s sport or
op,np
- Source port number in integer value between 0 to 65535. If op and
np are specified, any instances of op in the source port
field will be replaced with np. You can also use the string 'rand'
for a random port number.
- Example: -s 2000, -s rand, or -s 1000,rand
- -d dport or
op,np
- Destination port number in integer value between 0 to 65535. If op
and np are specified, any instances of op in the destination
port field will be replaced with np. You can also use the string
'rand' for a random port number.
- Example: -d 2000, -d rand, or -d 1000,rand
- -q seq or
os,ns
-
Sequence number in integer value between 0 to 4294967295. If SYN control bit
is set, e.g. character s is supplied to the -f flag,
seq represents the initial sequence number (ISN) and the first data
byte is ISN + 1. If os and ns are specified, any instances
of os in the sequence number field will be replaced with ns.
You can also use the string 'rand' for a random sequence number.
- Example: -q 100000, -q rand, or -q 100000,rand
- -a ack or
oa,na
-
Acknowledgment number in integer value between 0 to 4294967295. If ACK
control bit is set, e.g. character a is supplied to the -f
flag, ack represents the value of the next sequence number that the
receiver is expecting to receive. If oa and na are
specified, any instances of oa in the acknowledgment number field
will be replaced with na. You can also use the string 'rand' for a
random acknowledgment number.
- Example: -a 100000, -a rand, or -a 100000,rand
- -f flags
- Control flags. Possible characters for flags are:
- - : remove all flags
c : congestion window reduced
e : explicit congestion notification echo
u : urgent pointer field is significant
a : acknowledgment field is significant
p : push function
r : resets the connection
s : synchronizes the sequence numbers
f : no more data from sender
- Example: -f s
If any of the flags is specified, all original flags are removed
automatically.
- -w win
-
Window size in integer value between 0 to 65535. If ACK control bit is set,
e.g. character a is supplied to the -f flag, win
represents the number of data bytes, beginning with the one indicated in
the acknowledgment number field that the receiver is willing to
accept.
- -u urg
-
Urgent pointer in integer value between 0 to 65535. If URG control bit is
set, e.g. character u is supplied to the -f flag, urg
represents a pointer that points to the first data byte following the
urgent data.
- Options for
udp (RFC 768):
- -s sport or
op,np
- Source port number in integer value between 0 to 65535. If op and
np are specified, any instances of op in the source port
field will be replaced with np. You can also use the string 'rand'
for a random port number.
- Example: -s 2000, -s rand, or -s 1000,rand
- -d dport or
op,np
- Destination port number in integer value between 0 to 65535. If op
and np are specified, any instances of op in the destination
port field will be replaced with np. You can also use the string
'rand' for a random port number.
- Example: -d 2000, -d rand, or -d 1000,rand
bittwist(1), pcap(3), tcpdump(1)
File your bug report and send to:
- Addy Yeow <ayeowch@gmail.com>
Make sure you are using the latest stable version before
submitting your bug report.
When running bittwiste with both the -N and
-G flags, large inter-packet gap may result in the packet timestamp
beyond Unix epoch 2147483647 (2038-01-19 03:14:07 UTC) to overflow. This is
due to the use of signed 32-bit integer to store timestamp in pcap(3)
header. Simply changing the data type, e.g. using unsigned 64-bit integer,
would break the compatibility of the output trace file with existing
systems.
The workaround built into bittwiste is to use Unix epoch
946684800 (2020-01-01 00:00:00 UTC) as the starting reference timestamp when
-G flag is specified. This translates to a maximum timespan of 38
years or 559165 packets in the output trace file when using the maximum
inter-packet gap, i.e. -G 2147483647.
Copyright (C) 2006 - 2023 Addy Yeow <ayeowch@gmail.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original author and current maintainer:
- Addy Yeow
The current version is available from
https://bittwist.sourceforge.io