OpENer عبارة عن مكدس EtherNet/IP™ لأجهزة محول الإدخال/الإخراج؛ يدعم العديد من اتصالات الإدخال/الإخراج والاتصالات الصريحة؛ يتضمن كائنات وخدمات لإنشاء منتجات متوافقة مع EtherNet/IP™ محددة في مواصفات ETHERNET/IP وتم نشرها بواسطة ODVA (http://www.odva.org).
يمكن لمستخدمي ومطوري 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
لقد تم تطوير OpenENer ليكون سهل الحمل للغاية. يستهدف الإصدار الافتراضي أجهزة الكمبيوتر التي تعمل بنظام التشغيل POSIX وواجهة شبكة بمقبس BSD. لاختبار هذا الإصدار، نوصي بجهاز كمبيوتر يعمل بنظام Linux أو Windows مثبت عليه Cygwin (http://www.cygwin.com). سوف تحتاج إلى تثبيت ما يلي:
للبناء العادي. يجب تثبيتها على معظم عمليات تثبيت Linux وهي جزء من حزم تطوير Cygwin.
إذا كنت ترغب في تشغيل اختبارات الوحدة، فسيتعين عليك أيضًا تنزيل CppUTest عبر https://github.com/cpputest/cpputest
لتكوين المشروع، نوصي باستخدام واجهة المستخدم الرسومية CMake (على سبيل المثال، حزمة cmake-gui على Linux، أو أداة التثبيت لنظام التشغيل Windows المتوفرة في CMake)
setup_posix.sh
استدعاء أمر make
استدعاء Opener:
./src/ports/POSIX/OpENer
على سبيل المثال ./src/ports/POSIX/OpENer eth1
لدى OpENer الآن أيضًا إمكانية بدء تشغيل POSIX في الوقت الفعلي عبر خيار OpENer_RT، والذي يتطلب أن تحتوي النواة المستخدمة على تصحيحات 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
في Visual Studioالتغيير إلى binwin32srcportsWIN32
اعتمادًا على ما إذا اخترت تكوين Debug
أو Release
في Visual Studio، فسيظهر الملف القابل للتنفيذ إما في المجلد الفرعي Debug أو Release
استدعاء OpenER عبر
OpENer
على سبيل المثال OpENer 3
للحصول على فهرس الواجهة الصحيح، أدخل route print
في موجه الأوامر وابحث عن عنوان MAC لواجهة الشبكة التي اخترتها في بداية الإخراج. الرقم الموجود في أقصى اليسار هو فهرس الواجهة المقابل.
يمكن إعادة استخدام ملف إعداد POSIX لـ Cygwin. يرجى ملاحظة أنه لا يمكنك استخدام وضع RT وسيتعين عليك إزالة الكود المسؤول عن التحقق والحصول على الإمكانيات المطلوبة، حيث أن libcap غير متوفر في Cygwin. الطريقة الأسهل والأكثر دعمًا لإنشاء OpENer لنظام التشغيل Windows هي استخدام MinGW أو Visual Studio.
setup_mingw.bat
في سطر أوامر dos. (ليست قذيفة باش). إذا كنت ترغب في التتبع، فاستخدم ما يلي (حيث يجب وضع المعلمة cmake بين علامتي اقتباس) أو قم بتغيير الملف ./source/CMakeList.txt. setup_mingw.bat "-DOpENer_TRACES:BOOL=TRUE"
يعد توثيق وظائف OpENer جزءًا من الكود المصدري. تحتوي الحزم المصدرية على الوثائق التي تم إنشاؤها في الدليل doc/api_doc. إذا كنت تستخدم إصدار GIT فستحتاج إلى برنامج Doxygen لإنشاء وثائق HTML. يمكنك إنشاء الوثائق عن طريق استدعاء الدوكسيجين من سطر الأوامر في الدليل الرئيسي الافتتاحي.
Fuzzing هي طريقة اختبار تلقائية توجه بيانات الإدخال المتنوعة إلى البرنامج من أجل مراقبة المخرجات. إنها طريقة لاختبار الموثوقية الشاملة بالإضافة إلى تحديد الأخطاء الأمنية المحتملة.
إن Fuzzer الذي نستخدمه هو AFL، وهو Fuzzer يستخدم تقنيات موجهة لوقت التشغيل لإنشاء مدخلات للبرنامج الذي تم اختباره. من 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)"
ثم قم بتجميع OpenENer مع AFL:
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
ومع ذلك، نظرًا لأن CIP يعمل عبر طبقة EtherNet/IP، فيجب عليه أولاً تسجيل جلسة عمل صالحة. لذلك، نحتاج إلى استخدام برنامج نصي مخصص: python fuzz/scripts/send_testcase.py IP testcase_path
تحقق من الشبكة التي قمت بإنشائها باستخدام: docker Network Inspector mac_vlan_network
ستقوم الشبكة بتعيين عناوين IP لحاويات الإرساء وسيتمكن الماسح الضوئي الخارجي من التواصل معها. للوصول إلى الحاويات من داخل مضيف عامل الإرساء، سيتعين عليك إنشاء جسر.
قم بإنشاء ملف Dockerfile. يستخدم هذا Ubuntu كصورة أساسية. سيقوم بنسخ OpenENer إلى جذر الصورة وتثبيت الحزم المطلوبة. أخيرًا، قم بتشغيل OpENer على eth0 للصورة: #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 بالحاويات وبناءها وتدميرها بسهولة: الإصدار: "3.3" الخدمات: dockerimagename: Network_mode: mac_vlan_network image: dockeruser/dockerimagename
لاحظ أنه لتسجيل الدخول إلى حاوية قيد التشغيل، يجب عليك الكشف عن منفذ في ملف dockerfile وملفات dockercompose وإعداد جسر شبكة.
أوامر Docker لبدء وإيقاف مثيلات متعددة لحاويات OpENer: بدء تشغيل 128 مثيلًا لصورة عامل الإرساء: docker-compose up --scale dockerimagename=128 -d إيقاف تشغيل جميع المثيلات: docker-compose down
لنقل OpENer إلى منصات جديدة، يرجى مراجعة قسم النقل في وثائق Doxygen.
أسهل طريقة هي تقسيم المستودع، ثم إنشاء فرع ميزة/إصلاح الأخطاء. بعد الانتهاء من الميزة/إصلاح الأخطاء، أنشئ طلب سحب واشرح تغييراتك. يرجى أيضًا تحديث و/أو إضافة تعليقات دوكسيجين إلى أقسام الكود المتوفرة. يرجى الالتزام باصطلاحات الترميز، كما هو محدد في source/doc/coding_rules. أسهل طريقة للتوافق مع تحويل المسافة البادئة هي تعيين uncrustify كمرشح git في مستودع OpENer، والذي يمكن القيام به باستخدام الأوامر التالية:
git config filter.uncrustify.clean "/path/to/uncrustify/uncrustify -c uncrustify.cfg --mtime --no-backup"
git config filter.uncrustify.smudge "cat"