honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

ATOM Cam2 解析

出荷直後にアレな感じのATOM Cam2ですが、赤外線関係以外は普通に使えるようですので、基板周りの解析をしていきたいと思います。

 

前回ATOM Camを解析した時は、FlashROMを引っぺがしてダンプしてしまう、という力技を使用しましたが、今回はその際に発見されていたテストモードを使用し、フラッシュメモリをダンプするというお手柔らかな方法でファイルシステムをダンプします。

 

テストモードの使用方法はこの辺を

qiita.com

実際に使用したダンプスクリプトはこんな感じ

gist.github.com

 

これをTest.rarに突っ込み、microSDカードに入れて起動させるとフラッシュのダンプが取得できます。

Image

取得したファイルをwslに持っていき、binwalk -eM で展開します.

 

rootfsはこんな感じ

f:id:honeylab:20210522000132p:plain

app領域

f:id:honeylab:20210522000215p:plain

f:id:honeylab:20210522000303p:plain

スタートアップスクリプトを見てみると

f:id:honeylab:20210522000349p:plain

どうやら、/configs/.debug_flag というファイルを置いておくと起動時にカメラアプリを起動しないようです。

あと、Unknown , Don't change! が不気味ですがw

 

/etc/shadow を見てみると、rootパスワードは初代と同じようです。
このパスワードを使用すると、シェルにログインできました。

 

f:id:honeylab:20210522000641p:plain

 

さて、ハードウェア的に気になるのは背面USBのデータ端子が接続されているか、と
USBモードがホストか、デバイスのどちらで動作しているか、ということです。

 

OTG電源供給ケーブルを接続し、試してみると…

なんとUSBメモリやUSB-LANなどが認識できました。
どうやらホストモードで動作しているようです。これは素晴らしい!
(公式には当然サポートされませんが)いろいろな機器をつないで遊ぶことができそうです。

 

 ところで、公式スペックではCPUは1.5GHzになってますが、起動時にLinuxからとれる値としては1.39GHz、って感じですね。これは初代と同じです。

[ 0.000000] CCLK:1392MHz L2CLK:696Mhz H0CLK:200MHz H2CLK:200Mhz PCLK:100Mhz

どっかでガバナ加速してるのか、実はこの値なのかはわかりません(性能にはあまり関係ないと思います)

サポートしているUSB関係のドライバは

[ 0.502930] usbcore: registered new interface driver zd1201
[ 0.508720] usbcore: registered new interface driver r8152
[ 0.514419] usbcore: registered new interface driver asix
[ 0.520084] usbcore: registered new interface driver usb-storage
[ 0.526388] usbcore: registered new interface driver usbserial
[ 0.532448] usbcore: registered new interface driver usb_ch34x
[ 0.538493] ch34x: USB to serial driver for USB to serial chip ch340, ch341, etc.
[ 0.546217] ch34x: V1.16 On 2020.12.23
[ 0.550108] usbcore: registered new interface driver ch37x
[ 0.555804] usbcore: registered new interface driver pl2303
[ 0.561574] usbserial: USB Serial support registered for pl2303
[ 0.596532] usbcore: registered new interface driver usbhid
[ 0.602278] usbhid: USB HID core driver

zd1201はとあるUSB無線LAN、r8152,asixはUSB-有線LAN、
あとはUSBストレージとUSBシリアルであるch340,ch341、

ch37xはどうもSPI、パラレル対応のUSB I/Oっぽいです。
あとpl2303とUSB HID。

これだけあれば、ちょっとした工作なら困らなそうです。

 

/usr/bin 以下にncなども含んだbusyboxへのアプレットシンボリックリンクがありますが、実際に入っているbusyboxは結構シュリンクされてるようですで、もう少し込み入った操作をしたいときにはbusyboxを改めて持ってきたほうがよさそうです。

