第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 MacOSX 上使用 Go 1.5 創(chuàng)建 RAW 數(shù)據(jù)包

在 MacOSX 上使用 Go 1.5 創(chuàng)建 RAW 數(shù)據(jù)包

Go
慕工程0101907 2021-11-08 15:45:54
我正在嘗試為我正在使用的測(cè)試工具做一些基本的數(shù)據(jù)包制作,但我似乎無(wú)法讓數(shù)據(jù)包制作工作(我在 OSX 上使用 Go 1.5 并以 root 身份運(yùn)行。)我正在使用以下代碼(取自此處)嘗試創(chuàng)建 ICMP 數(shù)據(jù)包,但是當(dāng)我嘗試在 IP 標(biāo)頭中指定特定選項(xiàng)時(shí),它似乎不起作用。此外,當(dāng)我在wireshark中查看此數(shù)據(jù)包時(shí),它顯示為協(xié)議255(未知)。我讀過在 Linux 系統(tǒng)上你可以使用 AF_PACKET 但在 OSX 系統(tǒng)上你需要使用 BPF,但是我發(fā)現(xiàn)的示例代碼使用的是“syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, syscall.IPPROTO_RAW)”,我是不知道如何開始使用 BPF。我也看到有些人嘗試使用 gopacket 而不是 x/net/ipv4 包。package mainimport (    "golang.org/x/net/ipv4"    "net"    "syscall")func main() {    var err error    fd, _ := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, syscall.IPPROTO_RAW)    addr := syscall.SockaddrInet4{        Port: 0,        Addr: [4]byte{127, 0, 0, 1},    }    p := pkt()    _ = syscall.Sendto(fd, p, 0, &addr)}func pkt() []byte {    h := ipv4.Header{        Version:  4,        Len:      20,        TOS:      0,        TotalLen: 85, // I can not seem to change this        ID:       2,  // I can not seem to change this        TTL:      64, // I can not seem to change this        Protocol: 1,  // ICMP, This does not seem to work        Dst:      net.IPv4(127, 0, 0, 1),    }    icmp := []byte{        8, // type: echo request        0, // code: not used by echo request        0, // checksum (16 bit), we fill in below        0,        0, // identifier (16 bit). zero allowed.        0,        0, // sequence number (16 bit). zero allowed.        0,        0xC0, // Optional data. ping puts time packet sent here        0xDE,    }    cs := csum(icmp)    icmp[2] = byte(cs)    icmp[3] = byte(cs >> 8)    out, _ := h.Marshal()    return append(out, icmp...)}如果我在數(shù)據(jù)從 pkt() 返回后在 Main() 中打印出包含數(shù)據(jù)包數(shù)據(jù)的 p 變量,它看起來是正確的:DEBUG: (decimal) [69 0 60 0 0 0 0 0 64 1 0 0 0 0 0 0 127 0 0 1 8 0 55 33 0 0 0 0 192 222]DEBUG: (hex)      45 0 3c 0 0 0 0 0 40 1 0 0 0 0 0 0 7f 0 0 1 8 0 37 21 0 0 0 0 c0 de 您可以看到協(xié)議在第 10 個(gè)字節(jié)中設(shè)置為“1”。但是當(dāng)我們?cè)趙ireshark中查看這個(gè)數(shù)據(jù)包時(shí),它看起來像:
查看完整描述

2 回答

?
慕碼人2483693

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊

好的,我現(xiàn)在可以讓它在 OS X 上運(yùn)行了。您需要確保您正在設(shè)置IP_HDRINCL套接字選項(xiàng)syscall.SetsockoptInt(s, syscall.IPPROTO_IP, syscall.IP_HDRINCL, 1),然后您需要小心構(gòu)建數(shù)據(jù)包。吸引我很長(zhǎng)時(shí)間的一個(gè)技巧是,出于某種原因,Sendto OS X/BSD 想要主機(jī)字節(jié)順序中的 IP 長(zhǎng)度,在我的情況下是 LittleEndian,而不是 BigEndian,這是典型的網(wǎng)絡(luò)順序。如果您查看此代碼(我只是自己構(gòu)建了 IP 標(biāo)頭,您可以以另一種方式構(gòu)建它),它會(huì)按預(yù)期運(yùn)行。


package main


import (

    "encoding/binary"

    "fmt"

    "syscall"

)


func main() {

    s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, syscall.IPPROTO_RAW)

    if err != nil {

        panic(err)

    }


    err = syscall.SetsockoptInt(s, syscall.IPPROTO_IP, syscall.IP_HDRINCL, 1)

    if err != nil {

        panic(err)

    }

    addr := syscall.SockaddrInet4{Addr: [4]byte{127, 0, 0, 1}}


    data := makepacket()


    for _, v := range data {

        if v == 0 {

            fmt.Printf("00 ")

            continue

        } else if v < 0xf {

            fmt.Printf("0%x ", v)

            continue

        }

        fmt.Printf("%x ", v)

    }

    fmt.Printf("\n")

    err = syscall.Sendto(s, data, 0, &addr)

    if err != nil {

        panic(err)

    }   

}       


func makepacket() []byte {

    icmp := []byte{

        8, // type: echo request

        0, // code: not used by echo request

        0, // checksum (16 bit), we fill in below

        0,

        0, // identifier (16 bit). zero allowed.

        0,

        0, // sequence number (16 bit). zero allowed.

        0,

        0xC0, // Optional data. ping puts time packet sent here

        0xDE, 

    }

    cs := csum(icmp)

    icmp[2] = byte(cs)

    icmp[3] = byte(cs >> 8)


    buf := []byte{0x45, 0x00, 0x00, 0x00, 0x95, 0x13, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x7f, 0x00, 0x0

0, 0x01, 0x7f, 0x00, 0x00, 0x01}

    binary.LittleEndian.PutUint16(buf[2:4], uint16(len(icmp) + len(buf)))

    return append(buf, icmp...)

}


func csum(b []byte) uint16 {

    var s uint32

    for i := 0; i < len(b); i += 2 {

        s += uint32(b[i+1])<<8 | uint32(b[i])

這段代碼給了我這個(gè)輸出 # tcpdump -X -i lo0


20:05:24.016465 IP localhost > localhost: ICMP echo request, id 0, seq 0, length 10

    0x0000:  4500 001e 9513 0000 4001 0000 7f00 0001  E.......@.......

    0x0010:  7f00 0001 0800 3721 0000 0000 c0de       ......7!......

20:05:24.016495 IP localhost > localhost: ICMP echo reply, id 0, seq 0, length 10

    0x0000:  4500 001e 3e4f 0000 4001 0000 7f00 0001  E...>O..@.......

    0x0010:  7f00 0001 0000 3f21 0000 0000 c0de       ......?!......


查看完整回答
反對(duì) 回復(fù) 2021-11-08
?
一只甜甜圈

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊

這是我從 Mikio 那里得到的關(guān)于 Go 項(xiàng)目的答案。我在這里為可能正在尋找此問題解決方案的其他人添加它。


package main


import (

    "fmt"

    "golang.org/x/net/ipv4"

    "log"

    "net"

)


func main() {

    ip := net.ParseIP("127.0.0.1")

    proto := 1


    c, err := net.ListenPacket(fmt.Sprintf("ip4:%d", proto), "0.0.0.0")

    if err != nil {

        log.Fatal(err)

    }

    defer c.Close()


    p, err := ipv4.NewRawConn(c)

    if err != nil {

        log.Fatal(err)

    }


    b := []byte("HELLO-R-U-THERE")

    h := &ipv4.Header{

        Version:  ipv4.Version,

        Len:      ipv4.HeaderLen,

        TotalLen: ipv4.HeaderLen + len(b),

        ID:       12345,

        Protocol: proto,

        Dst:      ip.To4(),

    }

    if err := p.WriteTo(h, b, nil); err != nil {

        log.Println(err)

    }

}


查看完整回答
反對(duì) 回復(fù) 2021-11-08
  • 2 回答
  • 0 關(guān)注
  • 289 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)