背景
在Python中可用scapy构建网络协议栈中的各种包结构,并且其简洁的表达语法使得使用者大多数情况下不必关注细枝末节。
scapy包的主要便利在于:1.checksum自动计算 2.长度自动设置
在Java世界中,我还没有看到这样的工具包出现,因此我打算自己写一个。
主要功能
对于调试网络协议而言,方便的语法有助于快速深入协议内容。因此,我们选择groovy作为开发语言。
此外,为了将使用者的关注点从各种消息头部转移到消息本身,我们使用注解为类型添加额外的计算信息,然后在序列化和反序列化时这些域自动调整到合适的值。这些注解包括:
1.@Calculated(n): 指定该域的值为计算后面n个域的字节长度
2.@Length(n): 指定该域序列化时所占用的字节长度。默认情况下使用java的类型信息,如byte=1, short=2,int=4,long=8, 不支持浮点类型
3.@Timstamp(seconds, milliseconds): 指定一个域使用时间戳自动生成
4.@Randomized(lower,upper): 指定一个域使用随机数生成,可指定上下限
5.@Typed(method): 指定一个域的动态类型,所谓动态类型某个域的枚举类型决定另外一个域的实际类型;该注解指定一个 方法名用于返回实际类型
enum的序列化和反序列化
enum需要声明一个value域,当序列化时,此enum占用的空间就是value的空间;当反序列化时,为了保证enum的唯一性,需要从enum的值空间中根据value的相等性查出唯一的enum。
Links
该工具已经发布到github: https://github/xhd2015/net-protocol-tools
ANS1
参见包:com.fulton_shaw.net.ans1
HTTPS/TLS
参见包:com.fulton_shaw.net.tls_https
二进制数据操作
项 | 方法 | 注意事项 |
---|---|---|
数字->字节数组 | splitLittleEndian, splitBigEndian | Java的扩展是有符号数,因此操作字节时必须加上 &0xff |
字节数组->16进制表示的字符串 | getHexString | |
16进制表示的字符串 -> 字节数组 | parseHexString |