蚊取りルーター・スマートノーマット

本記事はルーターハックAdvent Calendar 7日目の記事です。

さて、前回までに OpenWrt のインストールやカスタマイズまで軽く紹介したところで、7日目の今回は「イベントとかで発表したけど記事にしてなかった過去作」の紹介企画、【過去作供養】コーナー第1弾である。

第1弾のハックは、その名も「蚊取りルーター・スマートノーマット」だ!

おことわり

技適 に関する筆者の配慮や考えについてはカレンダー1日目「技適とルーターハック」をご覧ください。本記事で紹介する内容は、法を遵守するための慎重な注意をもって書かれています。

www.zopfco.de

当時

2016年は5月、まだ春の気温が続く頃、こんなツイートがバズっていた。

『Wi-Fi繋がりそうな勢い』…!!? ルーターにしちゃえばいいじゃん!!!

ツイート主にちゃんとDMで許可を取り、実際に小さなルーターを中に入れてマジのルーターにしてしまうことにした。

ノーマットの解剖

写真の商品は、蚊取り装置の代表とも言えるアース・ノーマットの電池式だった。薬液がしみこんでいるカートリッジに風を当て、まわりに蚊を忌避する成分を拡散させる仕組みだ。

www.earth.jp

買った。

f:id:puhitaku:20160523185257j:plain

即バラした。

f:id:puhitaku:20160523191313j:plain

部品を並べたのが以下。羽根の間からドライバーを差し込んでグリッとやらないと外れないパーツがあったりと案外複雑だった。

f:id:puhitaku:20160523191117j:plain

f:id:puhitaku:20160627222331j:plain

基板部を拡大してみると、TSOP8 と思われるパッケージの IC と、モーターが回るだけにしては案外複雑な周辺回路が見える。カートリッジ残量が減るとLEDで知らせる 仕組みがある(カートリッジにボタン電池がついていて、おそらくこれの電圧をADCしている)ことや、モーターの回転数を一定量に保つ必要もあるであろうことから、それなりに複雑になるのかもしれない。

…いやそれにしてももっと簡素になりそうなものだが。

ルーター選定

当時、上海問屋で売ってるやたら安くてコンパクトなルーターとして NEXX WT1520 が話題になっていた。見た感じだとノーマットに入りそうということで、早速買ってみた。

f:id:puhitaku:20160522233327j:plain

そしてバラす。

f:id:puhitaku:20160522231512j:plain
グリッと。

f:id:puhitaku:20160522231648j:plain

CPU に Ralink RT5350 @ 360MHz、Flash 8 MiB、RAM 32 MiB の構成。USBポートも元からあるのでコンパクトさに対してずいぶん遊びやすいルーターだ。

基板を取り出しノーマットの電池ボックスにあてがうと、これまたサイズがピッタリ。ノーマットに入れてくれと言わんばかりのピッタリさだ。

ノーマットの加工

そうと分かればあとはノーマットを加工してルーターを繋ぎこむだけだ。配線途中の画像がこちら。

f:id:puhitaku:20160628001432j:plain
LEDを交換し、ファン・LED・電源スイッチを配線。

f:id:puhitaku:20160628005451j:plain
ICはもう要らないので、ひっぺがしてランドにはんだ付け。

f:id:puhitaku:20160628005546j:plain
雑に配線。

今見てもかなり雑な配線である。モーターの消費電力がもともと小さくできているので、3.3V な GPIO の出力を 直接モーターに接続しても いい感じに回るのでこうした記憶がある。GPIO 番号と実際のテストポイントの対応については下記画像が参考になった。

f:id:puhitaku:20181208203358j:plain
from: https://tuxotronic.org/post/clone-wt1520/

そしてそして、電池ボックスのフタを削って組み付けたのが以下の画像である。

f:id:puhitaku:20160628221714j:plain

f:id:puhitaku:20181208205045j:plain

f:id:puhitaku:20181208205134j:plain
フタの固定はとりあえずマスキングテープw

うーんピッタリ!!

OpenWrt のインストールによって無線が使えないうえ、内蔵フラッシュが 8 MiB と遊ぶ幅がないので、rootfs を拡張するための USB メモリと、Wi-Fi ドングル(単体で技適認証を受けたもの)も配置した。

