honeylab's blog

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

docomo dTV01 / unext-tv (HUAWEI M220)をroot化しようとしたけどうまくいっていない話

ハードオフで見つけてたので、勉強がてらいじっていました。

この2つ、基板が全く同じでソフトだけ違うもののようでした。

 

シリアル端子は出ていたけど、 bootloader中にも何のキー入力も受け付けず、
起動してからはconsoleはcloseされるようでシリアルからのアクセスはできませんでした。

 

シリアルから触れなくても、ビルド番号x7クリックで開発者モードにして、
ネットワーク経由でadbできるので大体のことはできるのですが、
あくまでも大体のことしかできないのです。

そのため、どうにかしてroot化できないかといろいろやっていたのですが、今のところできていないのでここまでの流れをメモしておきます。

 

シリアル接続~Linux起動まで

System startup

Reg Version:  v1.1.0
Reg Time:     2014/6/1619:25:50
Reg Name:     hi3719cdmo1b_hi3719cv100_ddr3_2gbyte_8bitx4_4layers_emmc.reg

Compressed-boot v1.0.0
Uncompress....................Ok


System startup

Reg Version:  v1.1.0
Reg Time:     2014/6/1619:25:50
Reg Name:     hi3719cdmo1b_hi3719cv100_ddr3_2gbyte_8bitx4_4layers_emmc.reg

Fastboot 3.3.0 (panli@ottm620-Tecal-RH2288-V2-12) (Jul 14 2015 - 23:34:35)

Fastboot:      Version 3.3.0
Build Date:    Jul 14 2015, 23:35:12
CPU:           Hi3719Cv100
Boot Media:    eMMC
DDR Size:      1GB

Checking DDR config ... OK
Check nand flash controller v610. found
Special NAND id table Version 1.36
Nand ID: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
No NAND device found!!!

Check spi flash controller v350. found
Can't find a valid spi flash chip.
Can't find a valid spi flash chip.

MMC/SD controller initialization.
MMC/SD Card:
    MID:         0x45
    Read Block:  512 Bytes
    Write Block: 512 Bytes
    Chip Size:   3776M Bytes (High Capacity)
    Name:        "SEM04"
    Chip Type:   MMC
    Version:     4.0
    Speed:       25000000Hz
    Bus Width:   8bit
    Boot Addr:   0 Bytes

Boot Env on eMMC
    Env Offset:          0x00100000
    Env Size:            0x00010000
    Env Range:           0x00010000


SDK Version: HiSTBAndroidV500R001C00CP0008_v2014120116

start led blink
ir_led_blink_proc start led blink
ir_led_blink_proc start led blink
ir_led_blink_proc start led blink
ir_led_blink_proc start led blink
ir_led_blink_proc start led blink
ir_led_blink_proc start led blink
ir_led_blink_proc start led blink
ir_led_blink_proc start led blink
ir_led_blink_proc start led blink
ir_led_blink_proc start led blink
mac:04:02:1f:19:ce:21
1 blocks read: OK

Reserve Memory
    Start Addr:          0x35FFF000
    Bound Addr:          0x3E1F000
    Free  Addr:          0x34E89000
    Alloc Block:  Addr        Size
                  0x34E89000       8192
                  0x34E8C000       3133440
                  0x3518A000       3686400
                  0x3550F000       1658880
                  0x356A5000       8294400
                  0x35E8F000       12288
                  0x35E93000       1048576
                  0x35F94000       212992
                  0x35FC9000       8192
                  0x35FCC000       204800

32768 blocks read: OK
## Starting Secure OS at 0x36000000 ...
## Secure OS Image:
   Header Size: 0x400 (1 KB)
   Kernel Load Addresss: 0x38001000
   Kernel Size: 0xadbd4 (694 KB)
   Task Number: 7
   Task Total Size: 0x141BF0 (1286 KB)
