نظرة عامة على أمان برنامج معالج S905X (التمهيد الآمن)

ستناقش هذه المقالة حماية البرامج على معالج S905X. الهدف النهائي هو إطلاق برنامج غير مصرح به.

S905X


معالج S905X هو ARM Cortex-A53 بتردد ساعة يصل إلى 1.5 جيجاهرتز ، محشو بجميع أنواع أجهزة فك التشفير لدفق الفيديو والصوت ، مثل H.265 4K ، VP9 ، يدعم 4KUHD ، إلخ. بشكل عام ، ليس خيارًا سيئًا. على عكس سابقتها ، قامت AMLogic بدمج ما يسمى "نظام أمان TrustZone المتقدم" في هذا المعالج ، والذي يتحكم في جميع عمليات النظام الهامة ، مثل الوصول إلى المناطق المحمية من ذاكرة ROM ، والتحقق من التوقيع وفك تشفير البرامج ، إلخ. يمكن العثور على وثائق مفصلة حول هذا الموضوع على موقع الشركة المصنعة . يعمل SecureOS كـ ATOS-V1.5-g3e467d9 (لن أؤكد ، لم أتحقق).

تدريب


بعد تفكيك البادئة ، وجدت بسهولة دبابيس RxD و TxD و GND لـ UART. على الجانب الخلفي كان هناك موصل لزر إعادة الضبط (لم يتم التحقق) ومكان للموصل. استنادًا إلى الموقع ، بدا الموصل وكأنه لوحة على اللوحة لبطاقة eMMS بديلة (pinout غائب بشكل طبيعي).



وثائق الدخول المجاني لـ S905 مثل هذه الموضوعات الهامة مثل ، على سبيل المثال ، لم يتطرق تسلسل التمهيد إلى حد كبير أو أقل وكان عمليًا عديم الفائدة من وجهة نظر RE. عند وضع الوثائق جانبًا ، قمت بتوصيل UART و ... تفاجأت بسرعات تحميل المعالج. ولكن هذا كل شيء على الأرجح. لم يتفاعل U-Boot على الإطلاق مع لوحة المفاتيح ، وبعد بعض إعدادات الأجهزة ، تم تحميل نواة Android وتشغيلها بذكاء.

سجل التمهيد U-Boot'a
 GXL:BL1:9ac50e:bb16dc;FEAT:BDFC31BC:0;POC:3;RCY:0;EMMC:0;READ:0;0.0;0.0;CHK:0;
TE: 351954

BL2 Built : 16:42:36, Nov  3 2016. 
gxl g3eddb43 - xiaobo.gu@droid05

set vcck to 1120 mv
set vddee to 1000 mv
Board ID = 4
CPU clk: 1200MHz
DQS-corr enabled
DDR scramble enabled
DDR3 chl: Rank0+1 @ 768MHz - FAIL
DDR3 chl: Rank0 @ 768MHz - PASS
Rank0: 1024MB(auto)-2T-11
DataBus test pass!
AddrBus test pass!
-s
Load fip header from eMMC, src: 0x0000c200, des: 0x01400000, size: 0x00004000
aml log : R2048 check pass!
New fip structure!
Load bl30 from eMMC, src: 0x00010200, des: 0x01700000, size: 0x0000d600
aml log : R2048 check pass!
Load bl31 from eMMC, src: 0x00020200, des: 0x01700000, size: 0x00015400
aml log : R2048 check pass!
Load bl32 from eMMC, src: 0x00038200, des: 0x01700000, size: 0x00035a00
aml log : R2048 check pass!
Load bl33 from eMMC, src: 0x00070200, des: 0x01700000, size: 0x000aa200
aml log : R2048 check pass!
NOTICE:  BL3-1: v1.0(debug):fb68908
NOTICE:  BL3-1: Built : 18:30:11, Nov  1 2016
aml log : bl31 detect secure boot !
[Image: gxl_v1.1.3154-065f772 2016-09-29 14:08:54 yan.wang@droid05]

OPS=0x84

bc fc af 5f a2 b4 4d 4b 1c 91 59 9f [1.280536 Inits done]

secure task start!
high task start!
low task start!
INFO:    BL3-1: Initializing runtime services
INFO:    BL3-1: Initializing BL3-2
INFO:    BL3-2: ATOS-V1.5-g3e467d9 #1 Mon Aug 22 17:11:43 CST 2016 arm
INFO:    BL3-2: chip version = RevC (21:C - 0:0)
INFO:    BL3-2: crypto engine DMA
INFO:    BL3-2: secure time TEE
INFO:    BL3-1: Preparing for EL3 exit to normal world
INFO:    BL3-1: Next image address = 0x1000000
INFO:    BL3-1: Next image spsr = 0x3c9


