OpENer 是一个用于 I/O 适配器设备的 EtherNet/IP™ 堆栈;支持多个I/O和显式连接;包括使产品符合 ETHERNET/IP 规范中定义并由 ODVA (http://www.odva.org) 发布的 EtherNet/IP™ 兼容产品的对象和服务。
OpENer 的用户和开发人员可以加入各自的 Google 群组,以便交流经验、讨论 OpENer 的使用并提出对社区有用的新功能和 CIP 对象。
开发者邮件列表:https://groups.google.com/forum/#!forum/eip-stack-group-opener-developers
用户邮件列表:https://groups.google.com/forum/#!forum/eip-stack-group-opener-users
OpENer 被开发为高度便携的。默认版本针对具有 POSIX 操作系统和 BSD 套接字网络接口的 PC。要测试此版本,我们建议使用安装了 Cygwin (http://www.cygwin.com) 的 Linux PC 或 Windows。您需要安装以下内容:
对于普通建筑。这些应该安装在大多数 Linux 安装上,并且是 Cygwin 开发包的一部分。
如果您想运行单元测试,您还必须通过 https://github.com/cpputest/cpputest 下载 CppUTest
为了配置项目,我们建议使用 CMake GUI(例如,Linux 上的 cmake-gui 包,或 CMake 上提供的 Windows 安装程序)
setup_posix.sh
调用make
命令
调用OPENer:
./src/ports/POSIX/OpENer
例如./src/ports/POSIX/OpENer eth1
OpENer 现在还可以通过 OpENer_RT 选项实现实时 POSIX 启动,这要求所使用的内核应用并激活了完整的抢占式 RT 补丁。如果要使用 OpENer_RT,请在步骤 2 之前执行sudo setcap cap_ipc_lock,cap_sys_nice+ep ./src/ports/POSIX/OpENer
以授予 OpENEr CAP_SYS_NICE
和CAP_IPC_LOCK
功能,这是 RT 模式所需的
OpENer 还可以通过设置 CMake 标志-DOPENER_INSTALL_AS_LIB
来构建和安装为库。要构建共享库,还应设置全局选项-DBUILD_SHARED_LIBS=ON
。仅在Linux/POSIX平台下进行了测试。
Build All
来编译 OpENer更改为binwin32srcportsWIN32
根据您在 Visual Studio 中选择Debug
还是Release
配置,您的可执行文件将显示在“调试”或“发布”子文件夹中
通过调用 OpENer
OpENer
例如OpENer 3
为了获得正确的接口索引,请在命令提示符中输入命令route print
,并在输出的开头搜索所选网络接口的MAC地址。最左边的数字是对应的接口索引。
POSIX 安装文件可重复用于 Cygwin。请注意,您无法使用 RT 模式,并且必须删除负责检查和获取所需功能的代码,因为 libcap 在 Cygwin 中不可用。为 Windows 构建 OpENer 的更简单且更受支持的方法是使用 MinGW 或 Visual Studio。
setup_mingw.bat
。 (不是 bash shell)。如果需要跟踪,请使用以下命令(其中 cmake 参数必须用引号引起来)或更改 ./source/CMakeList.txt 文件。 setup_mingw.bat "-DOpENer_TRACES:BOOL=TRUE"
OpENer 功能的文档是源代码的一部分。源包在目录 doc/api_doc 中包含生成的文档。如果您使用 GIT 版本,您将需要 Doxygen 程序来生成 HTML 文档。您可以通过从 opener 主目录中的命令行调用 doxygen 来生成文档。
模糊测试是一种自动化测试方法,它将不同的输入数据定向到程序以监视输出。这是一种测试整体可靠性以及识别潜在安全错误的方法。
我们使用的模糊器是 AFL,它使用运行时引导技术为测试程序创建输入。从高层次的角度来看,AFL 的工作原理如下:
要开始使用 AFL 对该项目进行模糊测试,您需要使用 AFL 对其进行编译。首先确保您已安装 AFL:
sudo apt install build-essential
wget http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz
tar xzf afl-latest.tgz
cd afl*
make && sudo make install
echo "AFL is ready at: $(which afl-fuzz)"
然后,使用 AFL 编译 OpENer:
OpENer/bin/posix
目录./setup_posix_fuzz_afl.sh
make
最后,生成一些测试用例并启动 AFL:
# Generate inputs
mkdir inputs
echo 630000000000000000000000000000000000000000000000 | xxd -r -p > ./inputs/enip_req_list_identity
# You can also use the inputs we prepared from OpENer/fuzz/inputs
# Finally, let's fuzz!
afl-fuzz -i inputs -o findings ./src/ports/POSIX/OpENer
通常,要重现崩溃,使用cat testcase | nc IP_ADDR 44818
重新传输测试用例就足够了。 cat testcase | nc IP_ADDR 44818
但是,由于 CIP 在 EtherNet/IP 层上运行,因此它必须首先注册有效会话。因此,我们需要使用专用脚本: python fuzz/scripts/send_testcase.py IP testcase_path
检查您创建的网络: docker network inform mac_vlan_network
网络将为 Docker 容器分配 IP,外部扫描仪将能够与它们通信。要从 docker 主机内部访问容器,您必须创建一个桥。
创建一个 Dockerfile。这使用 Ubuntu 作为基础映像。它将把 OpENer 复制到映像根目录并安装所需的软件包。最后在镜像的 eth0 上运行 OpENer: #Filename: Dockerfile FROM ubuntu:20.04 ADD ./bin/posix/src/ports/POSIX/OpENer / RUN apt-get update && apt-get install -y --no-install-推荐 libcap-dev nmap ENTRYPOINT ["./OpENer", "eth0"]
创建一个 docker-compose.yml,它可以让您将 macvlan 网络连接到容器,并轻松构建和拆除它们: version: "3.3" services: dockerimagename: network_mode: mac_vlan_network image: dockeruser/dockerimagename
请注意,要登录正在运行的容器,您必须在 dockerfile 和 dockercompose 文件中公开端口并设置网桥。
用于启动和停止 OpENer 容器的多个实例的 Docker 命令: 启动 128 个 docker 镜像实例: docker-compose up --scale dockerimagename=128 -d 关闭所有实例: docker-compose down
要将 OpENer 移植到新平台,请参阅 Doxygen 文档中的移植部分。
最简单的方法是分叉存储库,然后创建一个功能/错误修复分支。完成功能/错误修复后,创建拉取请求并解释您的更改。另外,请更新和/或添加 doxygen 注释到提供的代码部分。请遵守 source/doc/coding_rules 中定义的编码约定。符合缩进转换的最简单方法是在 OpENer 存储库中将 uncrustify 设置为 git 过滤器,这可以通过以下命令来完成:
git config filter.uncrustify.clean "/path/to/uncrustify/uncrustify -c uncrustify.cfg --mtime --no-backup"
git config filter.uncrustify.smudge "cat"