Loading Secure OS ...
================task_addr:0x36000000
uwSCR = 0x600001d3
Set all interrupts to be non-secure
gic_int_num:160
address:f8a01080,value:00000000
address:f8a01080,value:f800ffff
address:f8a01084,value:ffffffff
address:f8a01088,value:ffffffff
address:f8a0108c,value:ffffffff
address:f8a01090,value:ffffffff
GICC_PRIMASK primask 000000f8
GIC_ID_PHY_BASE value 00000000
GIC_IC_PHY_BASE value 00000000
SCU Init
CodeStart = 0x38001000, CodeEnd = 0x38276c00
map_section_entry 2 times l1_index:0x00000382
===map UART Shareable device start==== === === = !!!
===map UART Shareable device ==== === === = !!!
===map Timer Shareable device ==== addr[f8a81000] === === = !!!
===map GIC Shareable device ==== addr[0xFC000000] === === = !!!
===map TZPC Shareable device ==== addr[0xFCA00000] === === = !!!
===map L2 cache registers ==== addr[0xFC100000] === === = !!!
===map suspend registers 1 ==== addr[0xFCC00000] === === = !!!
===map suspend registers 2 ==== addr[0xFCD00000] === === = !!!
intRestore OK 3!
attension please : excute from osTaskInit!!!!!!
osMemSystemInit default pt done 0x00080000
attension please : osSysInit OK!!!!!!
attension please : osHwTmrInit OK!!!!!!
attension please : osSwiInit OK!!!!!!
attension please : osTskInit OK!!!!!!
attension please : osHuntInit OK!!!!!!
attension please : osMsgInit OK!!!!!!
attension please : osSemInit OK!!!!!!
System Security Config... OK!
map_section_entry 2 times l1_index:0x00000f8a
TrustZone enabled...  OK!
map_section_entry 2 times l1_index:0x00000f8a
map_section_entry 2 times l1_index:0x00000f8a
map_section_entry 2 times l1_index:0x00000f8c
map_section_entry 2 times l1_index:0x00000f8c
Create secure mem zone... OK!
Create non-secure mem zone... OK!
Init Cipher driver... OK!
<<<OTP DBG>>> OTP_DRV_ModInit 373: OTP init success!
attension please : before task_func OK!!!!!!
global_task_base=0x36200000
osTaskInit done
os initialization successfully
uwMMUCtrl = 0x00c5187f
have defined OS_STB_HiS40V200
RTOSck start to schedule date: 06-26 Change-Id: IB790
init_map_loader:TASK_ADDRESS=0x36400000 order=0x00000002
internal task[0] load success, task name:task_demo1
init_map_loader:TASK_ADDRESS=0x36800000 order=0x00000002
internal task[1] load success, task name:task_demo2
init_map_loader:TASK_ADDRESS=0x36300000 order=0x00000000
internal task[2] load success, task name:task_demo3
init_map_loader:TASK_ADDRESS=0x36c00000 order=0x00000001
internal task[3] load success, task name:dxwidevine
init_map_loader:TASK_ADDRESS=0x37000000 order=0x00000003
internal task[4] load success, task name:task_QA_TZService
init_map_loader:TASK_ADDRESS=0x37800000 order=0x00000002
internal task[5] load success, task name:task_dxhdcp2
Back to boot
## Succeed to load Secure OS
32768 blocks read: OK
## Booting kernel from Legacy Image at 01ffffc0 ...
   Image Name:   Linux-3.4.67_s40
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    7518304 Bytes = 7.2 MiB
   Load Address: 02000000
   Entry Point:  02000000
   Verifying Checksum ... OK
   XIP Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
===TrustedCore hisik3_init_cache started===
===TrustedCore l2x0_init ok===
<<<CIPHER INFO>>> Cipher_Init 166: Cipher init success!
<<<CIPHER INFO>>> HAL_Cipher_HDCPTxReadEnable 1227: tx_read = 1
<<<CIPHER INFO>>> Cipher_DeInit 173: Do nothing, cipher deinit success!
<<<OTP DBG>>> OTP_Init 395: Do nothing, OTP init success!
<<<CIPHER INFO>>> Cipher_Init 166: Cipher init success!
<<<OTP DBG>>> OTP_DeInit 403: Do nothing, OTP deinit success!
<<<CIPHER INFO>>> Cipher_DeInit 173: Do nothing, cipher deinit success!
<<<OTP DBG>>> OTP_Init 395: Do nothing, OTP init success!
<<<CIPHER INFO>>> Cipher_Init 166: Cipher init success!
<<<OTP DBG>>> OTP_DeInit 403: Do nothing, OTP deinit success!
<<<CIPHER INFO>>> Cipher_DeInit 173: Do nothing, cipher deinit success!