U-Boot 2015.01 (Nov 23 2018 - 15:50:35)

DRAM:  1 GiB
Relocation Offset is: 36ec8000
register usb cfg[0][1] = 0000000037f5e258
[CANVAS]canvas init
vpu: error: vpu: check dts: FDT_ERR_BADMAGIC, load default parameters
vpu: clk_level = 7
vpu: set clk: 666667000Hz, readback: 666660000Hz(0x300)
vpp: vpp_init
boot_device_flag : 1
Nand PHY Ver:1.01.001.0006 (c) 2013 Amlogic Inc.
init bus_cycle=6, bus_timing=7, system=5.0ns
reset failed
get_chip_type and ret:fffffffe
get_chip_type and ret:fffffffe
chip detect failed and ret:fffffffe
nandphy_init failed and ret=0xfffffff1
MMC:   aml_priv->desc_buf = 0x0000000033ec86b0
aml_priv->desc_buf = 0x0000000033eca9d0
SDIO Port B: 0, SDIO Port C: 1
emmc/sd response timeout, cmd8, status=0x1ff2800
emmc/sd response timeout, cmd55, status=0x1ff2800
[mmc_startup] mmc refix success
[mmc_init] mmc init success
mmc read lba=0x14000, blocks=0x400
      Amlogic multi-dtb tool
      Multi dtb detected
      Multi dtb tool version: v2 .
      Support 2 dtbs.
        aml_dt soc: gxl platform: sx6b6x variant: 1g
        dtb 0 soc: gxl   plat: sx6b6x   vari: 1g
        dtb 1 soc: gxl   plat: sx6b6x   vari: 2g
      Find match dtb: 0
start dts,buffer=0000000033ecd270,dt_addr=0000000033ecda70
parts: 11
00:      logo	0000000002000000 1
01:  recovery	0000000002000000 1
02:       rsv	0000000000800000 1
03:       tee	0000000000800000 1
04:     crypt	0000000002000000 1
05:      misc	0000000002000000 1
06: instaboot	0000000020000000 1
07:      boot	0000000002000000 1
08:    system	0000000050000000 1
09:     cache	0000000040000000 2
10:      data	ffffffffffffffff 4
get_dtb_struct: Get emmc dtb OK!
overide_emmc_partition_table: overide cache 
[mmc_get_partition_table] skip partition cache.
Partition table get from SPL is : 
        name                        offset              size              flag
===================================================================================
   0: bootloader                         0            400000                  0
   1: reserved                     2400000           4000000                  0
   2: cache                        6c00000          40000000                  2
   3: env                         47400000            800000                  0
   4: logo                        48400000           2000000                  1
   5: recovery                    4ac00000           2000000                  1
   6: rsv                         4d400000            800000                  1
   7: tee                         4e400000            800000                  1
   8: crypt                       4f400000           2000000                  1
   9: misc                        51c00000           2000000                  1
  10: instaboot                   54400000          20000000                  1
  11: boot                        74c00000           2000000                  1
  12: system                      77400000          50000000                  1
  13: data                        c7c00000         10a400000                  4
mmc read lba=0x12000, blocks=0x2
mmc read lba=0x12002, blocks=0x2
mmc_read_partition_tbl: mmc read partition OK!
eMMC/TSD partition table have been checked OK!
mmc env offset: 0x47400000 
WARNING: 'recovery_from_sdcard' neither in running nor in imported env!
WARNING: 'recovery_from_udisk' neither in running nor in imported env!
In:    serial
Out:   serial
Err:   serial
hpd_state=0
cvbs performance type = 6, table = 0
[store]To run cmd[emmc dtb_read 0x1000000 0x40000]
read emmc dtb
      Amlogic multi-dtb tool
      Multi dtb detected
      Multi dtb tool version: v2 .
      Support 2 dtbs.
        aml_dt soc: gxl platform: sx6b6x variant: 1g
        dtb 0 soc: gxl   plat: sx6b6x   vari: 1g
        dtb 1 soc: gxl   plat: sx6b6x   vari: 2g
      Find match dtb: 0