USB ハブは秋葉原で適当に買った小さいものだが、USBポートが横向きでそのままでは取り出せないので、USBハブも分解して体積を減らして詰め込んだ。

f:id:puhitaku:20181208204949j:plain
今思えば、ハブのコネクタは残す必要がなかったし直に繋げばよかったかも。

スマホから制御できるようにする

これだけではモーターは回らない。せめてスマホから操作できなければ「スマート」ノーマットとは呼べない。そこで API サーバーとフロントエンドを実装した。コードは GitHub に上げていた記憶があるのだが、実際に見てみると初手のコミットしかなくそのままになっている。めっちゃ頑張ってフロント書いたのに!過去の自分を呪いたい。

github.com

バックエンドは GPIO を書き換えるほかは静的ファイルをサーブするだけなので Flask でパパッと記述した。フロントエンドに関しては、当時社内ツールで React を使ったのでノリで React + JSX で書いた。

f:id:puhitaku:20181208205922p:plain
実際のスクショ。

上の画像では残量表示とか AUTOMATIC SWITCH なる項目が未実装で適当だが、実機にChromeでアクセスして得たスクショである。ボタンを押すと裏で XHR が走り、GPIO がスイッチされる。

ちなみに、ON にするときの API へのリクエストは DELETE 192.168.1.1/api/mosquitoes である。

当時公開しなかった理由

AUTOMATIC SWITCH が示唆するように、当時は窓を開けるとスイッチオンとか、GPS で自動でノーマットの電源を入れるみたいな機能を構想していた。だが、その自動制御を手前にしてやる気の灯火が消えてしまい、明治大学で開催された ABPro 2016 で発表した程度でお蔵入りになってしまった。結局長い不作の期間と共に夏も終わり、完全に発表するチャンスを逃してしまったのだ。

まあネタとしては面白かったし、今でもルーターハックの語り草としてよく登場させる印象的なハックだった。Advent Calendar として成仏させられてよかったと思う。

次回

さて、1日遅れで展開しているルーターハック Advent Calendar の次回は、ルーターのブートシークエンスについて書こうと思う。どっちかというと、U-Boot 〜 Login shell までの流れについて、個人の理解のために書く感じだ。乞うご期待。

ファームの礎『OpenWrt』 書き込み・カスタマイズ編

本記事はルーターハックAdvent Calendar 6日目の記事です。

1日遅れてしまった!なんとかして取り戻さないと…

昨日(というよりおととい)は番外編として PlayStation Classic の eMMC を吸い出したレポートに変更したが、PlayStation Classic の粗熱が取れてきたところで OpenWrt に戻ることにする。

www.zopfco.de

おことわり

技適 に関する筆者の配慮や考えについてはカレンダー1日目「技適とルーターハック」をご覧ください。本記事で紹介する内容は、法を遵守するための慎重な注意をもって書かれています。

www.zopfco.de

ビルド完了

前回は make を実行したところで一旦切った。ビルドはうまく行っただろうか?

f:id:puhitaku:20181206193727p:plain
このように、checksumのあと何も言わず終了していればビルドは成功だ。

リポジトリのrootで ./bin/targets/ar71xx/tiny/ls してみよう。

f:id:puhitaku:20181206194206p:plain

このうち、 openwrt-ar71xx-tiny-whr-g301n-squashfs-factory.bin をインストールに使用する。

ブラウザで流し込む

OpenWrt のインストール方法は、電源通電直後のブートローダーの間にTFTPクライアントでファームを送りつけるのが典型だ。だがこの機種 Buffalo WHR-G301N はことさら簡単で、上記の openwrt-ar71xx-tiny-whr-g301n-squashfs-factory.bin をルーターの設定画面から流し込むだけでインストールができる。

PC とルーターを Ethernet で接続し、PC 側 IP アドレスを 192.168.11.0/24 の適当なアドレスに設定する(DHCPでもいい)。次に 192.168.11.1 に接続して

  • ユーザー名: root
  • パスワード: (空白)

で設定画面のBASIC認証を通過。