Kernelの起動メッセージは普通に出ていますが、その前のブートローダはARM系でよくあるu-bootではありません。
また、Kernelの前にどうやらTrusted Secure OSというようなものが起動しているようです。
この間、いろいろキーを打ち込んでみたけど反応がありませんでした。

adbから接続した状態では生パーティションの状態を取得することができません。
そのため、以前PSCなどの吸出しで用いたeMMC配線乗っ取り法で別PCからeMMCのデータを読み込んでみることにしました。

そうしたところ、eMMCの内容が参照できましたが、見たところRAWパーティションが鎮座しているだけでした。
いろいろ調べた結果、どうやらeMMC内に普通のパーティションを切っているのではなく、bootargsのパラメータでLinuxから認識されているようです。
blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),2M(reserve1),16M(trustedcore),4M(reserver2),16M(recovery),2M(deviceinfo),8M(baseparam),8M(pqparam),20M(logo),40M(fastplay),16M(kernel),4M(misc),512M(system),16M(drmsfs),512M(cust),256M(cache),-(userdata)

この値を参照して作成したのが以下のパーティションリストです。
1k offset offset(byte) size MB
0 fastboot 0 0 1
1 bootargs 1024 1048576 1
2 reserve1 2048 2097152 2  ( zero filled)
3 trustedcore 4096 4194304 16
4 reserve2 20480 20971520 4 ( zero filled)
5 recovery 24576 25165824 16
6 deviceinfo 40960 41943040 2
7 baseparam 43008 44040192 8
8 pqparam 51200 52428800 8 ( zero filled)
9 logo 59392 60817408 20
10 fastplay 79872 81788928 40
11 kernel 120832 123731968 16
12 misc 137216 140509184 4 ( zero filled)
13 system 141312 144703488 512
14 drmsfs 665600 681574400 16
15 cust 681984 698351616 256
16 cache 1206272 1235222528 256
17 userdata 1468416 1503657984 last

kernel内にはuImage形式のKernel (+cpio.gz initramfs)が入っていました。
ちょっと頑張ってcpio.gzの中身を書き換えて書き戻したところ、Kernelの読み込みメッセージが表示される前に、bootloaderからresetされてしまいました。
また、bootargsの中、bootcmd=mmc read 0 0x36000000 0x2000 0x8000; loadsos 0x36000000; mmc read 0 0x1FFFFC0 0x3B000 0x8000; bootm 0x1FFFFC0
の部分を潰してしまえばbootloaderのコンソールか何かに残れるのではないかと試してみましたが、
この部分がまったく参照されていないような動きをしました。(何を書いておいてもsosの読み込み、起動後に kernelが起動される)
しかし、このパーティションの先頭4バイトがチェックサムなのですが、それが合わないとやはりresetされます。
また、bootcmdを書き換えても動作は変わりませんでしたが、パーティションの識別文字列を書き換えたらやはりresetされました。
どうやら、なにか書き換え防止の仕組みがあるようです。

adbで入って
shell@android:/proc $ cat partitions
major minor #blocks name

179 0 3866624 mmcblk0
179 1 1024 mmcblk0p1
179 2 1024 mmcblk0p2
179 3 2048 mmcblk0p3
179 4 16384 mmcblk0p4
179 5 4096 mmcblk0p5
179 6 16384 mmcblk0p6
179 7 2048 mmcblk0p7
259 0 8192 mmcblk0p8
259 1 8192 mmcblk0p9
259 2 20480 mmcblk0p10
259 3 40960 mmcblk0p11
259 4 16384 mmcblk0p12
259 5 4096 mmcblk0p13
259 6 524288 mmcblk0p14
259 7 16384 mmcblk0p15
259 8 524288 mmcblk0p16
259 9 262144 mmcblk0p17
259 10 2398208 mmcblk0p18
179 16 2048 mmcblk0boot1
179 8 2048 mmcblk0boot0
これだと、eMMC->USBリーダ接続だと認識できないboot0とboot1が表示されますが、

shell@android:/proc $ cat /dev/block/mmcblk0boot0
/system/bin/sh: cat: /dev/block/mmcblk0boot0: Permission denied
この中身は表示できません。
そのため、BeagleBoneBlack等、生のMMC接続を持つ何らかの機器に接続してこのパーティションを覗いてみたいと思います。

まあ、root化したところでそんなに面白いことができるわけではないと思うんですが…