Net:   dwmac.c9410000
wipe_data=successful
wipe_cache=successful
upgrade_step=2
[OSD]load fb addr from dts
[OSD]failed to get fb addr for logo
[OSD]use default fb_addr parameters
[OSD]fb_addr for logo: 0x3d800000
[OSD]load fb addr from dts
[OSD]failed to get fb addr for logo
[OSD]use default fb_addr parameters
[OSD]fb_addr for logo: 0x3d800000
[CANVAS]addr=0x3d800000 width=3840, height=2160
amlkey_init() enter!
[EFUSE_MSG]keynum is 4
[BL31]: tee size: 0
[KM]Error:f[key_manage_query_size]L507:key[deviceid] not programed yet
gpio: pin GPIOAO_2 (gpio 102) value is 1
get_cpu_id flag_12bit=1
SARADC channel(0) is 0x3e1.
SARADC closed.
Hit Enter or space or Ctrl+C key to stop autoboot -- :  0 
[imgread]szTimeStamp[2019121002280214]
[imgread]secureKernelImgSz=0x977000
aml log : R2048 check pass!
aml log : R2048 check pass!
aml log : R2048 check pass!
ee_gate_off ...
## Booting Android Image at 0x01080000 ...
reloc_addr =33f4d440
copy done
      Amlogic multi-dtb tool
      Single dtb detected
load dtb from 0x1000000 ......
   Uncompressing Kernel Image ... OK
   kernel loaded at 0x01080000, end = 0x02258fd0
   Loading Ramdisk to 33d12000, end 33eb6000 ... OK
   Loading Device Tree to 000000001fff3000, end 000000001ffff8f4 ... OK
signature: 
fdt_instaboot: no instaboot image

Starting kernel ...


من الجدير بالذكر أن U-Boot (bl33) نفسه كان يعمل بالفعل في بيئة "العالم العادي" (BL3-1 بدّل الوضع مباشرة قبل نقل التحكم إليه). أولئك. حتى إذا سيطرنا بطريقة ما على U-Boot ، فلن يكون لدينا سوى وصول محدود إلى النظام. من حيث المبدأ ، هذا ليس مهما جدا. بعد كل شيء ، حتى إذا قمت بإزالة تفريغ ROM ، اسحب مفاتيح AES وفتح RSA من المصهر ، فلن يكون هناك أي معنى كبير من هذا ، لأنه لا يوجد مفتاح RSA الخاص حتى الآن.

لم يقرأ U-Boot نفسه أي مفاتيح. قام بتحميل النواة في الذاكرة ودعا مراقب الأمن لفك شفرة الشفرة والتحقق منها. قام مونيتور مونيتور بكل ما هو ضروري وأخبر U-Boot بتحميل النواة أم لا. بشكل عام ، نهج جاد لحماية البرامج مع نظام التشغيل الموثوق به الخاص به ونوع من الوظائف مثل BIOS.

خطتي الأخرى كانت الوصول إلى ذاكرة eMMC.

eMMC


للاتصال بـ eMMC ، كان من الضروري العثور على الأقل على دبابيس DAT_0 و CLK و CMD و GND. وتعرف أيضًا على الجهد الذي تعمل به وحدة تحكم eMMC (1V8 أو 3V3). كان من المستحيل القيام بذلك بصريًا ولمسارات التتبع قمت بسحب eMMC بنفسي. نظرًا لأن الشريحة كانت في يدي ، بعد تتبعها ، قمت بتوصيلها بالمحول وتفريغها بالكامل. لسوء الحظ ، لم يكن لدي معدات مهنية واستخدمت مواد مرتجلة لهذا الغرض. والنتيجة هي "حشرة ميتة".


حسنًا ، في الواقع ، دبوس الموصل:



بعد الانتهاء من عملية التثبيت ، نظرت إلى كيفية عمل المعالج بدون eMMC. إذا حكمنا من خلال السجل ، حاول ROM بعد محاولة غير ناجحة للتمهيد من eMMC تحميل الرمز من بطاقة mSD. كان هذا مشجعا. قمت بسرعة بتحميل التفريغ على بطاقة mSD وتشغيل وحدة التحكم. كانت مفاجأة صغيرة في انتظاري هنا. قام ROM بتنزيل كود BL2 من البطاقة ونقل التحكم إليه (وهذا يعني أن قسم "التمهيد" على eMMC لم يكن متورطًا وليس هناك حاجة للوصول إلى الجذر). حسنًا ، عندما جاء الدور إلى U-Boot ، اشتكى بضع مرات من عدم وجود eMMC (dev 1) ولمدة طويلة دون التفكير في توقفه في المحطة.

