From c8d9ddf8ff1eed265e710b21b8e07c69df2ac3a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Uysal?= Date: Mon, 8 Jul 2024 14:39:30 +0300 Subject: [PATCH] Ip packet differences in wireshark and pingo. Difference in datagram lengths. --- cmd/pingo/main.go | 37 +++++++++++------- icmp_capture.pcapng | Bin 2404 -> 0 bytes internal/ip/header.go | 14 +++---- .../{ => netcore}/checksum/chechsum_test.go | 24 ++++++++++++ internal/{ => netcore}/checksum/cheksum.go | 0 internal/netcore/packet.go | 25 ++++++++++++ 6 files changed, 76 insertions(+), 24 deletions(-) delete mode 100644 icmp_capture.pcapng rename internal/{ => netcore}/checksum/chechsum_test.go (60%) rename internal/{ => netcore}/checksum/cheksum.go (100%) create mode 100644 internal/netcore/packet.go diff --git a/cmd/pingo/main.go b/cmd/pingo/main.go index be50833..db1e307 100644 --- a/cmd/pingo/main.go +++ b/cmd/pingo/main.go @@ -1,32 +1,21 @@ package main import ( + "encoding/hex" "fmt" - "log" "syscall" "github.com/code-brew-lab/pingo/internal/ip" + "github.com/code-brew-lab/pingo/internal/netcore" ) func main() { - h, err := ip.NewHeaderBuilder().Build() - if err != nil { - log.Fatalln(err) - } - - req := h.Marshal() - - fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, syscall.IPPROTO_IP) + fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, syscall.IPPROTO_ICMP) if err != nil { fmt.Println(err) return } - syscall.Sendto(fd, req, 0, &syscall.SockaddrInet4{ - Port: 0, - Addr: [4]byte{127, 0, 0, 1}, - }) - for { buf := make([]byte, 1024) numRead, err := syscall.Read(fd, buf) @@ -34,7 +23,11 @@ func main() { fmt.Println(err) } - header, i, err := ip.ParseHeader(buf[:numRead]) + packet := netcore.NewPacket(buf[:numRead]) + + fmt.Printf("Raw Packet: %s\n", hex.EncodeToString(packet.Raw())) + + header, i, err := ip.ParseHeader(packet.Raw()) if err != nil { fmt.Println(err) continue @@ -43,3 +36,17 @@ func main() { fmt.Println(i) } } + +/* + Wireshark: + Packet_1 [RESP]: 45000054000000003801c12cd8ef2678c0a8016d0000f2c767470000668bcac80001899808090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 + + Packet_2 [RESP]: 45000054000000003801c12cd8ef2678c0a8016d0000dffa67470001668bcac900019c6308090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 +*/ + +/* + Pingo: + Packet_1 [RESP]: 45004000000000003801c12cd8ef2678c0a8016d0000f2c767470000668bcac80001899808090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 + + Packet_2 [RESP]: 45004000000000003801c12cd8ef2678c0a8016d0000dffa67470001668bcac900019c6308090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 +*/ diff --git a/icmp_capture.pcapng b/icmp_capture.pcapng deleted file mode 100644 index ef336c64ad9d9a391b2cf12c02c4056be07a8fc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2404 zcmcK6Ur19?7y$6^ZvL5@Zg*3&)aK1fXXc9Wc5&iKJ|yfdWtB>=s`n>tg!MSiXQCyu9uFK_flX7?(VtwoO^%Y`8en7 z>XVZ6rvadEW#IaB;6i0)62GD^9v=D46#@|@*g$gS|*p`63;_z(1dl2$BMzEgv4>4kQ z$)I;^r3)djIbZe^Sla7bIuT73SRAOK+kWOfMv7K66TKFppZN za(=|$QW;P9I5|i5F(=`=?5r_;Ca3c&bH;|DM9I-t_Nh3d56IC~GRN2|I~9DQ5%<)p*A5j;J_U!{ofoVUFdn?0C%va<0B*<9R;=3Y46pjTVdYyna1KPDUDY zx_8LVT63S|6fmd83LYir(O`*+b044ca_(o$$#^9@>nx|pxl+xXq1&)T$*J~iQgK$F zA*ZLAInOBhw0@Q+TgbUQ#GHJW@;tayc}vCVKTA$gggMSPvQw5kC^ z1s2+O_=h8wTCCIY$G%hJ>m^5QC1>DM&Tbv-y>40zP}dfJ1dJ)1Ev#nXeob0*t=I7+v@)qP56xxf59nOU=_aa=yWYeBBIffzQ`(H6k?0OTC zNPAxmb_Nf3zleN_1K{9)h#@EA`>z=O%tQ7?%EOrsmWTS&mvj~5BheNhb`%t2My+-9gL2X)02m$n=FRE$wS>V#UL$JoNcr& zQrj1#D(_p?tCWX<0ObJ>{6FRmG*5Azm!*ZhxXv%M(S2$M_s0`#{l#K0`o^F_PV>mA zR1Pv>Ww@njXE532C(#6^r%B Gg^Ztc@%@$n diff --git a/internal/ip/header.go b/internal/ip/header.go index c2c76d0..107ec4f 100644 --- a/internal/ip/header.go +++ b/internal/ip/header.go @@ -2,11 +2,10 @@ package ip import ( "encoding/binary" - "encoding/hex" "errors" "fmt" - "github.com/code-brew-lab/pingo/internal/checksum" + "github.com/code-brew-lab/pingo/internal/netcore/checksum" ) type ( @@ -46,8 +45,8 @@ func ParseHeader(h []byte) (*Header, int, error) { } headerLen := h[0] & 0x0F - fmt.Println(hex.EncodeToString(h[:headerLen*headerMultiplier])) - if !checksum.Verify(h[:headerLen*headerMultiplier]) { + totalLen := headerLen * headerMultiplier + if !checksum.Verify(h[:totalLen]) { return nil, 0, errors.New("ip.ParseHeader: Checksum verification failed") } @@ -70,9 +69,9 @@ func ParseHeader(h []byte) (*Header, int, error) { copy(dstIP, h[16:20]) var options []byte - if headerLen > 5 { + if totalLen > minHeaderLen { options = make([]byte, (headerLen-5)*headerMultiplier) - copy(options, h[20:headerLen*headerMultiplier]) + copy(options, h[minHeaderLen:totalLen]) } return &Header{ @@ -180,6 +179,3 @@ func (h *Header) Marshal() []byte { return buff } - -// Wireshark => Req: 45000054df2100004001da0ac0a8016dd8ef2678, Resp: 45000054000000003801c12cd8ef2678c0a8016d -// Pingo => 45004000000000003801c12cd8ef2678c0a8016d diff --git a/internal/checksum/chechsum_test.go b/internal/netcore/checksum/chechsum_test.go similarity index 60% rename from internal/checksum/chechsum_test.go rename to internal/netcore/checksum/chechsum_test.go index a842ee6..cbf9d2f 100644 --- a/internal/checksum/chechsum_test.go +++ b/internal/netcore/checksum/chechsum_test.go @@ -25,6 +25,14 @@ var ( input: []byte{0x45, 0x00, 0x00, 0x28, 0x04, 0x59, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0xc0, 0xa8, 0x01, 0x6d, 0x0d, 0x45, 0x44, 0x40}, expected: 25309, }, + { + input: []byte{0x45, 0x00, 0x05, 0x58, 0xe8, 0x82, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc0, 0xa8, 0x01, 0x6d, 0xc0, 0xa8, 0x01, 0x01}, + expected: 2404, + }, + { + input: []byte{0x45, 0x00, 0x00, 0x54, 0xca, 0xf3, 0x00, 0x00, 0x38, 0x01, 0x08, 0xab, 0x68, 0x10, 0x00, 0x00, 0xc0, 0xa8, 0x01, 0x6d}, + expected: 34021, + }, } verifyCases = []VerifyTestCase{ @@ -40,6 +48,22 @@ var ( input: []byte{0x45, 0x00, 0x05, 0x58, 0x4e, 0xa0, 0x00, 0x00, 0x40, 0x01, 0x43, 0x2a, 0xc0, 0xa8, 0x01, 0x6d, 0x11, 0xfd, 0x0f, 0xc9}, isValid: true, }, + { + input: []byte{0x45, 0x00, 0x05, 0x58, 0xe8, 0x82, 0x00, 0x00, 0x40, 0x01, 0x09, 0x64, 0xc0, 0xa8, 0x01, 0x6d, 0xc0, 0xa8, 0x01, 0x01}, + isValid: true, + }, + { + input: []byte{0x45, 0x00, 0x00, 0x54, 0xca, 0xf3, 0x00, 0x00, 0x38, 0x01, 0x08, 0xab, 0x68, 0x10, 0x84, 0xe5, 0xc0, 0xa8, 0x01, 0x6d}, + isValid: true, + }, + { + input: []byte{0x45, 0xdf, 0x05, 0x58, 0x4e, 0xa0, 0x00, 0x00, 0x40, 0x01, 0x43, 0x2a, 0xc0, 0xa8, 0x01, 0x6d, 0x11, 0xfd, 0x0f, 0xc9}, + isValid: false, + }, + { + input: []byte{0x45, 0x00, 0x00, 0x28, 0x04, 0x59, 0x00, 0x00, 0x40, 0x06, 0x60, 0xdd, 0xc0, 0xa8, 0x01, 0x6d, 0x0d, 0x45, 0x44, 0x40}, + isValid: false, + }, } ) diff --git a/internal/checksum/cheksum.go b/internal/netcore/checksum/cheksum.go similarity index 100% rename from internal/checksum/cheksum.go rename to internal/netcore/checksum/cheksum.go diff --git a/internal/netcore/packet.go b/internal/netcore/packet.go new file mode 100644 index 0000000..4ca48b8 --- /dev/null +++ b/internal/netcore/packet.go @@ -0,0 +1,25 @@ +package netcore + +import ( + "time" +) + +type Packet struct { + timestamp time.Time + raw []byte +} + +func NewPacket(raw []byte) *Packet { + return &Packet{ + timestamp: time.Now(), + raw: raw, + } +} + +func (p *Packet) Timestamp() time.Time { + return p.timestamp +} + +func (p *Packet) Raw() []byte { + return p.raw +}