BusyBox v1.22.1 (2017-11-13 08:56:53 CST) multi-call binary.
BusyBox is copyrighted by many authors between 1998-2012.
Licensed under GPLv2. See source distribution for detailed
copyright notices.

Usage: busybox [function [arguments]...]
or: busybox --list[-full]
or: busybox --install [-s] [DIR]
or: function [arguments]...

BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use and BusyBox
will act like whatever it was invoked as.

Currently defined functions:
arping, ash, awk, blkid, cat, chmod, chown, cp, cut, date, dd, depmod,
devmem, df, dhcprelay, diff, dirname, dmesg, dnsd, dnsdomainname, du,
dumpleases, echo, egrep, env, false, fdflush, fdformat, fdisk, fgrep,
find, flash_eraseall, flashcp, flock, free, freeramdisk, fsync, getopt,
getty, grep, groups, gunzip, gzip, halt, head, hostid, hostname, hush,
hwclock, id, ifconfig, init, insmod, kill, killall, killall5, klogd,
linux32, linux64, linuxrc, ln, logger, login, logread, ls, lsmod, lsof,
lsusb, makedevs, md5sum, mdev, mkdir, mkdosfs, mkfs.vfat, mknod,
mkswap, mktemp, modinfo, modprobe, mount, mountpoint, mv, netstat,
nslookup, pgrep, pidof, ping, pkill, pmap, poweroff, printf, ps,
pstree, pwd, readahead, readlink, reboot, rev, rm, rmdir, rmmod, route,
sed, seq, setarch, sh, sleep, sort, sum, swapoff, swapon, switch_root,
sync, sysctl, syslogd, tail, tar, telnetd, time, timeout, top, touch,
tr, true, tty, ttysize, udhcpc, udhcpd, umount, usleep, vi, vlock,
watch, watchdog, wc, wget, whois, xargs, zcat

さて、中身はこんな感じかな。

1と2の差はやっぱりイメージセンサの強化によるものがほとんどですので、ファームウェア自体はまぁだいたいATOM Cam初代と一緒ですw

なんか面白いものつながらないかなぁw

 

ATOM Cam2が届いた&赤外線問題の検証

 発売翌々日、クロネコヤマトにて到着しました。

翌日に到着した人はレターパックだったっぽいです。

 

早速ながら分解し、シリアルのログを見てみました。

gist.github.com

 

ぱっと見ですがまぁそんなに変わらず、注目のTest.tarを利用した裏機能もどうやら残っているように見えます。

f:id:honeylab:20210521042955p:plain

Test.tarが使えれば↓のような裏カスタマイズが可能です。

honeylab.hatenablog.jp

 

ログインプロンプトも出ますが、とりあえずrootパスワードは不明です。
前回の、なんだったっけ……?

Test.tarでFlashダンプツールを作って/etc/passwd見てみればいいかな?

 

で、本体解析がまだまだなんですが、赤外線機能の不具合によるスペシャルお代わりが発生しました。

www.atomtech.co.jp

なんともう一個もらえるらしいです。

中の人お疲れ様です…

 

で、その不具合の原因と、簡単に改善する方法がないかを検証してみました。

こちらの記事を参考に分解していきます。

js2y.com

赤外線LED基板と防水マウンタを取り出してみます。

f:id:honeylab:20210521043406p:plain

 

f:id:honeylab:20210521043549p:plain

f:id:honeylab:20210521043622p:plain

どうやらこの部品が「遮光性の低い材料を間違えて使用した」もののようです。

Image

別のATOM Camのナイトビジョンモードで撮影すると、赤外LEDの光がマウンタの足のほうまで透過して透けているのが見えると思います。

この光が映像に悪影響を及ぼしているものなのか、確認してみます。

赤外線LEDの左側2個だけにアルミテープを巻き、材料内への回り込みを減少させてみます。

f:id:honeylab:20210521043933p:plain

これで撮影した映像と、出荷時の状態で撮影した映像を比べてみると…

 

Image明らかに、左側の明るい光が減少しています。