f:id:puhitaku:20181207045108p:plain
いつもの設定画面。

あとはファーム更新画面でさっきのバイナリ openwrt-ar71xx-tiny-whr-g301n-squashfs-factory.bin を指定し雑にアップデートするだけだ。

f:id:puhitaku:20181207045339p:plain
禁断のバイナリを食してしまう様子。

アップロードが終わると本体は再起動する。完全に起動し切るまで本体のLEDが消えたりついたりするので、この隙に PC 側 IP アドレスを 192.168.1.0/24 なアドレス、例えば 192.168.1.2 にでも変えておこう。

ssh!!

あとは ssh で root@192.168.1.1 に接続すればパスワード無しでログインできるはずだ。ルーターに ssh!!ドキドキの瞬間である。

f:id:puhitaku:20181207095911p:plain
このような motd が見えれば成功。

WARNING とあるように root のパスワードは初期設定で空白になっている。このままでは言わずもがな危険なので passwd でパスワードを設定しておこう。

設定を変えてみる

いわゆる民生品のルーターは、利用者の障壁を下げるためすべてブラウザを通してグラフィカルに設定できる(OpenWrt でもグラフィカルな設定はできるのだが、後述)。一方でこちらは shell 越しが基本となる。

ちなみに、Wi-Fi は初期設定で disable1 になっているため安心だ。

例: IP アドレス

Interface ごとの IP アドレス、スイッチ、VLAN等の設定は /etc/config/network を編集する。初期設定はシンプルであり見た目にわかりやすい。

root@OpenWrt:~# cat /etc/config/network

config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        option ula_prefix 'fdaf:7e24:c331::/48'

config interface 'lan'
        option type 'bridge'
        option ifname 'eth0.1'
        option proto 'static'
        option ipaddr '192.168.1.1'
        option netmask '255.255.255.0'
        option ip6assign '60'

config interface 'wan'
        option ifname 'eth1'
        option proto 'dhcp'

config interface 'wan6'
        option ifname 'eth1'
        option proto 'dhcpv6'

config switch
        option name 'switch0'
        option reset '1'
        option enable_vlan '1'

config switch_vlan
        option device 'switch0'
        option vlan '1'
        option ports '1 2 3 4 0t'

設定を変えたら、 reload_config で設定を反映できる。

パッケージを増やしてみる

以前紹介したように、パッケージはかなりいろいろ追加できる。この追加は非常に簡単で、OpenWrt の Git リポジトリの root で make menuconfig を再び起動し、 Base system より下のジャンル別項目から欲しいソフトにチェックを入れることでいい感じにファームに追加される。

枚挙に暇がないので説明は LuCI だけに留めるが、Samba といった鉄板daemonに始まり、 mjpeg-streamer のようなおもしろパッケージまである。眺めてみると面白いだろう。

例: LuCI

初手としてよくインストールされるのは、ブラウザで各種設定ができる LuCI だ。容量も案外食わないため WHR-G301N でも追加することが可能。日本語の翻訳もあるので設定の障壁としては大きく下がるだろう。

f:id:puhitaku:20181207102031p:plain
menuconfig → LuCI → Collections 以下に大元のパッケージがある。

LuCI はネットワークにまつわる設定だけでなく、Module を追加することで他の daemon も設定できるようになるため便利である。

追加してビルドし、後述の sysupgrade でインストールすれば、再起動後に 192.168.1.1 に接続するだけでログイン画面を拝むことができる。ワクワク!

ファームをふたたび書き込むには

最初に OpenWrt をインストールする時は factory イメージを使用したが、以降は sysupgrade イメージを sysupgrade コマンドに渡すことでファームウェアのインストールができる。

$ scp ./bin/targets/ar71xx/tiny/openwrt-ar71xx-tiny-whr-g301n-squashfs-sysupgrade.bin root@192.168.1.1:/tmp
$ ssh root@192.168.1.1 sysupgrade /tmp/openwrt-ar71xx-tiny-whr-g301n-squashfs-sysupgrade.bin

