オークションで落とした NETGEAR JGS524PEのようすがおかしい。
状況
・マネージドプラスなはずなのにIPが見えない。
・初期化ボタンが反応しない
・アクティビティランプが全てオレンジ点灯
・PoEをつなぐとリンクが上がって動くようにみえるが、NoPoEなポートは光ってんのかわからん
まずPoE給電も問題ないしつなぐとアクセスランプが光るのでハード的には大丈夫そう?と推測。
すべてのアクティビティランプがオレンジ点灯はマニュアルに記載がなく、調べるとNETGEARのフォーラムに同じ症状でブートログを拾ってROM焼きについて質問しているケースを発見。
そうだよなぁ、ファームウェアがぶっ壊れてるんじゃねぇかなぁ~~と自分も思ったので分解。
フラッシュメモリを探したら25032FVSIGが乗ってた。多分これにデータが入ってそう。
データシートを見て調べたら、CH341AというROM焼き機でデータ読み書きできるっぽかったので買った。クリップがついてたけどコンデンサが近くにあって非常にやりにくかったのでワイヤをハンダでつないだ。
コンデンサーやフラッシュそのものを取ろうとも思ったけど、持ってる機材だと熱が逃げてはんだがうまく取れなかった。プレヒートとかすればうまく取れるのかなぁ。あとは低融点はんだとかか。
ハンダの固定が弱いのと、短いワイヤしかなかったので取り回しのためにブレッドボードを噛ませた。結果的に色々トライアンドエラーでROM焼いて、火入れてを繰り返したのでこれは良かった。
とりあえずCH341Aで無事データが読めたので保存する。データ取得はCH341Aの販売元が配布してた以下ツールを使ってextracted_JGS524PE.binで保存した。
https://github.com/Keeyees/CH341A-Manual-NEW-JP
ネットギア公式のFWを見てみる
フラッシュの中身が壊れてるという前提で見ていくので、まずは比較用にネットギア公式から落とせるファームを見てみる。ファイルを読むと先頭に"music_elite"から始まりファームのバージョンやビルド日時っぽいもの、型名が出てくる。(なんだmusic_eliteって...
$ xxd -g1 -u JGS524PE_JGS524Ev2_V2.6.0.48.bin | head -10
00000000: 6D 75 73 69 63 5F 65 6C 69 74 65 00 00 00 00 00 music_elite.....
00000010: 32 2E 36 2E 30 2E 34 38 00 00 00 00 00 00 00 00 2.6.0.48........
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000030: 32 30 32 30 2E 31 31 2E 31 39 20 32 31 3A 33 33 2020.11.19 21:33
00000040: 3A 32 36 00 00 00 00 00 00 00 00 00 00 00 00 00 :26.............
00000050: 4E 45 54 47 45 41 52 00 00 00 00 00 00 00 00 00 NETGEAR.........
00000060: 4A 47 53 35 32 34 50 45 00 00 00 00 00 00 00 00 JGS524PE........
00000070: 00 00 01 00 00 05 E8 23 8F 00 00 00 00 00 00 00 .......#........
00000080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
吸い出したデータと比較してみる
NETGEARのフォーラムにあるように、実機のデータはいくつかのパーテーションに分かれているらしい。
flash id:0xc22016, using default size:0x400000 Bytes
flash partition info:
[partition total size]:0x400000
[loader] addr:0x0 size:0x3c000
[control_block] addr:0x3c000 size:0x4000
[image_a] addr:0x40000 size:0xc0000
[image_b] addr:0x100000 size:0xc0000
[running_image] addr:0x1c0000 size:0x200000
[boot_cfg] addr:0x3c0000 size:0x4000
[user_cfg] addr:0x3c4000 size:0x3c000
brick JGS524PE - NETGEAR Communities
上記のアドレスを参考に、実機から持ってきたバイナリを見てみる。試しに0x1c0000のrunning_imageの部分を読んでみるがよくわからん。ただ規則性はあるようでrunning_imageもimage_aもimage_bも"isumle_c"で始まっていて、なんだか文字の位置が公式のファームとにている。
$ xxd -g1 -u -s0x1c0000 extracted_JGS524PE.bin | head -10
001c0000: 69 73 75 6D 6C 65 5F 63 00 65 74 69 00 00 00 00 isumle_c.eti....
001c0010: 2E 30 2E 30 00 30 2E 30 00 00 00 00 00 00 00 00 .0.0.0.0........
001c0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
001c0030: 35 31 30 32 2E 33 30 2E 31 20 34 30 36 34 3A 38 5102.30.1 4064:8
001c0040: 00 36 30 3A 00 00 00 00 00 00 00 00 00 00 00 00 .60:............
001c0050: 00 41 43 51 00 00 00 00 00 00 00 00 00 00 00 00 .ACQ............
001c0060: 5F 4E 46 51 4F 4D 45 44 00 00 00 00 00 00 00 00 _NFQOMED........
001c0070: 00 01 00 00 2C A3 14 00 00 00 00 25 00 00 00 00 ....,......%....
001c0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
001c0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
吸い出したフラッシュの中身を公式のFWと同じ形式に変換してみる
こちらのフォーラムに 4バイト単位で逆に変換する必要があるとあったので、書いてあったFWのほうではなく実機から吸った方を変換してみる。変換したファイルをrev_extracted_JGS524PE.binとして保存。
$ objcopy -I binary -O binary --reverse-bytes=4 extracted_JGS524PE.bin rev_extracted_JGS524PE.bin
各領域を見てみる。フラッシュの中身が読めるようになった。どうやらFWと同じ形式でデータが入っているようだが、running_imageのフォーマットが違う。バージョン部分が0.0.0.0になっている
$ xxd -g1 -u -s0x40000 rev_extracted_JGS524PE.bin | head -10
00040000: 6D 75 73 69 63 5F 65 6C 69 74 65 00 00 00 00 00 music_elite.....
00040010: 32 2E 30 2E 30 2E 33 31 00 00 00 00 00 00 00 00 2.0.0.31........
00040020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00040030: 32 30 31 33 2E 31 31 2E 31 39 20 31 34 3A 30 34 2013.11.19 14:04
00040040: 3A 30 38 00 00 00 00 00 00 00 00 00 00 00 00 00 :08.............
00040050: 4E 45 54 47 45 41 52 00 00 00 00 00 00 00 00 00 NETGEAR.........
00040060: 4A 47 53 35 32 34 50 45 00 00 00 00 00 00 00 00 JGS524PE........
00040070: 00 00 01 00 00 03 6B 9A 21 00 00 00 00 00 00 00 ......k.!.......
00040080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00040090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
$ xxd -g1 -u -s0x100000 rev_extracted_JGS524PE.bin | head -10
00100000: 6D 75 73 69 63 5F 65 6C 69 74 65 00 00 00 00 00 music_elite.....
00100010: 32 2E 30 2E 31 2E 32 36 00 00 00 00 00 00 00 00 2.0.1.26........
00100020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00100030: 32 30 31 35 2E 30 33 2E 30 34 20 31 38 3A 34 36 2015.03.04 18:46
00100040: 3A 30 36 00 00 00 00 00 00 00 00 00 00 00 00 00 :06.............
00100050: 4E 45 54 47 45 41 52 00 00 00 00 00 00 00 00 00 NETGEAR.........
00100060: 4A 47 53 35 32 34 50 45 00 00 00 00 00 00 00 00 JGS524PE........
00100070: 00 00 01 00 00 04 CC 5D EA 00 00 00 00 00 00 00 .......]........
00100080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00100090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
$ xxd -g1 -u -s0x1c0000 rev_extracted_JGS524PE.bin | head -10
001c0000: 6D 75 73 69 63 5F 65 6C 69 74 65 00 00 00 00 00 music_elite.....
001c0010: 30 2E 30 2E 30 2E 30 00 00 00 00 00 00 00 00 00 0.0.0.0.........
001c0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
001c0030: 32 30 31 35 2E 30 33 2E 30 34 20 31 38 3A 34 36 2015.03.04 18:46
001c0040: 3A 30 36 00 00 00 00 00 00 00 00 00 00 00 00 00 :06.............
001c0050: 51 43 41 00 00 00 00 00 00 00 00 00 00 00 00 00 QCA.............
001c0060: 51 46 4E 5F 44 45 4D 4F 00 00 00 00 00 00 00 00 QFN_DEMO........
001c0070: 00 00 01 00 00 14 A3 2C 25 00 00 00 00 00 00 00 .......,%.......
001c0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
001c0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
running_imageの領域は確保されているサイズも大きいし、なんかHTMLかJavascriptっぽいデータも見える。
破損してるのかなと思ってrunning_imageに2.0.1.26の公式FWを上書きして焼いてみたけど状況は改善しなかった。これは勘違いだった。
色々調べるなかで何が入ってるのか気になってbinwalkしてみると、image_aとimage_bのデータはgzipだったのがわかった。
$ binwalk rev_extracted_JGS524PE.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
58255 0xE38F Copyright string: "Copyright 1995-2012 Mark Adler "
58544 0xE4B0 CRC32 polynomial table, big endian
62640 0xF4B0 CRC32 polynomial table, little endian
262400 0x40100 gzip compressed data, has original file name: "elite.bin", from Unix, last modified: 2013-11-19 06:04:07
1048832 0x100100 gzip compressed data, has original file name: "elite.bin", from Unix, last modified: 2015-03-04 10:46:06
2526530 0x268D42 Copyright string: "Copyright = createImgEle('', '../images/copyright.png', '', 'helpDialogCopyright');"
あ、これimage_aかbをrunnning_imageに展開してるのかな?と思ったので7-zipで開けてみたらelete.binが入ってて、running_imageと同じみたいだ。アタリ!
最新ファームを上書きしてみる(うまくいった)
だいたい公式のFWと実機フラッシュの中身の素性がわかったので、最新のファームを上書きしてみる。
こちらのフォーラムで紹介されているやり方と似たことをやっているはずです。
ちなみに免責です、バイナリいじりやROM焼きは今回が初めてだったの作業内容の保障はできません。もし作業される際は自己責任でお願いします。
ちなみに勝手がわからなかったので下記以外にも色々ためてますが、色々やりすぎて記録できていないのであしからず...
使ったデータ
$ ll
total 5904
-rw-rw-r--. 1 owner owner 1459980 Sep 8 22:09 elite.bin
-rw-rw-r--. 1 owner owner 4194304 Sep 8 22:09 extracted_JGS524PE.bin
-rw-rw-r--. 1 owner owner 387363 Sep 8 22:09 JGS524PE_JGS524Ev2_V2.6.0.48.bin
- extracted_JGS524PE.bin
CH341Aで実機のフラッシュの中身を吸い出して保存したもの。
※失敗した際戻せなくなるので、確実にバックアップしておいてね
- JGS524PE_JGS524Ev2_V2.6.0.48.bin
公式からダウンロードした最新FW(JGS524PE_JGS524Ev2_V2.6.0.48.zip)をダウンロードして中に入っているもの。image_aとimage_bに書き込む用
- elite.bin
JGS524PE_JGS524Ev2_V2.6.0.48.binを展開したデータ。(7-zipで展開できた)
running_imageに書き込む用
上記3つのファイルをLinux環境(RHEL9)で作業しました。
- 保存した実機データ(extracted_JGS524PE.bin)を4バイトで反転させて、ダウンロードした公式FW側にフォーマットをあわせます。
以降編集するファイル(rev_extracted_JGS524PE.bin)を生成します。
objcopy -I binary -O binary --reverse-bytes=4 extracted_JGS524PE.bin rev_extracted_JGS524PE.bin
- ddコマンドでバイナリデータを編集していきます。
seekには開始アドレス位置を、countにはサイズを指定します(10進数表記)
参考:アドレスいちらん
flash partition info:
[partition total size]:0x400000
[loader] addr:0x0 size:0x3c000
[control_block] addr:0x3c000 size:0x4000
[image_a] addr:0x40000 size:0xc0000
[image_b] addr:0x100000 size:0xc0000
[running_image] addr:0x1c0000 size:0x200000
[boot_cfg] addr:0x3c0000 size:0x4000
[user_cfg] addr:0x3c4000 size:0x3c000
brick JGS524PE - NETGEAR Communities
- 既存のFWデータを消すために、編集用にコピーしたrev_extracted_JGS524PE.binのFW領域(image_a,image_b,running_image)を1埋めしてまっさらにします。
tr '\0' '\377' < /dev/zero | dd of=rev_extracted_JGS524PE.bin bs=1 seek=262144 count=786432 conv=notrunc
tr '\0' '\377' < /dev/zero | dd of=rev_extracted_JGS524PE.bin bs=1 seek=1048576 count=786432 conv=notrunc
tr '\0' '\377' < /dev/zero | dd of=rev_extracted_JGS524PE.bin bs=1 seek=1835008 count=2097152 conv=notrunc
- image_a,image_bには公式FWをそのまま、running_imageには公式FWを展開したelite.binを書き込みます。
cat JGS524PE_JGS524Ev2_V2.6.0.48.bin | dd of=rev_extracted_JGS524PE.bin bs=1 seek=262144 conv=notrunc
cat JGS524PE_JGS524Ev2_V2.6.0.48.bin | dd of=rev_extracted_JGS524PE.bin bs=1 seek=1048576 conv=notrunc
cat elite.bin | dd of=rev_extracted_JGS524PE.bin bs=1 seek=1835008 conv=notrunc
- 別機種ですが、user_cfg領域のデータが要因となるケースもあるようで、もしデータが入っていれば1埋めしてもいいかもしれません。boot_cfgにはシリアルNo等が入っていたので、そのままの方がよさそうです。
tr '\0' '\377' < /dev/zero | dd of=rev_extracted_JGS524PE.bin bs=1 seek=3948544 count=245760 conv=notrunc
なお、自分の実機データの場合、取得時点でuser_cfgは埋められていて何もありませんでした。
$ xxd -g1 -u -s0x3c4000 extracted_JGS524PE.bin | head -5
003c4000: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
003c4010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
003c4020: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
003c4030: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
003c4040: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
- 最後に編集したfixed_JGS524PE.binを4バイトで反転させて戻して、 fixed_JGS524PE.binで保存します。このデータをCH341Aで書き込みます。
objcopy -I binary -O binary --reverse-bytes=4 rev_extracted_JGS524PE.bin fixed_JGS524PE.bin
CH341Aでデータを消して、fixed_JGS524PE.binを読み込んで、書き込み。
火入れしてみるとランプが正常になりました。PoEもリンクスピードも正常。
いくらやっても見つからなかったWEBGUIもみれるようになりました。わーい。
よかったですね。