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 中定義的編碼約定。
git config filter.uncrustify.clean "/path/to/uncrustify/uncrustify -c uncrustify.cfg --mtime --no-backup"
git config filter.uncrustify.smudge "cat"