通常であれば、 openwrt-ar71xx-tiny-whr-g301n-squashfs-factory.bin の横に openwrt-ar71xx-tiny-whr-g301n-squashfs-sysupgrade.bin も生成されるのだが、「ビルド完了」の節のスクショを見ると存在しないことがわかる。実は、 WHR-G301N は内蔵フラッシュがとりわけ小さいことが原因で初期 config では sysupgrade イメージが生成できない。 makeV=s という変数を設定して実行すると、データ量が大きすぎてイメージが生成できていない旨が表示される。

$ make V=s
...(中略)...
Warning: /home/takumi/dev/router/openwrt_stable/bin/targets/ar71xx/tiny/openwrt-ar71xx-tiny-whr-g301n-squashfs-sysupgrade.bin is too big (> 3538944 bytes)

生成されたrootfsの中身を見ると、pppd が比較的容量を食っていた。筆者の場合 pppd は必要ではないので、make menuconfig 以下より pppd を選択解除すると sysupgrade イメージが生成されるようになった。ここで LuCI を追加しても生成されたことから、pppd は結構容量を食っていたことがわかる。

無線ももちろん使えないので、wpa-supplicant のような無線関係のソフトウェアやドライバを選択解除するのもアリだろう。

次回

今回は OpenWrt をビルドして実機に流し込むところまで解説した。次回は過去作供養シリーズ第1弾として、以前イベント等では発表したものの記事にしていなかったものを文章にしたためようと思う。

【番外編】PlayStation Classic の eMMC をダンプする

本記事はルーターハックAdvent Calendar 5日目の記事です。

本来ならば、5日目は昨日の続きとして、ビルドした OpenWrt のインストールやカスタマイズについて書く予定だったのだが。

盛り上がってしまった。火曜の深夜に。

f:id:puhitaku:20181205032107j:plain
開封して5秒で分解された残骸。

先人たちの解析をもとに、eMMC の SDカードリーダーによるダンプを試したところあっさり吸い出せてしまったので報告する。

PS Classic が解析されてきた流れ

発売前から、PS Classic の中身については海外で Teardown されたりとごく普通に情報が飛び交っていた。

www.eurogamer.net

発売後は、国内の物好きな人々(というか主にnvsoftsさん。アグレッシブな報告感謝します!!!)が次々にブートログや Fastboot について情報を発信していた。人気なハードウェアというのは何人もの人がいじくるので展開が早い。

「eMMCならもしや…」

タブレットでの使用歴がある SoC の性質からするとデータの保存は eMMC になされるのが自然だろう。そうなると eMMC がどのチップなのかを見つけなければならないが、パーツも多くないのですぐ特定できる。eMMCのよくある置かれ方としては、

  • BGA (Ball Grid Array)
  • 単品
  • SoCとの接続が10本ちょいぐらい
    • D0~7, CLK, CMD に加え電源など
  • DRAMほどシビアではないので楽そうな配線で置いてある
    • クネクネしてない
    • SoC との距離が DRAM より遠い
  • ピン配置にデファクトスタンダード?的なのがありわかりやすい

f:id:puhitaku:20181205094557j:plain
改造後の画像で失礼。

基板の写真を眺めてみると、SoC(中央左) に対して対称配置になっている DRAM(中央の上下に並んでいる2つのチップ) より遠くに置いてあるチップ(中央右)は寸法、信号線の本数、裏面のスルーホール配置などいかにも eMMC に見える。

では、次に気になるのは信号線の構成であるが、偶然 nvsofts さんがバッチリのタイミングでツイートしていたのでそれを拝借した。

eMMC は SDカードと大体互換

eMMC は、名前の通り MMC (Multi Media Card) つまり SDカードの先祖の親戚にあたる。SD カードは、MMC と物理互換なピンと、"だいたい同じ" コマンド体系を持つ*1。だから、後方・下位互換性の高い SD カードリーダーであれば読めるはずということになる。

今回は、その中でも最も遅いが最もベースラインな通信方式 1-bit Mode を使用した。Bit Mode の説明は Black Hat USA 2017 の eMMC 吸い出しに関するセッションから以下引用する。

f:id:puhitaku:20181205124308p:plain
"Hacking Hardware with a $10 SD Card Reader" p25