このように、この材料内への赤外光の侵入を減らせば状況が改善するものと思われます。(って公式も言ってるでしょ…)

例えば、塗装するなどの方法で改善させることは可能かもしれませんが、一般的には再出荷を待って置き換えるのがよさそうです。

(っていうか、赤外線が必須の人が全員ではないので、その人にとっては完全にボーナスなのですがw)

 

尚、このような作業を行うには分解や改造が発生し、保証を受けられないばかりか防水性能の逸失や技適などの問題が絡んできますので、上記のような改造を進めるものではありません。

 

さて、ぼちぼちと本体側のhackの準備をしなきゃなぁ
まずはパスワードパスワード…

ゲーセンでお菓子取る奴のミニチュア「SWEET CAPSULE LAND 4」を魔改造する

hobby.watch.impress.co.jp

 

ゲーセンでおなじみのお菓子取る奴、namcoのSWEET LAND 4をミニチュア化した奴が発売されたとのこと。

ガチャの品数としては、中のターンテーブルが単色塗りつぶしか、景品が入った柄に入っているか、x筐体色3色で6種類らしいです。

この商品のポイント、なんと外側のギアを手で回すとターンテーブルが回る!

f:id:honeylab:20210515054123p:plain

Twitterで見かけて、これは改造しなければ←とその辺を見たものの見当たらず、
もうおっさんは疲れたのでメルでカリっとして送ってもらいました。

 

到着し、嫁に発見され、さっさと組みあげられてしまった(シール貼っちゃうと改造がめんどいんだってば…)ものがこちら

f:id:honeylab:20210515054356p:plain

(3色のうち2つ。この記事を書いた時にはすでに分解済みw)

 

うーん、いい出来。これを飾っておくだけなんてもったいない!!!

 

改造のネタ…まぁ当然ターンテーブルは回すよね。
クレーンのギミックは無理か…

あとは照明はいるかな

あと、あの謎のBGM、これが流せればミニチュアゲーセンオブジェクトとしては合格だろ、ということで早速魔改造していきます。

まずは手持ちの部品だけで作ることを目標にしたのでだいぶ無理がありますw

 

ターンテーブルを回すには当然モーターが要ります。
しかし、普通のモータでは当然入らず、かなり小さいものを探す必要があります。
また、モータが小さくても、十分減速させてやらないとターンテーブルの回転には使えません。

いろいろ探してみたところ、部品箱の奥からサーボモータを発見しました。

f:id:honeylab:20210515054502p:plain


しかし、普通のサーボモータは回転範囲が決まっていて連続回転はできません。
調べてみるとこのサーボモータ、内部のストッパーを殺してしまえば360度回転のできる減速ギアボックスになりそうだということがわかりました。

fukuno.jig.jp

 

というわけで、サーボモータ開封してバチバチと改造していきます。
上の記事の内容に加えて、ポテンショメータのストッパーも破壊します。

 

(…今気づいたけど、+80円で連続回転型が売ってるのね…)

 

サーボ本体の外装もゴリゴリと削っていきます。

が、入らん…

 

うーん、とりあえず試作一号を作ることを目標にして、ちょっとぐらいはみ出てもいいか!

ということにして、底もぶち抜き、内部にエポキシ接着剤で固定します。

 

f:id:honeylab:20210515055323p:plain



これでうまくいったら、もうちょっと小さいサーボでも探そう。

 

ターンテーブルに、適当にデザインして印刷したお菓子の柄を貼ります。

f:id:honeylab:20210515055144p:plain

ねじでサーボモータに取り付けます。

f:id:honeylab:20210515055452p:plain

 

うん、いい感じ。

しかし、1.5Vの電池で動かしてもちょっと早いな。
使い古した1Vぐらいの電池でちょうどいいぐらい。
適当にPWMしてもいいけど、なんか適当な抵抗で落としてもいい気がする。

 

続いてBGM再生機能。