cmd store failed 
Err imgread(L132):Fail to read 0x100000B from part[recovery] at offset 0
gxl_sx6b6x_768_v2#version


U-Boot 2015.01 (Nov 23 2018 - 15:50:35)
aarch64-none-elf-gcc (crosstool-NG linaro-1.13.1-4.8-2013.11 - Linaro GCC 2013.10) 4.8.3 20131111 (prerelease)
GNU ld (crosstool-NG linaro-1.13.1-4.8-2013.11 - Linaro GCC 2013.10) 2.23.2.20130610 Linaro 2013.10-4
gxl_sx6b6x_768_v2#

كبداية ، لم يكن الأمر سيئًا على الإطلاق. بعد بعض التجارب مع الجهاز ، أضفت المعلمة bootdelay = 5 إلى قسم "env" ، وحسبت المجموع الاختباري الجديد وحملت eMMC مرة أخرى. مع الخيار الجديد ، كنت آمل أن يتم إيقاف تشغيل U-Boot. لكن في الواقع ، كان كل شيء مختلفًا. يبدو أن U-Boot لم يكن مهتمًا بهذه المعلمة ولم تكن عملية التمهيد مختلفة عن تلك المعتادة. إنه لأمر محزن ، لأنه كان من الضروري بالنسبة لي إجراء محطة طرفية متصلة بـ eMMC لمزيد من الإجراءات. مع قليل من التفكير ، أغلقت DAT_0 على الأرض وأدخلت بطاقة mSD الخاصة بي. لا يمكن لـ ROM الآن تحميل رمز من eMMC وتحويله إلى mSD. بعد تحميل U-Boot بهذه الطريقة ، فتحت جهات الاتصال وسألت:

gxl_sx6b6x_768_v2#mmc dev 1

emmc/sd response timeout, cmd8, status=0x1ff2800
emmc/sd response timeout, cmd55, status=0x1ff2800
[mmc_startup] mmc refix success
[mmc_init] mmc init success
mmc read lba=0x14000, blocks=0x400
      Amlogic multi-dtb tool
      Multi dtb detected
      Multi dtb tool version: v2 .
      Support 2 dtbs.
        aml_dt soc: gxl platform: sx6b6x variant: 1g
        dtb 0 soc: gxl   plat: sx6b6x   vari: 1g
        dtb 1 soc: gxl   plat: sx6b6x   vari: 2g
      Find match dtb: 0
start dts,buffer=0000000033ee4050,dt_addr=0000000033ee4850
parts: 11
00:      logo	0000000002000000 1
01:  recovery	0000000002000000 1
02:       rsv	0000000000800000 1
03:       tee	0000000000800000 1
04:     crypt	0000000002000000 1
05:      misc	0000000002000000 1
06: instaboot	0000000020000000 1
07:      boot	0000000002000000 1
08:    system	0000000050000000 1
09:     cache	0000000040000000 2
10:      data	ffffffffffffffff 4
get_dtb_struct: Get emmc dtb OK!
overide_emmc_partition_table: overide cache 
[mmc_get_partition_table] skip partition cache.
Partition table get from SPL is : 
        name                        offset              size              flag
===================================================================================
   0: bootloader                         0            400000                  0
   1: reserved                     2400000           4000000                  0
   2: cache                        6c00000          40000000                  2
   3: env                         47400000            800000                  0
   4: logo                        48400000           2000000                  1
   5: recovery                    4ac00000           2000000                  1
   6: rsv                         4d400000            800000                  1
   7: tee                         4e400000            800000                  1
   8: crypt                       4f400000           2000000                  1
   9: misc                        51c00000           2000000                  1
  10: instaboot                   54400000          20000000                  1
  11: boot                        74c00000           2000000                  1
  12: system                      77400000          50000000                  1
  13: data                        c7c00000         10a400000                  4
mmc read lba=0x12000, blocks=0x2
mmc read lba=0x12002, blocks=0x2
mmc_read_partition_tbl: mmc read partition OK!
eMMC/TSD partition table have been checked OK!
switch to partitions #0, OK
mmc1(part 0) is current device
gxl_sx6b6x_768_v2#

لم يقاوم U-Boot وانتقل بسعادة إلى eMMC. نظرت ، بالطبع ، ما كان في معلمة bootdelay. وبدلاً من الخمسة ، رأيت 0. هناك مرة أخرى ، يبدو أن U-Boot في وقت ما كتب 0 هناك ، في حالة تغيير شخص ما شيئًا هناك فجأة. لكنه لم يعد يهمني بعد الآن وتم إغلاق الموضوع مع eMMC.

