Python応用

抽象化を捨てたら地獄が待っていた|EtherNet/IPパケットを手動で組み立てた話

「ライブラリを使えばOT機器との通信なんて簡単でしょ?」

そう思っていた時期が、私にもありました。でも実は、ライブラリはアーキテクチャを隠してしまうんですよね。海外のセキュリティ研究者 RUGERO Tesla(@404Saint)さんが書いた記事が、まさにその落とし穴をリアルに語っていて、めちゃくちゃ刺さりました 🔥

今回は、産業制御システム(ICS)向けプロトコル「EtherNet/IP」のパケットを手動で生バイト列から組み立てたという話を紹介しつつ、Pythonで実際にどんなコードになるのかを解説していきます。

🏭 EtherNet/IPって何?

industrial network
industrial network / Photo by panumas nikhomkhai via Pexels

EtherNet/IPは、工場や設備で使われるPLC(プログラマブルロジックコントローラ)と通信するための産業用プロトコルです。

イメージとしては「工場のロボットアームや生産ラインの機械に命令を送るための専用通信言語」、そんな感じです。

一般的な開発では pycomm3 などの高レベルライブラリを使います。でも、ライブラリに頼るだけではパケットの内部構造・シーケンス番号・コマンド体系を本当には理解できない、というのが今回の核心です。

🔬 手動パケット組み立て:Pythonで再現してみる

EtherNet/IPのセッション確立には、まず Register Session(コマンド 0x0065) を送る必要があります。ポイントをまとめるとこんな感じです。

  • ヘッダは 24バイト固定
  • コマンド・長さ・セッションハンドル・ステータスなどをリトルエンディアンで詰める
  • ペイロードはわずか4バイト(プロトコルバージョン+オプションフラグ)
import socket
import struct

# EtherNet/IP の Register Session パケットを手動で組み立てる
def build_register_session():
    command        = 0x0065  # Register Session コマンド
    length         = 0x0004  # ペイロード長(4バイト)
    session_handle = 0x00000000  # 初回は0
    status         = 0x00000000
    sender_context = b'\x00' * 8
    options        = 0x00000000

    # ヘッダを struct でリトルエンディアン詰め
    header = struct.pack(
        '

ここが重要です ✅

  • struct.pack のフォーマット文字列 '<' でリトルエンディアンを明示している
  • ポート番号 44818 がEtherNet/IPの標準ポート
  • ライブラリなしでも、バイト列の意味が完全に把握できる

💡 「抽象化を捨てる」ことで何が見えてくるの?


ライブラリを使わずに手を動かすと、こんなことが分かってきます。

  • ⚙️ セッション確立→サービスリクエスト→切断という通信シーケンスの全体像
  • 🔍 エラーコードが返ってきたとき、どのフィールドが原因なのかが特定できる
  • 🛡️ セキュリティ研究において「なぜこの脆弱性が生まれるか」の根っこの理由が見える

「むずかしそう」と感じるのは当然です。でも、一度バイトレベルで通信を追いかけると、ライブラリのドキュメントの読み方まで変わりますよ 😊

まとめ

抽象化ライブラリは便利だけど、本当の理解は生バイトの中にあるというのが今回の核心です。EtherNet/IPに限らず、MQTTやModbusなど産業系プロトコルを扱う機会がある方は、ぜひ一度「ライブラリなし」で触ってみてください。

きっと「こういう仕組みだったのか!」という発見が待っています。一緒に深掘りしていきましょう 🚀

📡 Arduinoをもっと深く学ぼう!

Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。

Arduinoロボット入門のおすすめコース・部品を見る →

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です