内蔵MP3プレイヤーとかでもいいけど、それではちょっとつまらないので
Bluetoothモジュールを内蔵してみます。
これで、iPhoneなんかから好きな音楽を鳴らすことができます。

 

電池→5V昇圧DC/DC→BTモジュール→アンプ基板→スピーカと配線し、中に押し込みます。

f:id:honeylab:20210515055637p:plain

スピーカーは、超小型のやつを使ったためちょっと音圧が低いかな…
もうちょっと最適化できそう。

 

ターンテーブルを回転させてしまうため、クレーンギミックが自立しなくなるため、
ドームから吊る必要があります(簡単のため両面テープでくっつけています)

 

 

さて、ミュージックスタート

 

youtu.be

 

できたw

 

 

さてさて、あとは照明とか、電池をちゃんと内蔵するとか、をやりたいな。

改造用にはあと2台あるしなw

 

 

ATOM Cam2が発売されるらしい

k-tai.watch.impress.co.jp

 

例のWiFi防犯カメラ、「ATOM Cam」のニュースが出ると、桶が転がって弊ブログのPVが露骨に増えることが確認されたので、せっかくなので発売前観測をしてみます。

※この内容について公式に問い合わせられても、担当者が悩むだけなのでやめてあげましょう←

 

さて、先代ATOM Camはこちらの解析記事にあるように、Xiaomiなどから発売されているものがベースとなって、ハードウェア・ソフトウェア的な改良などを加えて、国内技適を取得したモデルであることが十分知られています。

honeylab.hatenablog.jp

 

ということで、無線モノのプレビューとして非常に有能な技適検索で調べてみます。

検索してみると、こちらの「211-210302」(令和3年4月19日認証)が該当するようです。
ATOM Camは型番AC1で、ATOM Cam2は型番AC2のようです。順当。

f:id:honeylab:20210513141533p:plain

添付資料を見てみます。
海外輸入ものだと、ここでババーンと基板写真が載っていたりするのですが…

 

ざんねん!外観写真とテストシートしかありませんでした

f:id:honeylab:20210513141759p:plain

とはいえ、配信されているニュースサイトの写真ではわかりにくい方向の写真もあるので気になる人は見てみてはいかがでしょうか。

 

メーカーサイトはこちら

 

www.atomtech.co.jp

 

 

あぁっ!!!これは糞記事だ!!!ひどい!!!そんな日もある!

 

ソースネクストの「ポケトーク(初代)」をAndroidとして自由に使う&電話として使うw

honeylab.hatenablog.jp

 

図らずも上記の記事の続きとなってしまいました。

前回の記事で、Androidベースの小型通訳機に興味を持ってしまったので、
似たようなソースネクストの「ポケトーク」を入手しました。

いろいろいじってみたところ、なんとこれは上記のVT300Lと同じSoCであるMT6850を使用していることがわかり、SP Flash Toolを使ってあっさりとAndroid化することができました。

(パーティションサイズが若干違うため、後述するscatterファイルが必要です)

 

 

f:id:honeylab:20210418012316p:plain

 

しかし、この機種はタッチパネルではないため、一つのAndroid端末として常用するには少々厳しい気がします。ディスプレイも丸型ですし。
カバーで隠れているだけで、中身は普通の液晶なので、小型ゲーム筐体に突っ込んでみたり、キオスク端末的に使用するならアリなのではないでしょうか。

Bluetoothが使えますので、キーボード、マウスを使用できるようにしておいたほうが便利だと思います。

 

今のところ、メルカリで3000円程度はしていますが、下がってきたら遊んでみるのもいいかと思います。

ハックの細かーいところまでは書きませんが、上記の記事の一部を本機のパラメータに変更するだけで可能ですので、その部分を記録しておきます。

ものによってはネットワークに接続後、最新ファームが降ってくる場合があります。

更新をかけてしまった場合は、systemパーティションが更新されてるっぽいので、下記改変を再度やる必要があります。

 