ملاحظة: عند وجود موصل ، يمكنك الاتصال بـ eMMC دون لحام الشريحة. للقيام بذلك ، تحتاج إلى محول خاص مع محول الجهد ، لأن تعمل وحدة تحكم eMMC على 1V8 وإذا قمت بتوصيل محول SD عادي بـ 3V3 ، فهناك خطر حرق المكونات الموجودة على ناقل 1V8.

سيكون من الضروري أيضًا إزالة هذا المقاوم ، وإلا سيتداخل المعالج مع المحول.


مكونات مفقودة


من خلال الوصول الكامل إلى محطة U-Boot ، كان علي القيام بأمرين: الوصول إلى جهاز فك التشفير DeviceTree وإقناع U-Boot بالتخلي عن خدمات مراقبة الأمان المتعلقة بالتحقق من kernel. بالنسبة إلى الإطلاق الأول ، سيكون من الجميل أن يكون لديك النواة الأصلية حتى لا تضيع الوقت في تصحيح أخطاء جديدة.

كان من السهل للغاية الحصول على DeviceTree. انا سألت:

gxl_sx6b6x_768_v2#emmc dtb_read 0x1000000 0x40000

read emmc dtb
gxl_sx6b6x_768_v2#

وكان في جيبي.

تطلب U-Boot تحليلاً مفصلاً. من السجل ، تبع ذلك أن U-Boot نفسه تم تحميله وفك تشفيره في البداية عند 0x1000000 ، وبعد ذلك نقل نفسه إلى 0x36ES8000 (إزاحة). لقد تركت U-Boot وحللتها في المؤسسة الدولية للتنمية.

بالطبع ، كنت مهتمًا بالمكان الذي تم فيه الوصول إلى مراقب الأمان من أمر bootm. هنا هو


المكان
X0 - AML_D_P_IMG_DECRYPT
X1 - nLoadAddr
X2 - GXB_IMG_SIZE
X3 - GXB_IMG_DEC_ALL

لإزالة ملف تفريغ kernel الأصلي ، كان عليك تحميله في الذاكرة من خلال وظيفة imgread وتعديل bootm بحيث يتم إصدار ذاكرة aml_sec_boot_check مباشرة من العنوان 0x1080000 إلى المحطة الطرفية (هذه بالتأكيد ليست الطريقة الوحيدة). للقيام بذلك ، كتبت قطعة من التعليمات البرمجية وقمت بتنزيلها في المكان الصحيح. إليك ما حدث (بالطبع ، لا يمكنني إعطاء سجل كامل):

gxl_sx6b6x_768_v2#imgread kernel boot

[imgread]szTimeStamp[2019121002280214]
[imgread]secureKernelImgSz=0x977000
gxl_sx6b6x_768_v2#bootm

aml log : R2048 check pass!
aml log : R2048 check pass!
aml log : R2048 check pass!

Ready for dumping kernel

41 4e 44 52 4f 49 44 21 20 d8 7b 20 20 20 08 01  | ANDROID!

بالإضافة إلى النواة ، حصلت أيضًا على ramdisk (يمكن أن يكون مفيدًا في حالة وجود أي برامج تشغيل أو برامج ثابتة مهمة ، على سبيل المثال ، لشبكة WiFi).

أنا لست Android بعد الآن


بالنسبة للإطلاق الأول لبرمجياتي ، قمت بعمل uImage من النواة الأصلية ، وبنيت جذوري على أساس Busybox واستخدمت dtb الخاص بي. لقد قمت بتحميل الأجزاء الثلاثة مباشرة من محرك أقراص USB وقمت بتشغيل الأمر "bootm" ، مما أدى إلى تعطيل فك التشفير والتحقق من الصورة من قبل.

gxl_sx6b6x_768_v2#usb start
(Re)start USB...
USB0:   USB3.0 XHCI init start
Register 2000140 NbrPorts 2
Starting the controller
USB XHCI 1.00
scanning bus 0 for devices... 2 USB Device(s) found
       scanning usb for storage devices... 1 Storage Device(s) found
