EM4100 RFIDタグを解析してエミュレートしてみた ~李下に冠を正さず~

7M4MON

2020年に 『RFワールド No.52』へ掲載された記事
「多機能計測器“Analog Discovery 2”をGNU Radioで使う」第5章GRCで作る125 kHz帯RFIDタグ・エミュレータ」
の要約・再編集版です。

技術的詳細については記事をご参照ください。

きっかけ

当時、Analog Discovery 2 を GNU Radio から扱うための GRC ブロックを自作しました。

せっかく Analog Discovery 2 と GNU Radio をつなげられるようになったので、何か実信号を扱う題材が欲しくなりました。

どうせなら、ただ受信して終わりではなく、信号を観測して、デコードして、さらに再生までできるような「なりすまし系」の実験をしてみたい。

そんなときにちょうど良さそうだったのが、125kHz帯の EM4100 RFID タグでした。

EM4100 はカード自体が安価で、USB接続タイプのリーダーも数百円程度で入手できます。信号の構造も比較的シンプルなので、Analog Discovery 2 と GNU Radio を使った信号処理の題材としてちょうど良いと考えました。

使用したもの

RFIDの信号を観測する

まずは通信波形を観測します。

USBリーダーとタグの間にコイルを配置し、Analog Discovery 2で波形を見ます。

観測してみると125kHzの搬送波が出ており、タグを近づけると振幅が周期的に変化していることが分かりました。

この振幅変化を確認すると、

であることが推測できます。

ここで面白いのが、タグ自身は電波を送信しているわけではないことです。

電力を消費する量を変化させることで、読み取り側から見ると振幅が変化しているように見えます。

これを「ハイカレント状態」と呼びます。

GNU Radioでデコードする

記録した波形をGNU Radioへ入力し、

  1. AM復調
  2. HPF
  3. 2値化
  4. マンチェスタ復号
  5. パリティチェック

という流れで処理しました。

EM4100はマンチェスタ符号化なので、そのまま0/1にはなりません。

クロック位置を推定しながら同期を取る必要があります。クロック再生等の技術的詳細についてはRFワールド No.52をご参照ください。

GRCのデコーダープログラムはこのリポジトリで公開しています。


任意のIDを生成する

デコードだけでは面白くないので、次は任意IDの生成です。

EM4100は

という構造になっています。

40bitのIDからこれらを組み立て、マンチェスタ符号化して送信用データを生成しました。

プログラムはこちらのリポジトリで公開しました。

エミュレートしてみる

自作した回路で搬送波負荷を切り替え、タグのハイカレント状態を模擬します。

そしてAnalog Discovery 2のPattern Generatorから生成したビット列を出力すると……

カードリーダーに、自分で生成したIDが表示されました。

「ただ記録して再生する」だけでなく、信号構造を理解して再構築できた瞬間はかなり面白かったです。

注意

本記事は、RFIDの信号処理や低周波無線通信の仕組みを学ぶことを目的とした技術実験の記録です。
他人のカードやタグの無断解析、複製、なりすまし、または入退室管理システム等への不正利用を目的とするものではありません。

Arduinoを使ってスタンドアローンで動作する装置として実装したものは、以下のリポジトリで公開しています。

Arduino版 EM4100 RFID spoofer