書き込みに必要なscatterファイル

pocketalk_scatter.txt · GitHub

上記に書いてありますが、system.binの吸い出し領域

linear_start_addr: 0xa800000
partition_size: 0xA0000000

 

改変するファイル:build.prop

改変する内容:以下の3行を追加

persist.service.adb.enable=1
persist.service.debuggable=1
persist.sys.usb.config=mtp,adb

この内容で書き換えると、電源投入+USBでadbが利用できるようになります。

(adb rootはダメでした。bootも書き換えれば行けると思いますが。)

 

尚、今のところSIMカード、通信機能の有効活用化はできていません。
もうちょっといじってみたいと思います。

 

電話の発信、データ通信ができましたw

うまくいかなかったのはどうやらdocomo SIMロックorバンドの問題だったっぽいです

 電話、なぜか発信しかできない…(かけると通話中になってしまう)

イオシスで売ってる翻訳機 VT300LをAndroid端末として自由に使えるようになった

honeylab.hatenablog.jp

 

あれやこれややった結果、最終的に成功しました!

いろいろ試行錯誤した結果をまとめておきたいのはやまやまですが、とりあえず得られた最終結果とその手法をまとめておきます。

 

これは作業ログのつもりのものであり、求める結果に対するマニュアルやガイドラインではありません。間違いがある可能性があります。
もし、間違いを見つけた場合、指摘を頂けると世界に対して役に立つ可能性があります

 

ここで使用する、「SP Flash Tool」やバイナリエディタVMなどを使用したext4ファイルシステムのマウントなどのやり方はあらかじめ知っているものとします。

jagadgetaholic.blogspot.com


そのぐらいの知識がないと、失敗したときに自己解決できいないかと思います。
どうしてもわからない場合はTwitterで聞いてください。
とはいえ、あくまでもこのやり方は各自の自己責任となります。

ので記事を修正していきたいと思います。


故障した場合、損害はおそらくこれを買った端末代、せいぜい2000円程度でしょうから、勉強代としてあきらめてください

この製品、手元に届いた時点で発売から結構立っていますので、本体を開封したらまず、十分に充電をしておいてください。電池枯れかけだとよくわからない動きをしたとき、失敗したのか充電切れかがわかりません。

1.内蔵Flashを吸い出す

 →解析には全領域を吸い出す必要がありますが、この目的を満たすためには実はそこまでやる必要はないです。

 SP Flash ToolのReadBack機能を使い、以下のような設定で、Android システムパーティションの領域のみ吸い出します。(USER領域、 0xa800000 から 長さ 0x009A800000)

ファイル名はsystem.binとでもしておきましょう(自由です)
このイメージを書き換えるので、元に戻せるようにバックアップを忘れずに。

 

f:id:honeylab:20210406100555p:plain

 

ツールの使い方は、ググれば似たようなやり方が出てくると思うのでそっちを参照してください。

(簡単に説明すると、翻訳機の電源OFF→USBケーブル外しておく→Readbackボタン
 →待ち状態になるのでUSBケーブルをつなぐ→デバイスマネージャーに Preloaderという仮想COMデバイスが現れる→それをFlash Toolsが見つける→Readbackされるという動きをします。慣れるまでわからん。)

(↓このPreloaderもデバイスのインストールがいるかも。)

f:id:honeylab:20210406140738p:plain

2.吸い出したイメージの状態を確認する。

 私の手元ではそういった機器はありませんが、もしかしたらパーティション情報が書き換わっている場合があります。
その場合、このやり方では失敗しますので念のため確認します。
HEX Workshopなど、大きめのファイルがダンプ表示できるものを使用し、先頭の部分を眺めてext4イメージであることを確認します。

 


もしくは、次の手順に進んでしまい、binwalkやfileコマンドを使用したり、ext4ファイルシステムとしてマウントできることを確認してしまってもいいでしょう。

f:id:honeylab:20210406101148p:plain

 