gxl_sx6b6x_768_v2#mw.l 0x37ed240c 0xd2800000
gxl_sx6b6x_768_v2#fatload usb 0:1 0x1000000 dtb.img
reading dtb.img
40960 bytes read in 43 ms (929.7 KiB/s)
gxl_sx6b6x_768_v2#fatload usb 0:1 0x2000000 uImage
reading uImage
8116288 bytes read in 4197 ms (1.8 MiB/s)
gxl_sx6b6x_768_v2#fatload usb 0:1 0x3000000 rootfs.img.uboot
reading rootfs.img.uboot
1041462 bytes read in 563 ms (1.8 MiB/s)
gxl_sx6b6x_768_v2#bootm 0x2000000 0x3000000 0x1000000

ee_gate_off ...
## Booting kernel from Legacy Image at 02000000 ...
   Image Name:   S905X Original
   Image Type:   AArch64 Linux Kernel Image (gzip compressed)
   Data Size:    8116224 Bytes = 7.7 MiB
   Load Address: 01080000
   Entry Point:  01080000
   Verifying Checksum ... OK
## Loading init Ramdisk from Legacy Image at 03000000 ...
   Image Name:   Root Filesystem
   Image Type:   AArch64 Linux RAMDisk Image (gzip compressed)
   Data Size:    1041398 Bytes = 1017 KiB
   Load Address: 033d1200
   Entry Point:  033d1200
   Verifying Checksum ... OK
      Amlogic multi-dtb tool
      Single dtb detected
load dtb from 0x1000000 ......
## Flattened Device Tree blob at 01000000
   Booting using the fdt blob at 0x1000000
   Uncompressing Kernel Image ... OK
   kernel loaded at 0x01080000, end = 0x02258fd0
   Loading Ramdisk to 33db8000, end 33eb63f6 ... OK
   Loading Device Tree to 000000001fff3000, end 000000001ffff8f4 ... OK
fdt_instaboot: no instaboot image

Starting kernel ...

uboot time: 136710682 us
[    0.000000@0] Initializing cgroup subsys cpu
[    0.000000@0] Initializing cgroup subsys cpuacct
[    0.000000@0] Linux version 3.14.29 (build@build2) (gcc version 4.9.2 20140904 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.09 - Linaro GCC 4.9-2014.09) ) #1 SMP PREEMPT Thu Sep 12 21:24:53 MSK 2019
[    0.000000@0] CPU: AArch64 Processor [410fd034] revision 4

[    6.302659@2] meson_uart c81004c0.serial: ttyS0 use xtal(8M) 24000000 change 115200 to 115200
# cat /proc/cpuinfo
Processor	: AArch64 Processor rev 4 (aarch64)
processor	: 0
processor	: 1
processor	: 2
processor	: 3
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32 wp half thumb fastmult vfp edsp neon vfpv3 tlsi vfpv4 idiva idivt 
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd03
CPU revision	: 4

Hardware	: Amlogic
Serial		: 210c84009f59911c4b4db4a25faffcbc
#

الهروب من السجن


نظرًا لحقيقة أن U-Boot تم تحصينه من تغيير معلمات env (وهذا لا يتعلق فقط بـ "bootdelay") ، كان من المستحيل التأثير على عملية التمهيد من خلال env ، ومن أجل تحميل برامجه ، يجب توصيل البادئة بالكمبيوتر. هذا الخيار لم يناسبني على الإطلاق. بعد تحليل سلسلة التحميل بأكملها ، لفت انتباهي هذا الأمر:

init_display=osd open;osd clear;imgread pic logo bootup $loadaddr;bmp display $bootup_offset;bmp scale

خاصه:

imgread pic logo bootup $loadaddr

حيث كان U-Boot يقوم بتحميل مورد "تمهيد" معين على العنوان loadaddr = 0x1080000. تم وصف المورد نفسه بواسطة هذا الهيكل:

struct resource_header{
	unsigned int 	magic;		/* Image Header Magic Number	*/
	unsigned int 	hcrc;		/* Image Header CRC Checksum	*/
	unsigned int	size;		/* Image Data Size		*/
	unsigned int	start;		/* item data offset in the image*/
	unsigned int	end;		/* Entry Point Address		*/
	unsigned int	next;		/* Next item head offset in the image*/
	unsigned int	dcrc;		/* Image Data CRC Checksum	*/
	unsigned char	index;		/* Operating System		*/
	unsigned char	nums;		/* CPU architecture		*/
	unsigned char   type;		/* Image Type			*/
	unsigned char 	comp;		/* Compression Type		*/
	char 	name[32];		/* Image Name			*/
}