1-bit Mode だと、信号線にして実に CMD, CLK, DAT0 の3本しかないため接続が楽であり、今回はこれで吸い出すことにした。

SD カードリーダーにつなげるアダプタ作成

SD カードのアダプタを探すと、もう今後2度と使うことはないであろう Mini SD - SD 変換アダプタが出てきた。こいつのカバーをひっぺがし、対応する信号線に接続した。

f:id:puhitaku:20181205125156p:plain
"Hacking Hardware with a $10 SD Card Reader" p26

f:id:puhitaku:20181205125054g:plain
出典: https://howlingpixel.com/i-en/Secure_Digital

SoC を止めてただの電源にする

PS Classic に電源を接続すると、ブートが裏で行われてサスペンド?に入り赤LEDと緑LEDが両方点灯する。この状態では、Vccq(IO電圧)は 1.8 V に吊られたままだが Vcc (カード全体の電源)が Low に落ちてしまう。このブートシークエンスを止めるため、SoC 近傍の Xtal と思われるチップを 1 kΩ 経由で GND に落とす加工を施した。普通に起動させたい時はスイッチで切り替えられるようにしている。 f:id:puhitaku:20181205094614j:plain もっとも、オシロのプローブを当てても定数の変化か Xtal のドライブ能力の低さか波が見えないため、Xtal かどうかの確証は得られていないのだが、結果的にはブートシークエンスが止まり電源が供給されっぱなしになるのでとりあえず押し通している。

認識した

接続するとあっさり認識した!

f:id:puhitaku:20181205020858j:plain

上記ツイートの2枚目は試しにそれっぽい画像を見てみた様子、3枚目はパーティションテーブルを gparted で出したスクショである。

パーティションの種類が不明なものがたくさんある。ここに暗号化された形で多様なデータが記録されているのだろう。独自パーティションでデータを格納するのは PS3 時代から Sony のお家芸である。

ダンプと今後

とりあえずダンプをとるため、 dd で適当に吸い出した。吸いミスがあるとまずいので2回吸い出したが、ハッシュを比較すると一致したため(ハッシュは記録し忘れ、後で上げる)問題ないようだ。

今後は binwalk とかを使って各種情報が吸えないか解析しようと思う。自家製 Linux が動けば面白いが、コードが何も公開されていないためブートローダーとの戦いも予想される。

進捗があればまた番外編として投稿する予定だ。

おまけ: PS Classic の中身の感想

構成から鑑みるに、ファミコンミニとは別の方向でコストをかけているという印象。

MediaTek MT8167A が載っているとか、エミュレーターを使っているとか、そういった構成はすぐ思い付くので特に驚かなかった。ファミコンミニと比較すると、SoC の持つ CPU も GPU も総じて能力は高く、総合したコンピューティング能力は PS Classic が上であると思われる。PS のエミュレーションは 3D も絡んでくることから、ファミコンやスーファミのエミュレーションよりもパワーが必要であった可能性は容易に想像できる。

筐体に関してはファミコンミニより部品点数が(多分)少なく、しかしよりパワフルなSoCを載せているためか放熱がしっかりしている。一方で、コントローラーの基板上にUSBコネクタを載せ、そこに USB Type-A→USB Micro-B のケーブルをつなぐという大胆な構成も見てとれる*2

しかしディストリビューションに Android を使わず Yocto を採用しているらしいのは少し驚いた(ブートログに Yocto の文字列があった)。エミュレーターがいくらAndroidを想定していない普通のOSSだったとしても、Android NDK を組み合わせるなどして Android と融合させることはできるはずで、ソニーの場合その程度平気でやってのけそうだ。まあ、ソニーの場合はゲームなどの著作物を極めて厳重に扱うため、Android のような「ハックできるスキ」の生まれやすいゴテゴテしたシステムよりも、Yocto のような全レイヤーを端々まで固めきれるディストリビューションのほうが良かったのかもしれない。

*1:一部非互換なコマンドや、SD特有のセキュアなオペレーションがある

*2:コントローラー基板に基板間接続用コネクタを置いたとして、PS本体とのUSB接続にUSB→表面実装コネクタなハーネスをわざわざ調達するほうがコストがかかるのではないかと推測