吸い出しがうまくいっていれば、0x470付近に"system"の文字列が見えると思います。
もし駄目なら教えてください。

 

ファイルサイズも確認します。2592079872バイト、であればOKです。

f:id:honeylab:20210406101546p:plain

 

3.Linux上に持っていき、マウントして buid.propを編集する

私はVMWare上のUbuntuで作業しましたが、例えばraspberry piなどをお持ちならUSBメモリにでも入れてそっちで作業したほうが早い人もいるでしょう。

f:id:honeylab:20210406102152p:plain

例として /tmp/systemに先ほどのファイルシステムをマウントしています。

ここで sudo nano /tmp/system/build.prop し、文末に以下の3行を追加します。

service.yuntian.win=1
service.yuntian.wintoo=1
ro.yuntian.kyt=1

これで、build.propに必要な情報が書き加えられました。

ちなみに上の1行目は adbd接続有効、2行目はadbd root権限、3行目はAPKのインストール許可です。

こうして出来上がった/tmp/systemをマウントしたsystem.bin を書き戻すことになります。

確実にumountして、出来上がったsystem.binをWindowsに持ってきます。

ここまでの作業、VMWareのファイル共有機能などを使うと便利です。

 

4.ファイルを書き戻す

さて、出来上がったファイルをSP Flash Toolを使って書き戻します。

ここで重要なのが、パーティション情報を記述したscatterファイルと呼ばれるものです。これを作るのに苦労したのです。

scatter_sayeasy.txt · GitHub

このファイルをダウンロードし、先ほどのsystem.binと同じディレクトリに置き、system.binは "20_system.bin"という名前にしてください。

f:id:honeylab:20210406133415p:plain

Flash Toolを起動し、Downloadタグ、scatter-loading fileでこのテキストファイルを指定します。

 f:id:honeylab:20210406133322p:plain

すると、同じディレクトリにある20_system.binを見つけてLocationに表示してくれます(確認してください)。
翻訳機の電源を切り、USBケーブルも抜き、Downloadボタンを押し、USBケーブルを接続してしばらく待つと、Download(更新)が始まります。

f:id:honeylab:20210406140820p:plain

↑書き込み中の状態です

更新が終わったらUSBケーブルを抜き、再度電源を入れます。
無事起動したでしょうか。私の環境では「Andoridを更新しています」といったメッセージが表示され、起動し…ますが、もともと入っていた翻訳アプリがエラーを出して起動しません…まぁ、これは使えたら便利でしょうが、それを使うならもう一個買っておけばいいかなぁ…直せたら直しますが…

たぶん、先ほど吸い出したsystem.binに書き戻したら動くんじゃないでしょうか。そのためのバックアップですし。

 

で、起動はしたものの、もともとのホームアプリであった翻訳アプリが落ちるし、設定画面も出せないので詰んでいるようにも見えます。
そこで、気づいた人は気づいたかもしれませんが、この時点でUSBを接続したPCからはAndroidバイスとして認識されています。

 

では、試してみましょう。

Windowsだと、もしかしたらドライバが足りないかもしれません。
その場合、Mediatek用のスマホのadb用ドライバを探してきて入れると認識できるかもしれません。
あと、adbも必要です。

f:id:honeylab:20210406135451p:plain

 

以前も書きましたが、この更新をするまでは、adbドライバが認識され、adb接続を行っても、デバイスから強制的に切断されてしまっていて使用できませんでした。

 
その辺がめんどくさい場合、得意な方はLinuxで作業したほうが便利かも。

こんどは接続できました。

f:id:honeylab:20210406141409p:plain

では、adbを使ってここからAndroidの設定画面を表示させます。

adb shell am start -a android.intent.action.MAIN -n com.android.settings/.Settings

このコマンド(すでにshellにいる場合は adb shellは省略)

 

f:id:honeylab:20210406141717p:plain

 

見慣れたホーム画面が現れました。