بالطبع ، كانت معلمات "الحجم" و "البدء" مثيرة للاهتمام. انطلاقا منها وأيضا المعلمة "loadaddr" ، حل U-Boot ثلاث معلمات جديدة للقراءة المباشرة من eMMC. من الناحية المثالية ، بالطبع ، قام بتنزيل صورة من قسم "الشعار" في 0x000B00C0 في الذاكرة عند 0x1130000 ... أعتقد أن مسار أفكاري واضح الآن. حللت المعلمات الجديدة "الحجم" و "ابدأ" وكتبت الكود الخاص بي ، والذي تم حفظه على eMMC. بعد مثل هذه التلاعبات ، لم يعد U-Boot يقرأ صورة ، بل كان استغلالًا ، اكتسب السيطرة على الفور. يتكون المآثر من عدة خطوط في المجمع.

LDR X21, printf
ADR X0, .message
BLR X21

LDR X21, run_command
ADR X0, .command
MOV X1,#0x0
BLR X21

.align 4
printf: .quad 0x37EE50A0
.align 4
run_command: .quad 0x37EE9BA0

.align 4
.message: .string "\nJailbreaking BL3-3...\n"
.align 4
.command: .string "fatload mmc 0:1 0x1000000 uboot.bin; go 0x1000000"


قرأ uboot.bin من القسم الأول من بطاقة mSD ونقل التحكم إليه (كان uboot.bin عبارة عن U-Boot غير مشفر تم جمعه حديثًا. بالطبع ، كان من الممكن استخدام واحد معدّل أصلي). اتضح أن عملية التمهيد عادت إلى المكان الذي فك فيه BL3-1 تشفير U-Boot الأصلي ونقل التحكم إليه. هذه المرة فقط ، كان الرمز غير الموقع قيد التشغيل بالفعل. والآن يبدو التنزيل من eMMS مثل هذا (الجزء الأخير):

Hit Enter or space or Ctrl+C key to stop autoboot -- :  0

Jailbreaking BL3-3...
card in
[mmc_init] mmc init success
reading uboot.bin
408579 bytes read in 28 ms (13.9 MiB/s)
## Starting application at 0x01000000 ...


U-Boot 2017.11-02414-g9b5924abf2-dirty (Mar 01 2020 - 22:17:58 +0100) p212

DRAM:  1 GiB
MMC:   mmc@72000: 0, mmc@74000: 1
reading uboot.env
In:    serial@4c0
Out:   serial@4c0
Err:   serial@4c0
[BL31]: tee size: 0
[BL31]: tee size: 0
Net:   
Warning: ethernet@c9410000 (eth0) using random MAC address - 22:10:89:5b:74:85
eth0: ethernet@c9410000
Hit any key to stop autoboot:  2 0
=> version
U-Boot 2017.11-02414-g9b5924abf2-dirty (Mar 01 2020 - 22:17:58 +0100) p212

aarch64-elf-gcc (Linaro GCC 7.2-2017.11) 7.2.1 20171011
GNU ld (Linaro_Binutils-2017.11) 2.28.2.20170706
=> 

استنتاج


