Bittwiste的官方开源地址:bittwist.sourceforge.net。软件提供了三个版本,分别针对FreeBSD、Linux、Windows系统。需要在什么平台编译,下载相关的源码包即可.

示例:

将目的ip从192.168.1.3修改为10.10.10.10

# bittwiste -I in.pcap -O out.pcap -T ip -d 192.168.1.3,10.10.10.10


网络时间协议(英语:Network Time Protocol,NTP)是以数据包交换把两台电脑的时钟同步化的网络传输协议。NTP使用UDP端口123作为传输层。它是用作抵销可变延迟的影响。

放大反射 Dos 攻击由 CVE-2013-5211 所致。且这漏洞是与 molist 功能有关。ntpd 4.2.7p26 之前的版本都会去响应 NTP 中的 mode7 monlist 请求。ntpd-4.2.7p26 版本后, monlist 特性已经被禁止,取而代之的是 mrulist 特性,使用 mode6 控制报文,并且实现了握手过程来阻止对第三方主机的放大攻击。

因为 Ubuntu 14.04 默认的 ntpd 版本是 4.2.6p5 ,所以我们可以用禁止 monitor 的方法,直接修改 /etc/ntp.conf 即可

echo "disable monitor" >> /etc/ntp.conf

然后重启 ntp 服务

service ntp restart

验证下是否生效:

root@example:~# ntpdc

ntpdc> monlist

***Server reports data not found


map映射到结构体,这里只支持简单的数据类型,复杂的需要在拓展

package main
import (
    "errors"
    "fmt"
    "reflect"
    "strconv"
    "time"
)
type User struct {
    Name string
    Age  int8
    Date time.Time
}
func main() {
    data := make(map[string]interface{})
    data["Name"] = "张三"
    data["Age"] = 26
    data["Date"] = "2015-09-29 00:00:00"
    result := &User{}
    err := FillStruct(data, result)
    fmt.Println(err, fmt.Sprintf("%+v", *result))
}
//用map填充结构
func FillStruct(data map[string]interface{}, obj interface{}) error {
    for k, v := range data {
        err := SetField(obj, k, v)
        if err != nil {
            return err
        }
    }
    return nil
}
//用map的值替换结构的值
func SetField(obj interface{}, name string, value interface{}) error {
    structValue := reflect.ValueOf(obj).Elem()        //结构体属性值
    structFieldValue := structValue.FieldByName(name) //结构体单个属性值
    if !structFieldValue.IsValid() {
        return fmt.Errorf("No such field: %s in obj", name)
    }
    if !structFieldValue.CanSet() {
        return fmt.Errorf("Cannot set %s field value", name)
    }
    structFieldType := structFieldValue.Type() //结构体的类型
    val := reflect.ValueOf(value)              //map值的反射值
    var err error
    if structFieldType != val.Type() {
        val, err = TypeConversion(fmt.Sprintf("%v", value), structFieldValue.Type().Name()) //类型转换
        if err != nil {
            return err
        }
    }
    structFieldValue.Set(val)
    return nil
}
//类型转换
func TypeConversion(value string, ntype string) (reflect.Value, error) {
    if ntype == "string" {
        return reflect.ValueOf(value), nil
    } else if ntype == "time.Time" {
        t, err := time.ParseInLocation("2006-01-02 15:04:05", value, time.Local)
        return reflect.ValueOf(t), err
    } else if ntype == "Time" {
        t, err := time.ParseInLocation("2006-01-02 15:04:05", value, time.Local)
        return reflect.ValueOf(t), err
    } else if ntype == "int" {
        i, err := strconv.Atoi(value)
        return reflect.ValueOf(i), err
    } else if ntype == "int8" {
        i, err := strconv.ParseInt(value, 10, 64)
        return reflect.ValueOf(int8(i)), err
    } else if ntype == "int32" {
        i, err := strconv.ParseInt(value, 10, 64)
        return reflect.ValueOf(int64(i)), err
    } else if ntype == "int64" {
        i, err := strconv.ParseInt(value, 10, 64)
        return reflect.ValueOf(i), err
    } else if ntype == "float32" {
        i, err := strconv.ParseFloat(value, 64)
        return reflect.ValueOf(float32(i)), err
    } else if ntype == "float64" {
        i, err := strconv.ParseFloat(value, 64)
        return reflect.ValueOf(i), err
    }
    //else if .......增加其他一些类型的转换
    return reflect.ValueOf(value), errors.New("未知的类型:" + ntype)
}

习惯了php中的seek和tell,转到golang时突然发现只有Seek发现,tell方法不见了。google了一下,发现了tell的实现方法:

File.Seek(0, os.SEEK_CUR) 或者File.Seek(0,1) 参考

解释:

先来看下Seek方法

func (f *File) Seek(offset int64, whence int) (ret int64, err error)

跳转到文本中的某处,并返回此处的偏移量

File.Seek(0, os.SEEK_CUR) #跳转到当前位置(位置不变)

这样就很好理解了。

f,_:=os.Open("a.txt")
//从头开始,文件指针偏移100
f.Seek(100,0) 
buffer:=make([]byte,1024)
// Read 后文件指针也会偏移
_,err:=f.Read(buffer)
if err!=nil{
    fmt.Println(nil)
    return
}
// 获取文件指针当前位置
cur_offset,_:=f.Seek(0,os.SEEK_CUR)
fmt.Printf('current offset is %d\n', cur_offset)

虽然方便,但是使用+=操作符并不是在一个循环中往字符串末尾追加字符串最有效的方式。

一个有效的方式是准备好一个字符串切片([]string),然后使用strings.Join()函数一次性将所有字符串串联起来。

但是在go中还有一个更好的方法,其原理类似于java中的stringBuilder

package main
import (
    "bytes"
    "fmt"
)
func main() {
    var buffer bytes.Buffer //Buffer是一个实现了读写方法的可变大小的字节缓冲
    for {
        if piece, ok := getNextString(); ok {
          // Write将s的内容写入缓冲中,如必要会增加缓冲容量。返回值n为len(p),err总是nil。
          // 如果缓冲变得太大,Write会采用错误值ErrTooLarge引发panic。
            buffer.WriteString(piece)
        } else {
            break
        }
    }
    fmt.Println("拼接后的结果为-->", buffer.String())
}

转自:http://studygolang.com/articles/3427