「ホーム」を選択し、Launcher3が入っていますのでホームアプリを変更します。

f:id:honeylab:20210406141832p:plain

 

f:id:honeylab:20210406142324p:plain


これで、起動時にホーム画面が無事表示されます。
言語設定も日本語にしておきましょう。

野良APKをインストール可能にします。

 

f:id:honeylab:20210406142007p:plain

APKのインストールに必要な /data/local/tmp の権限が正しくない可能性がありますので調整します。
これがうまくいってないと、APKのインストールに失敗します。

ここまでやると、APKPureからダウンロードしたアプリがインストールできるようになります。すごい!

 →まっさらな端末でも成功しました

 

あとは、もうこれで普通のAndroidです。6.0とちょっと古めですが、
適当なジャンクとして手に入る小型機としては十分新しく、遊べると思います。

 

なにかわからないことがあれば twitter @bakueikozoまでお気軽に。

イオシスで売ってる翻訳機 VT300LをAndroid端末として自由に使う、の前に

akiba-pc.watch.impress.co.jp

 

こんなものを見つけました。

機能などを考えると、LinuxないしAndroidが入っているような気がしましたので
早速、調べてみることにしました。

どうやら、国内代理店が輸入していて、技適があるようです。

総務省技適検索から型番を検索すると、内部の写真を見つけることができました。

 どうやら、結構遊べそうです。
イオシスの通販サイトを見てみましたが、この時点で見つけられませんでした。

そのため、メルカリを見てみていると、この機種の前の機種である「TW30A SpeakMe」というものを見つけました。どうやら同じ会社が関係しているようです。

…というか、どうやらTW30AとこのVT300L、基板が同じようです…

 

とりあえず、こいつを調達して、中身を解析してみることにしました。

というか、どうもこいつは去年、ツクモで大量入荷・特価販売されていたもののようです。

akiba-pc.watch.impress.co.jp

 

f:id:honeylab:20210320030532p:plain

 

到着して早速分解します。基板のシルクに親切にもTX、RXが書いてあるためUSBシリアル変換でPCに接続して起動します。

すると、想定通りLinuxAndroidが起動していることがわかりました。

 

 Androidが起動しているなら、adbでshellなどの操作ができることを期待してしまいます。
USBで接続すると、確かにADBインターフェイスが現れましたが…
接続しようとすると"closed"というメッセージが出て切断されてしまいます。
どういうこっちゃ。

ADBインターフェイスを使えるように

Image

とりあえず、シリアルコンソールから最低限の操作ができます。

この端末は「翻訳機」として売られていますので(というか、翻訳機としての性能はなかなかいい感じです。このまま使ったほうがいいいと思うんですが…)

Androidのホーム画面や設定画面を表示することができません。
しかし、シリアルコンソールからコマンドを入力することで、Androidの設定画面を表示することができました。

設定画面の中、ホームアプリの設定を出してみると、どうやら翻訳アプリがホームアプリとして設定されていましたが、なんと通常のホームアプリとして使用できる「Launcher3」が残されていました。

 これに切り替えると、普通のAndroidとしてのホーム画面が現れました!

まずはここまで、順調に来ているようです。

しかし、シリアルコンソールからの操作しかできないのでは本体のふたが閉められません。

なんとかadbで接続できるようにしてみたいです。

この翻訳機のCPUはMediaTekです。MediaTekスマートフォンでは、「SP FlashTool」というアプリを使用して、ファームウェアの書き換えなどができる環境があります。

このアプリを使用してシステムイメージを吸い出し、原因を探ってみることにしました。

 吸い出したシステムイメージを、起動中に表れていたパーティション情報と比較し、ファイルシステムとしてマウントしてみます。

 adbでPCから接続する際、Android側ではadbdというデーモンが動作しています。
このデーモンが何か特殊な操作をしていて、特定の手順でないと動作しないのではないか、と推測し、adbdを解析してみます。

 どうやら、ここに違いがあるようです。