لكي لا تكمن البادئة على الرف ، قررت أن أضع LibreElec عليها. تم إطلاق الصورة المجمعة حديثًا على الفور تقريبًا دون أي مشاكل. تم الانتهاء من النواة بملف صغير ، وتم تثبيت برامج تشغيل لشبكة WiFi ووحدة التحكم عن بعد ، وتم إعادة تشغيل وظيفة poweroff. وعمل كل شيء على ما يرام ، ولكن بعد ذلك تذكرت أن وحدة التحكم تدعم أيضًا البلوتوث ، والذي لا يعمل بشكل طبيعي في LibreElec. على الرغم من أنني لم أكن بحاجة إليها ، ما زلت قررت إعدادها لتكمل الصورة.
على متن الطائرة كانت رقاقة AP6255 من Ampak ، المسؤولة عن كل من WiFi و Bluetooth. تم توصيل UART Bluetooth بـ ttyS1 ، لكن الشريحة لم تستجب لأوامر HCI وتظاهر بأنها ميتة. علاوة على ذلك ، استجابت الشريحة ، كما هو متوقع ، إلى الفريق الأصلي.
وثائق هذه الشريحة رديئة للغاية وكل ما يمكن استخراجه من هناك pinout. بادئ ذي بدء ، راجعت قوة رقاقة ودبوس BT_WAKE. كل شيء طبيعي. بعد أن جربت السائق نفسه ومنفذ ttyS1 ، لم أحصل على أي نتيجة - كانت الشريحة صامتة كمحزبة وقمت بتوصيل جهاز راسم الذبذبات بها. قمت بفحص ومقارنة جميع إشارات UART الإلكترونية (RTS ، TXD ، RXD ، CTS). كل شيء طبيعي. بعد ذلك ، راجعت تسلسل إعادة الضبط ، والذي يتم التحكم فيه عبر rfkill (كانت هذه دبابيس BT_WAKE و BT_REGON). ولكن هنا كان كل شيء على ما يرام. ثم راجعت دبوس LPO ، حيث وفقًا للتوثيق ، يجب أن تدخل إشارة بتردد 32.768 كيلو هرتز ، ولكن حتى هنا رأيت إشارة على مرسمة الذبذبات. بشكل عام ، كان كل شيء في محله ، لكن الشريحة لم تعمل مع جوهري. بعد أن أمضيت يومين آخرين في تفكيك محرك UART الأصلي ، عدت إلى إشارة LPO وقياس تواترها.أظهرت النتيجة 26 كيلو هرتز. آه كيف.
كان برنامج تشغيل wifi_dt مسؤولاً عن هذه الإشارة ، والتي لم تولد التردد بشكل صحيح في قلبي. قمت بتفكيك برنامج التشغيل الأصلي واستلمت تهيئة إشارة pwm من هناك و ... ظهرت الشريحة في الحياة (وجدت لاحقًا نسخة من برنامج التشغيل هذا بالإشارة الصحيحة). وهكذا ، كانت الشريحة جاهزة لمزيد من الضبط ، ولكن لم يكن لدي أي فكرة عن كيفية وضعها في حالة تأهب ، لأن لم أجد أي برامج تشغيل / برامج ثابتة / وثائق لذلك. في Android الأصلي ، لم يكن هناك أي شيء في سجل kernel باستثناء rfkill عند العمل مع Bluetooth. هذا أمر مفهوم ، لأنه لم يكن هناك برنامج تشغيل kernel ، وتم الإطلاق على مستوى المستخدم. كان من الضروري الوصول بطريقة ما إلى سجل Android نفسه ، ولهذا السبب ، كان هناك حاجة إلى الوصول إلى الجهاز. للقيام بذلك ، في سذاجي ، أضفت الإعدادات الضرورية إلى قسم النظام وقمت بتشغيل ADB.ولكن مع هذا السيناريو ، لاحظ Android أن هناك خطأ ما ورفض البدء على الإطلاق ، في إشارة إلى بعض التلاعبات هناك ... حسنًا ، لا ، لا. لقد استعدت قسم النظام وأعدت عمل rootfs ببساطة عن طريق تضمين sh هناك. بعد الإطلاق اللاحق ، كان لدي وصول الجذر في المحطة.
هذه هي الطريقة التي تم بها تهيئة الشريحة.

5759  5781 I bt_hci_h4: hal_open
5759  5781 I bt_userial_vendor: userial vendor open: opening /dev/ttyS1
5759  5781 E bt_userial_vendor: userial vendor open success!!
5759  5781 I bt_userial_vendor: device fd = 52 open
5759  5781 I bt_hwcfg: bt vendor lib: set UART baud 2000000
5759  5781 I bt_hwcfg: FW prepatch file: /etc/bluetooth/4335/bcm4335_prepatch.hcd
5759  5781 I bt_hwcfg: bt vendor lib: loading prepatch /etc/bluetooth/4335/bcm4335_prepatch.hcd
5759  5781 D bt_hwcfg: Chipset BCM4335A0
5759  5781 D bt_hwcfg: Target name = [BCM4335A0]
5759  5781 I bt_hwcfg: FW patchfile: /etc/bluetooth/4335/bcm4335.hcd
5759  5781 I bt_hwcfg: bt vendor lib: set UART baud 115200
5759  5781 D bt_hwcfg: Settlement delay -- 200 ms
5759  5781 I bt_hwcfg: Setting fw settlement delay to 200 
5759  5781 I bt_hwcfg: bt vendor lib: set UART baud 2000000
5759  5781 I bt_hwcfg: Setting local bd addr to 22:22:99:F7:B6:BD
5759  5781 I bt_hwcfg: vendor lib fwcfg completed


كانت هذه المعلومات كافية لكتابة برنامج قام بنفس الشيء. كانت الخطوة الأخيرة هي إطلاق hciattach وتعرف LibreElec على البلوتوث بشكل صحيح. الآن تم تكوين الجهاز بالكامل. إذا كان أي شخص مهتمًا ، فهذه هي الصورة النهائية.

All Articles