8.md 9.0 KB
Newer Older
W
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
# Scapy 开发

> 译者:[飞龙](https://github.com/wizardforcel)

> 原文:[Scapy development](http://www.secdev.org/projects/scapy/doc/development.html)

> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)


## 项目组织

Scapy 开发使用 Mercurial 版本控制系统。 Scapy 的参考资料库位于 <http://hg.secdev.org/scapy/>

项目管理由 Trac 完成。 Trac 在 Scapy 的参考资料库中工作。 它提供了一个可以自由编辑的 Wiki(请贡献!),可以引用项目的 ticket,变更集,文件。 它还提供了一个 ticket 管理服务,用于避免遗忘补丁或错误。

Mercurial 的分布式工作方式使 Philippe 可提供两个仓库,任何人都可以提交:Scapy [社区仓库](http://hg.secdev.org/scapy-com)和 Scapy [Windows 端口仓库](http://hg.secdev.org/scapy-com)

## 如何贡献

+ 在 Scapy 中发现了一个错误?[添加 ticket](http://trac.secdev.org/scapy/newticket)
+ 改进此文档。
W
fix  
wizardforcel 已提交
22
+ 编写一个新的协议层,并在邮件列表上分享。或者在 bugtracker 上将其添加为改进。
W
wizardforcel 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
+ 贡献新的[回归测试](http://trac.secdev.org/scapy/wiki/RegressionTests)
+[封包样例](http://trac.secdev.org/scapy/wiki/PacketsSamples)页面上为新协议上传封包样例。

## 使用 UTScapy 测试

### 什么是 UTScapy?

UTScapy 是一个小型 Python 程序,它读取测试活动,使用 Scapy 运行活动,并生成一个指示测试状态的报告。报告可以是四种格式之一,即 text,ansi,HTML 或 LaTeX。

UTScapy 存在三个基本测试容器,单元测试,测试集和测试活动。单元测试是 Scapy 命令列表,由 Scapy 或 Scapy 的派生作品运行。在单元测试中最后一个命令的评估,将确定单个单元测试的最终结果。测试集是一组具有某种关联的单元测试。测试活动由一或多个测试集组成。测试集和单元测试可以被赋予关键字来形成逻辑分组。运行测试活动时,可以按关键字选择测试。这允许用户在期望的分组内运行测试。

对于每个单元测试,测试集和活动,测试的 CRC32 被计算并显​​示为该测试的签名。该测试签名足以确定实际测试按预期运行而没有修改。如果你遇到的一些恶意用户,试图修改或损坏文件,而不改变 CRC32,全局 SHA1 会在整个文件计算。

### 活动的语法

表 1 显示了 UTScapy 正在寻找的语法指标。 在定义测试的文本文件的每一行中,语法限定符必须是第一个字符。 由 UTScapy 解释的参数是遵循语法限定符的文本描述。 在没有前导语法限定符的情况下出现的行将被视为 Python 命令,前提是它们出现在单元测试的上下文中。 没有语法限定符,并出现在正确上下文之外的行将被 UTScapy 拒绝,并且将发出警告。


| 语法限定符 | 定义 |
| --- | --- |
| `%` | 提供测试活动的名称 |
| `+` | 声明新的测试集 |
| `=` | 声明新的单元测试 |
| `~` | 为当前单元测试声明关键字 |
| `*` | 表示需要在报告中包含的注释 |
| `#` | 测试用例的注解,会被解释器忽略 |

表 1 - UTScapy 语法限定符

在测试报告中的注释有一个上下文。 每个注释将与最后定义的测试容器相关联 - 这是单个单元测试,测试集或测试活动。 与特定容器相关联的多个注释将连接在一起,并将直接显示在测试容器声明后的报告中。 在声明测试活动之前,应该会显示测试文件的一般注释。 对于与测试活动相关联的注释,它们必须位于声明测试活动之后,但在任何测试集或单元测试之前出现。 测试集的注释应在集合的第一个单元测试的定义之前出现。

测试活动的通用格式如下表所示:

```
% Test Campaign Name
* Comment describing this campaign


+ Test Set 1
* comments for test set 1

= Unit Test 1
~ keywords
* Comments for unit test 1
# Python statements follow
a = 1
print a
a == 1
```

Python 语句由缺少定义的 UTScapy 语法限定符来标识。 Python 语句直接提供给 Python 解释器,就像在交互式 Scapy shell(交互)中操作一样。循环,迭代和条件是允许的,但必须以空行终止。测试集可以包括多个单元测试,并且可以为每个活动定义多个测试集。甚至可以在特定测试定义文件中包含多个测试活动。使用关键字可以测试整个活动的子集。例如,在测试活动的开发期间,用户可能希望使用关键词“debug”来标记正在开发的新测试。一旦测试成功运行出他们想要的结果,关键字“debug”可以被删除。也可以使用诸如“regression”或“limited”的关键词。

重要的是要注意,UTScapy 使用来自最后一个 Python 语句的真值作为测试是通过还是失败的指示符。最后一行可能出现多个逻辑测试。如果结果为 0 或`False`,则测试失败。否则,测试通过。如果需要,使用`assert()`语句可以强制中间值的求值。

UTScapy 的语法如表 3 所示 - UTScapy 命令行语法:

```
[root@localhost scapy]# ./UTscapy.py –h
Usage: UTscapy [-m module] [-f {text|ansi|HTML|LaTeX}] [-o output_file]
               [-t testfile] [-k keywords [-k ...]] [-K keywords [-K ...]]
               [-l] [-d|-D] [-F] [-q[q]]
-l              : generate local files
-F              : expand only failed tests
-d              : dump campaign
-D              : dump campaign and stop
-C              : don't calculate CRC and SHA
-q              : quiet mode
-qq             : [silent mode]
-n <testnum>    : only tests whose numbers are given (eg. 1,3-7,12)
-m <module>     : additional module to put in the namespace
-k <kw1>,<kw2>,...      : include only tests with one of those keywords (can be used many times)
-K <kw1>,<kw2>,...      : remove tests with one of those keywords (can be used many times)
```

表 3 - UTScapy 命令行语法

所有参数都是可选的。 没有相关联的参数值的参数可以串在一起(即`-lqF`)。 如果未指定测试文件,则测试定义来自`<STDIN>`。 类似地,如果没有指定输出文件,则它被定向到`<STDOUT>`。 默认输出格式为“ansi”。 表 4 列出了参数,相关联的参数值及其对 UTScapy 的含义。

| 参数 | 参数值 | 对 UTScapy 的含义 |
W
gitbook  
wizardforcel 已提交
102
| --- | --- | --- |
W
wizardforcel 已提交
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
| -t | `testfile` | 定义测试活动的测试文件(默认为`<STDIN>`) |
| -o | `output_file` | 测试活动结果的输出文件(默认为`<STDOUT>`) |
| -f | `test` | `ansi``HTML``LaTeX`,输出报告的格式(默认为`ansi`) |
| -l |   | 在本地生成报告的相关文件。对于 HTML,生成 JavaScript 和样式表 |
| -F |   | 默认情况下,失败的测试用例会在 HTML 输出中展开 |
| -d |   | 在执行活动之前打印测试活动的简短列表。 |
| -D |   | 打印测试活动的简短列表并停止。不执行测试活动。 |
| -C |   | 不要计算测试签名 |
| -q |   | 在测试执行时,不要在屏幕上显示测试流程 |
| -qq |   | 静默模式 |
| -n | `testnum` | 只执行由数字列出的这些测试。 测试编号可以使用`–d``–D`来获取。测试可以使用以逗号分隔的列表来列出,并且可以包含范围(例如 1, 3-7, 12)。 |
| -m | `module` | 在执行测试之前加载模块。 使用 Scapy 的派生作品来测试。 注意:要作为`__main__`执行的派生作品不会被 UTScapy 作为`__main__`调用。 |
| -k | `kw1, kw2, ...` | 只包含带有关键字`kw1`的测试,可以指定多个关键字。 |
| -K | `kw1, kw2, ...` | 排除带有关键字`kw1`的测试,可以指定多个关键字。 |

表 4 - UTScapy 参数

表 5 显示了具有多个测试集定义的简单测试活动。 此外,关键字指定了仅允许执行有限数量的测试用例。 注意在测试 3 和 5 中使用`assert()`语句来检查中间结果。 测试 2 和 5 为失败而设计。

```
% Example Test Campaign

# Comment describing this campaign
#
# To run this campaign, try:
#   ./UTscapy.py -t example_campaign.txt -f html -o example_campaign.html -F
#

* This comment is associated with the test campaign and will appear
* in the produced output.

+ Test Set 1

= Unit Test 1
~ test_set_1 simple
a = 1
print a

= Unit test 2
~ test_set_1 simple
* this test will fail
b = 2
a == b

= Unit test 3
~ test_set_1 harder
a = 1
b = 2
c = "hello"
assert (a != b)
c == "hello"

+ Test Set 2

= Unit Test 4
~ test_set_2 harder
b = 2
d = b
d is b

= Unit Test 5
~ test_set_2 harder hardest
a = 2
b = 3
d = 4
e = (a * b)**d
# The following statement evaluates to False but is not last; continue
e == 6
# assert evaluates to False; stop test and fail
assert (e == 7)
e == 1296

= Unit Test 6
~ test_set_2 hardest
print e
e == 1296
```

为了查看以 Scapy 为目标的示例,请访问 <http://www.secdev.org/projects/UTscapy>。将页面底部的示例复制粘贴到文件`demo_campaign.txt`,并对它运行 UTScapy:

```
./UTscapy.py -t demo_campaign.txt -f html -o demo_campaign.html –F -l
```

在文件`demo_campaign.html`中检测生成的结果。