この端末に内蔵されたadbdは、Android環境の環境変数の値によって挙動が切り替わるようになっていました。本来、この値はシステムに組み込まれていて変更しにくいものですが、本機はシリアルコンソールが有効になっているため、そこから書き換えてみました。

すると、見事にadbが接続でき、shellが利用できるようになりました。

しかし、この環境変数の書き換えは起動中の一時的なものなので、恒久的にするには起動ファイルシステムを書き換える必要がありそうです。

 さて、adbも動作するようになったら、あとは自由にAPKをインストールできれば普通のAndroid端末として使えるようになります。

 

しかし、… adb pm install を行っても、INSTALL_FAILED_INVALID_APK のエラーでインストールができません。
INVALID_APKというので、APKの中身をいろいろ確認してみますが問題なさそうです…

あれー???

いったい何が起きているのか詳細なログを探してみると、logcatの出力内にヒントがありました。

 isWhiteListApplicationかどうか、というチェックを行っているようです。
やはり専用端末、このように勝手にアプリをインストールされては困ります。
そのため、ホワイトリスト方式でAPKのインストールを撥ねているようです。

このメッセージでググってみましたが、他に実装されている例は見つかりません。
つまり、このベンダが独自にホワイトリストを実装していると思われました。

さて、ではこの部分をどうしようか。ホワイトリストを編集するのはブラックリストの編集より大変です。
これはハッカーの勘ですが、先ほどのadbdのように、何らかのフラグがシステム内に存在すると期待し、APKをインストールする部分を解析してみることにしました。

Androidのパッケージマネージャ「pm」を解析する

Androidのシステム解析はあまりやったことがありませんが、どうにかなるだろう、とソースコードファイルシステムを漁っていくと、どうやらpmコマンドは /frameworkディレクトリの下にjarファイルとしてインストールされていることがわかりました。
しかし、このjarファイルはほぼ空で、実態はその下、にodexファイル、として存在しているようでした。

f:id:honeylab:20210320033306p:plain

 

f:id:honeylab:20210320033428p:plain

odexファイルはELFフォーマットのバイナリです。

 

f:id:honeylab:20210320033541p:plain

 

…しかし、pmコマンドは実際にはAndroidコアのAPIを呼び出しているだけで、その実装はPackageManagerServiceというクラスに実装されていることがわかりました。

その部分はどこにあるかを調べてみると、実態は /framework/arm/boot.oat というバイナリに実装されているようです。
さて、これを解析することができるでしょうか。

boot.oatを解析する

forum.xda-developers.com

調べていくと、このページのやり方でoatファイルをデコンパイルできる、と書いてありました。
(「java -jar baksmali.jar -x -c boot.oat -d framework NAME.odex -o out」の部分ですが、この部分間違いがあり、-xではなく x が正解です)

その通りにやってみると…

おお!smaliファイルとやらがたくさん生成されました。

f:id:honeylab:20210320034404p:plain

まさに、今回求めているPackegeManagerServiceの逆コンパイル結果です。

検索していると、この部分でAPKのチェックを行っているようです。

 このjavaアセンブリコード、正確に読むのはめんどくさそうですが、明らかに怪しい「const-string/jumbo v4, "ro.yuntian.kyt"」という部分が見えます。

どうやら、このプロパティが怪しい、ということでシリアルコンソールからこの値を適当に、1 と設定してみました。

すると…

これまで絶対に成功しなかったAPKファイルのインストールが成功しました!!!

 しかし、そのあと二つ目がインストールできずに悩みます…
とりあえず再起動して、改めてプロパティを設定したら続けてインストールできました。

 

やはり、ファイルシステムを改変してプロパティを恒久化するのがよさそうです。

ここまで、VT300Lが届くまで、このTW30Aで解析していましたが、おそらくこれと同じ手法でVT300Lが解析できると思っています。

 

 

うまくいくかな?

それは次の記事で。