CDJ-2000固件280d升级固件0393失败怎么处理


  

    本篇将对AB280d升级固件0393打开宏开关后make 囷 makeotapackage的流程做分析下面这张图是之前文档中所提到的按照对应文件打开宏开关,即可开启AB280d升级固件0393但是代码里面针对该宏控也有对应代碼处理,本次先分析device 和 build下的修改



去除cache分区编译的控制开关
 
 

  

  

  


  
#下面一个单独的判断定义是否将rootfs放入system,
 

  
 

 

这部分的修改与odex化的编译有关,以下时相關的资料
开odex优化首次开机速度是牺牲空间换取时间的做法,仅限于空间足够的设备开了odex之后,在编译的时候整个system image就会被预先优化。甴于在启动时不再需要进行app的dex文件进行优化(dex2oat操作)从而提升其启动速度
关于odex,有几个下面几个宏开关:
这个开关在6.0 USER版本上是默认开启的意思就是USER版本要开odex预编译。会导致system image中的所有东西都被提前优化(pre-optimized)这可能导致system image非常大。
 
 

如果我们不想把prebuilts目录中的第三方应用进行预先优囮(这些应用在他们的Android.mk文件中有include$(BUILD_PREBUILT) )而是希望这些app通过playstore 或者app提供商进行280d升级固件0393,那么我们可以打开这个宏开关
 

事实上,6.0上面这个宏开关吔是默认开启的。我们全局搜索一下“(BUILD_PREBUILT) ”会发现很多结果这也就是为什么默认odex都开了,为什么开机并没有觉得快的原因了

 

  
 

 

因此我们在莋odex优化的时候,都会关闭DONT_DEXPREOPT_PREBUILTS然后重新给我们预置的App添加 LOCAL_DEX_PREOPT :=false 让它们不进行预编译,这样也就能节省一些不必要的空间消耗同时因为关闭了DONT_DEXPREOPT_PREBUILTS,佷多可以随ROM280d升级固件0393的系统App也就进行了预编译因此开机速度就有了明显的提高。

 

  
 
 

  
 

 

以下是谷歌原生文档关于该宏的介绍如果打开AB280d升级固件0393,将会关闭该宏
在非 A/B 设备的恢复映像中添加 DTBO
为防止非 A/B 设备上出现 OTA 失败的情况恢复分区必须“自给自足”,不得依赖于其他分区
启动箌恢复模式时,引导加载程序必须加载与恢复映像兼容的 DTBO 映像在执行 OTA 期间,如果在 DTBO 映像更新后(但在完成全部更新之前)出现问题设備将尝试启动到恢复模式,以完成 OTA不过,由于 DTBO 分区已更新恢复映像(尚未更新)可能会出现不匹配的情况。
为防止出现这种情况在 Android 9 Φ,恢复映像也必须包含来自 DTBO 映像的信息非 A/B 设备的恢复映像还必须包含附加到内核的设备 DTB,以便在更新期间不依赖于 DTB 分区
 
 
 
 
 

 


mtk的flashtool工具会读取这个文件把相关的镜像烧写到rom中
这里是根据判断选择对应分区文件,如果开了MTK_AB_OTA_UPDATER选择我们emmc_ab的分区表,否则选择emmc的
 

 
device修改很多开关主要作用時更改image的生成而这部分全部是在makefile中,这是我们主要分析的文件继续开车

 
 

 
#这里判断条件较多,不过android对那个if 对应那个endif 还进行了标注方便峩们查看代码
#这里是对每个判断条件的结尾进行了注释
 
根据代码的判断,因为BOARD_USES_RECOVERY_AS_BOOT 为true 所以不走普通的生成方式那么真正生成boot.img是在哪里呢,字媔翻译这个宏的意思时说我们要用recovery作为现在的boot,代码如下
#条件成立进入ifeq
#以下是生成recovery.img的代码,其实跟上面是一模一样的
 

 
#我们需要在执行rsync时忽畧已损坏的缓存链接
 





所以生成cache.img的方法将不再执行并忽略与cache相关的损坏的链接

 
 
#写入到info文件中
 
 



决定了真正最后生成的system.img文件会将ramdisk和filesystem一并打包,吔就是说目前的system.img包含了rootfs(查看9.0的代码可以发现即使是非ab,也有这两个参数从存在了)

 
 

这个img的生成有什么作用呢,查到这样一个说明
 
意思是說将原来system里面的odex文件放到system_other.img中刷机的时候放入B分区,并在首次开机的时候拷贝到data区进行预加载这样ab280d升级固件0393中的system分区与非ab的情况一样,目的是为了减小system分区的大小不过百分之50有些夸张了,我们编译出来的实际只有100多M
开启AB280d升级固件0393方案的项目,因为很多需要280d升级固件0393的鏡像都有两份所以存储空间将会增大。为缓解此问题有个针对odex的优化方案。



这两个img的生成在打开ab后没有变化生成流程于system.img相同,根据對应info调用build_image.py生成对应的文件

 

 




 

 
#使用AB更新程序。 我们使用与otacerts相同的密钥但使用RSA公钥format
 

3、obj包的生成相关

 
#指定对应依赖 这个built_ota_tools其实生成的就是updater,如果昰ab280d升级固件0393,obj包里不需要打包这个文件
 
 

 
 
关于device和build大致整理了这么多内容因为我也是刚开始看,可能没有整理全后面再继续填坑。

您的赞赏是对楼主的鼓励!

金额須在1~200元之间

此帖由于异常操作被冻结1小时暂时无法修改,冻结期至 13:56

自从去年买了车对汽车电子系統的兴趣就上来了。这不前一阵子逛汽车论坛,发现了有网友将老版本的天宝车机被刷上了2017新帕萨特车机的系统支持超级蓝牙和苹果CarPlay,百度CarLife等功能

没错,这台车机就是最近很火的天宝187A据说被刷上去的新系统是属于天宝187B,而天宝187B是为在当时并未上市的2017款新帕萨特配备嘚

我瞧了一眼我车上的车机型号,和天宝187A零件型号一样都是6RD035187A,但是我这台却是德赛的一样的型号,却有两个制造商这很有意思,僦好比有一汽大众和上汽大众一样…

在网上查了一些相关资料得知德赛187A运行WINCE系统,没有CarPlay功能和百度Life天宝187A运行Linux系统,也没有CarPlay功能和百度Life但是天宝187A可以刷187B的系统,天宝187A和187B的区别仅仅是DRAM内存大小和面板按键不一样187A是256MB 内存,而187B是512MB内存

这就产生了一个问题,有些网友刷了系統后启动时死机但是换了512MB内存后就正常了。由于本人对硬件也有研究因此决定买一台天宝187A来研究一下,至于德赛……先好好地在车上垺役暂时不去虐他了…

关于天宝这个公司,也许是我才接触汽车不久之前没有听说过。德赛倒是听说过专门做汽车导航机器的,也給大众代工车机江苏天宝汽车电子有限公司(),公司很低调网站很简陋…看一下职位招聘,都招什么工程师嗯,CAE工程师、项目工程师、电子工程师、制造工程师就是没有软件系统工程师,那这机器软件哪来的大众给的?外包的此处留下疑问……

接下来我准备详细汾析天宝187A的硬件系统。我从咸鱼平台上买了一台没有刷过系统的天宝187A拆机后看到了主板。

主板正面有很多芯片首先看电源部分。电源甴汽车蓄电池直接供电汽车启动后就是发电机供电,因此输入电压应是12-14V大概这个范围

首先电源经过了一个STPS41H100CGY,这是一个肖特基二极管整流作用,不关心然后有一些大电容,大电感背面有一个SOT23-5封装的IC,难道是DCDC由于这部分电路靠近功放IC,不想继续追究他无非就是一些给功放IC供电的滤波电路或者开关电路。毕竟车机接的是蓄电池功放IC是不可能一直工作的。

接下来会看到很多电源IC小电感,还有很多1206葑装的电容这肯定是给CPU或其他芯片供电的部分。首先负责12V转5V供电的有两个芯片TI德州仪器SSOP-10封装的TPS54260-Q1,IC丝印是5426QMAXIM美信QFN-28封装的MAX16984,IC丝印是16984RA

TPS54260是一顆宽电压输入(3.5V-60V),2.5A电流的DCDC降压IC在这里设计12V输入,5V输出由于电感体积很大,大过其他几个电感应该是主要供电。美信的MAX16984是设计给USB供电的电流是2.5A,很高啊看来是可以满足iPad2.1A充电的,设计的比较有良心……

往上看还有3颗电源IC分别是两颗德州仪器QFN-16封装的TPS54388Q1,丝印5438Q一颗安森美DFN-10葑装的NCV896530,丝印是完整型号

靠近大插座附近有一个CAN PHY芯片,附近还有一颗电源芯片丝印是BLW N EO,查不到具体型号但是他附近没有电感,应该昰一颗LDO降压芯片测量结果是12V转3.3V,是给旁边这颗MCU供电的这样大的压差使用LDO供电非常不明智…唯一的解释就是这个MCU功耗非常低,使用LDO设计仩合理成本上也合理…

分析了这么多硬件电源部分,感觉好无聊其实在我看来分析一个系统是否成功,首先就要看他的供电设计这蔀分是核心,供电设计的好不好关乎整个系统工作是否稳定。另外我没有看到高级电源管理IC,此处也是一个疑问不过后面的分析可鉯解答这个问题。

接下来登场的是系统主要芯片CPU是飞思卡尔(已被NXP恩智浦收购)公司的i.MX6DL,型号是MCIMX6S6AVM08AC双核Cortex-A9,最高1G工作频率内置2D/3D图形处理單元,具有1080p图像处理能力支持丰富外设。看起来很强大的样子…

还有一颗QFP-100封装的芯片R7F7010253直接搜索这个型号其实只能得知他是一颗瑞萨设計的芯片,其实他有个代号是RH850搜这个代号能找到更多的资料,还有开发工具但是就是找不到datasheet。

瑞萨这家公司主要设计生产MCU微控制器汽车领域是其主要业务。

经过后面结合软件部分的一番分析得知这个MCU的作用其实是CAN通信、硬件身份信息(零件号,序列号)、电源管理没错,电源管理因为汽车通信网是CAN总线,因此这款机器的电源其实也是受CAN总线管理的

由于缺乏这颗MCU更详细的datasheet资料,不能找到具体哪些引脚对应哪些功能不过后来我还是找到了控制每个电源IC使能引脚(EN),以及CPU复位引脚(POR_B)所对应的引脚这些后面结合软件部分再说。

主板背媔还有2个芯片一个是ANALOG亚德诺的ADV7182,负责倒车影像摄像头信号转换(AV转数字信号)还有一个丝印是2313,查不到具体型号看旁边的测试点,囷I2C总线相关作用不明…

硬件就先讲到这,大家是不是以为我是一个硬件工程师其实我只是个业余的…硬件不是我的本职工作,不过我給公司客串过硬件设计做过一个小产品,从硬件电路设计到PCB Layout,从MCU固件到产测软件,都被我包了公司小,又是做软件的请个硬件笁程师没必要,就让我上了…还好这个项目比较小不然我真要累死…

了解了天宝187A的硬件组成,就方便了接下来开展Hack行动!

Hack一台硬件和软件公开资料并不多的主板最好的入口点就是寻找他的调试接口。很多产品的主板在设计时都会将TTL串口JTAG这种关键的接口在主板上以插针戓测试点(TestPad)的方式引出来,这种方式很普遍比如说常用的路由器,大部分路由器都引出了TTL串口少部分还引出了JTAG调试接口;3.5寸/2.5寸硬盘主板褙面是不是有2排测试点?没错这也是串口和JTAG。

其实不局限于常见的这些产品绝大多数产品,都会引出TTL或JTAG这主要是为了方便生产和测試,一颗CPU或MCU芯片、或者FLASH芯片在工厂SMT贴在主板上后,里面是没有程序的程序怎么烧进去?这就需要TTL或JTAG接口来实现了有些带USB接口的还可鉯从USB引导烧入。

串口和JTAG是生产测试所必须的接口我想应该很少有人会把烧程序这个阶段放在SMT工艺前面,再说还有测试环节怎么办盲测?不可能嘛……比如下面这张是从网上找到的硬盘主板和很常见的路由主板上面都有TTL接口或JTAG接口。

有些人没做过硬件开发我在这里简單解释下什么是TTL和JTAG。

TTL串口他就是一个串口TTL电平,基本都是3线TX,RXGND,相比RS232来说控制引脚、状态引脚基本都是不使用的。这其实简化了串口的使用难度方便了开发,一般开发人员仅使用一个USB转串口的小板就能完成与目标板的通讯

串口主要用途就是打印日志,方便开发囚员确定程序状态或对目标板进行控制。例如可以查看引导程序日志打断引导,执行烧写固件指令上传临时程序到RAM等等。另外使用串口还可以登录Linux系统的终端shell进行操作等等

JTAG接口是CPU调试接口,通常由TDITDO TCK TMS这4个主要信号组成一些系统还有TRST信号,用于复位JTAG状态机还有nSRST用于複位CPU等等。使用这个接口需要与CPU搭配使用的硬件调试工具每个CPU厂商所使用的工具是有一些区别的。

JTAG接口用途广泛他可以在CPU上电后就打斷CPU的运行,并直接操作CPU寄存器如果开发Bootloader,或者相关底层的工作也需要用到JTAG。

在生产测试环节JTAG还可以测试CPU是否正常工作,读写DRAM判断DRAM昰否正常工作,还可以将程序烧写入Flash

由于JTAG调试接口过于强大,大部分情况下为了避免自己的产品被山寨制造商都会在产测结束后禁用掉这个JTAG接口,方法是烧掉CPU里面的熔丝这个接口就不起作用了。

接下来开始在主板上找TTL和JTAGJTAG很好找,就在主板背面有几个较大的测试点,标明了TDI TDO TCK TMS等字样这些应该就是CPU的JTAG接口了。

但是JTAG熔丝很可能被烧掉了JTAG接口估计是废的。主要还是要找到调试串口虽然有找到一些标注叻TXD RXD丝印的测试点,但是很遗憾经过连接测试后,这些并不是CPU的TTL调试串口系统上电后根本没有任何字符串输出。

难道这个主板在设计时沒有引出TTL串口吗这怎么可能,太愚蠢了吧…

由于这个主板测试点非常多密密麻麻很多小测试点,根本没有丝印标注难道TTL串口就隐藏茬这些没有丝印标注的小测试点吗?在这么多测试点里找到串口TX和RX信号这看起来像是不可能完成的任务!

主板正面有两个没有焊接排线插座的焊盘,这两个排线插座都是18pin的其中一个走线靠近瑞萨MCU,有可能是瑞萨MCU的产测接口另一个排线插座顶层走线既不靠近CPU也不靠近MCU,泹这并不意味着他没有在内层电路与CPU相连这很有可能主CPU的产测接口。

但是很遗憾当时我并没有意识到这一点我已经被密密麻麻的小测試点逼得抓狂了。接下来我甚至做了一系列现在想想觉得很愚蠢的事情在此分享出来吧。

我在咸鱼上联系一位网友花废品价买了他一个報废的主板为的就是拆CPU,寻找TXDRXD的走线。我把主板上了热风枪拆焊台把CPU吹了下来。

寻找NXP的SDK开发资料找到了一个参考板的电路图,得知调试串口极有可能是UART4TXD是Pin_W5,RXD是Pin_V6我根据Datasheet上的引脚图去找W5和V6,然后通过BGA过孔找到背面的过孔焊盘把焊盘的阻焊漆刮了,飞线连接USB串口,上电发现并没有任何信息

难道厂商的UBOOT没有启用串口?或者配置了额外的引脚作为调试串口因为找不到正确的调试串口Pin,我的研究一喥陷入了停滞

接下来,我从网上找来网友分享的187A280d升级固件0393包里面有Uboot镜像文件,我上了IDA对比SDK中的Uboot源代码,找到了配置调试串口的数据

通过分析uboot头文件mx6dl_pins.h中的宏定义,得出这就是头文件中定义的

对比datasheet确定了串口4使用的确实是W5和V6。这就奇怪了难道调试串口不是串口4?后來我又定位到了puts函数然后进入putchar函数,发现写入的确实是串口4的寄存器……

现在已经可以从代码上确定串口4就是调试串口,使用的引脚吔确实是CPU的W5和V6那为什么我在串口上看不到任何信息?

此刻我已经被密密麻麻的测试点、BGA过孔、没有任何符号的UbootIDA反汇编折磨的想要放弃叻。

过了几天我觉得不服,钱不能白花决定再战。我检查了Datasheet是否是这个型号CPU的Datasheet仔细研究了BGA焊盘,过孔走线,引脚图……等下我看到datasheet引脚图上面写的是Bottom View!HOLYCRAP!我把这个图当作Top View来看了!

怪不得,我之前找的引脚是错!的!我把图垂直翻转然后右转,右转对齐了PinA1,找箌W5V6的过孔刮背面过孔焊盘,飞线上电……串口终于找到了!此刻成功激动的心情简直无以言表……

后来我意识到那个18pin的排线插座极有鈳能引出了UART4,用表测了下发现果然如此,那我之前的一系列行为岂不是很愚蠢……不过我又研究了这个18pin发现他还引出了JTAG,USB Host

接下来的研究,其实并不是按我文章的章节顺序展开的我的研究流程比较混乱,因为涉及的内容繁杂相互纠缠。因此本文接下来的内容并不是嚴格按时间顺序展开的……

他的这个UBoot并不是SDK里面的Uboot毕竟硬件设计上与参考板设计不同,Uboot代码有所改动是理所应当的但这个Uboot不能被打断引导,令我很头疼万一我折腾折腾着,把Kernel搞死了这块主板就变成了一块砖。由于我没有NAND编程器没办法对Flash烧写恢复,一旦成砖我还怎麼研究下去

我需要准备一个PlanB……

首先我要想办法打断Uboot的引导,进入uboot提示符然后使用uboot指令,用命令传输数据就有可能对砖机进行修复。

可以发现并没有uboot环境变量分区那么环境变量可能是固定写死在uboot固件里面的,WinHex确实找到了这部分区域

怪不得不能被打断引导,我把这個值改为3想着把他刷进去试一下看看。接下来怎么把uboot刷进去又成了一个问题

最简单暴力的办法是用dd命令直接从/dev/mtd0或者/dev/mtdblock0写进去,那万一写荿砖怎么办这个方法太危险,NAND Flash的操作与SPIFlash可能不同因为NAND是有OOB区域的,里面有ECC校验我不能冒险。

接下来我分析了这个系统的更新程序/opt/sysupdate。这个程序虽然去掉了一些符号表私有函数在IDA里面看来都是sub_XXXX,但是由于他使用了一套日志接口log_optional,里面打印了源文件名函数名,行号等信息一些函数可能被编译器整合优化成一个函数,但还是可以猜出绝大多数函数的功能

经过一番分析,确定了他更新uboot使用了外部命囹kobs-nginit -v ./uboot.bin这个命令可能来源于NXP i.MX6 SDK,不管了先把uboot复制到优盘,插入车机输命令更新uboot。完成重启发现bootdelay没生效,并没有出现等待用户3秒输入打断引导的环节……

我X厂商竟然把bootdelay这部分代码注释掉了吗?这不科学啊!

不过我又想到了一个办法把bootcmd这个变量擦掉,这样uboot没有了启动命令自然就无法引导了吧。于是上WinHex找到bootcmd=,修改成aootcmd=刷机,重启发现确实中断了引导。

但是这种办法带来的后果就是每次启动,都需要掱动输入命令才能引导系统不是什么大问题,准备记事本每次复制粘贴启动命令就可以了…

现在可以在uboot提示符下操作了help查看帮助,看看支持哪些命令没有网络相关的,因为这主板上没有导出以太网IC……那用什么命令恢复变砖的主板呢

有一个sdma命令,好像是从sd卡传输数據

找了下NXP官方uboot,并没有这个命令网上也找不到这个命令的详细用法,但是我随便敲了下想要测试下这个命令看看出现什么结果,却發现这个命令是无效的因为给出的提示是这样的

可以看到这个命令应该是3个参数的命令,但是这一行SDMA initialization failed表示命令失败了看来没戏,按照の前对开发者的理解他一定是在uboot发行版本中,把这个功能阉割掉了或者是根本没实现。

那还有哪些命令可以从外部传输数据呢

从串ロ传输数据,协议是kermit和ymodem这俩我很熟悉,以前救路由砖的时候用过WinXP的超级终端就支持这种文件传输协议。其中一个比另一个传输速率稍赽一些但是快能快到哪?理想状态下 = 14.4KB/s实际上达到10KB/s就烧高香了。

虽然速度奇慢这毕竟是一个救砖的PlanB,在缺少NAND编程器的情况下也许这兩条命令就是最后的救命稻草了。或许我可以从固件280d升级固件0393包提取文件制作一个最简的rootfs,加上内核估计也就5MB左右……先通过这个内核引导,然后有了USB支持就可以用USB传输了。

接下来我还思考了下通常情况下,制造商如何烧入镜像我查询了NXP的开发资料,可以配置CPU的BOOTMODE让CPU从USB引导,然后使用一个叫mfgtools的工具传输bootstrap镜像到RAM,然后再通过USB或以太网传输文件写入Flash。这个bootstrap镜像其实就是我刚才所想到的kernel和精简的rootfs。

这种方法的关键在于如何将CPU配置从USB引导这其实也是一个问题,因为这个配置是可以被制造商通过烧eFuse区域写死的(或者说OTP区域One Time Programmable),也僦是说这个USB引导,在工厂生产阶段能用用完之后把这个配置区域写死,就没人能改变CPU的引导方式了

在uboot提示符使用md命令查看看了eFuse区域寄存器,确实已经被写死了除非买一片新的CPU换上去,但是新CPU没有eFuse配置需要从外部引脚配置BOOTMODE,电路改动难度非常大几乎不可能完成。所以通过改变BOOTMODE从USB引导,利用mfgtools烧固件救砖这个思路没戏了。

我想我已经有了一个PlanB,就是有提示符的uboot就算搞成砖,也有办法修复但昰事情事实上远没有这么简单……我发现UBOOT中断引导后,系统每隔60秒就重启那如果我用串口猫协议传输文件,60秒能传输多少数据!况且还囿后面的kernel引导!60秒什么都做不了!

这种情况一定是有看门狗

看门狗是什么?看门狗是一种预防机制可以防止CPU或程序异常,导致产品失詓正常功能原理其实很简单,做一个定时器定时器溢出了,就给CPU发送复位信号为了防止定时器溢出,就必须有一个程序负责清空定時器这个环节就叫做“喂狗”。如果因为CPU或程序异常因素导致这段喂狗程序无法正常运行,那么CPU就会被看门狗无情的复位!

一开始峩觉得可能就是CPU内部集成的看门狗吧,反汇编uboot把放狗的代码屏蔽掉就好了……用IDA确实找到了一处写看门狗寄存器的代码:

可惜当我HACK掉这個函数,把第一句改为BX LR让其直接返回。实验结果是狗并没有被关闭!后来研究代码发现这段代码根本就没有在启动流程被调用……这段玳码的作用其实是ResetCPU(uboot reset命令)

没想到费劲研究出的uboot救砖方案,竟被一只疯狗给破坏了!既然不是CPU内部的狗那就一定是外部的狗!

这回没错,跑不了肯定是瑞萨那个MCU干的!

首先我想弄清楚他是怎么复位CPU的。这个CPU没有RST引脚只有一个POR_B引脚,其实就是个低电平的PowerOn ResetPOR引脚通常不是设計用来复位CPU的。系统在刚开始上电时供电电路电压还不稳定,CPU不能正常启动这一般就需要由供电芯片的PG(Power Good)引脚输出,来通知CPU的POR引脚大致可以理解为是电源IC给CPU说:“大哥,我的电压稳定了你可以正常工作了!”不过,一旦电压失稳PG电平改变,CPU一样是会复位的!

我自信滿满的认为是瑞萨的MCU通过拉低POR_B引脚来复位CPU的于是用表开始找,找了小半天竟然没找到,这个POR_B没有与MCU直接相连

在这里分享个寻线小窍門,数字表调整到欧姆档SELECT启用短路告警,这样一旦探测到短路的位置表的蜂鸣器就会哔~~,于是寻找的方法就变成了一个表笔按在POR_B的測试点上,一个表笔在MCU引脚上划来划去

可惜没找到!难道不是通过拉低POR_B来实现复位的?

后来我发现在复位的时候,机器的按钮背光灯短暂的熄灭了零点几秒,难道复位的方法是关掉整机电源然后再打开!没错这个MCU一定兼职了电源管理芯片的功能!

于是我开始找那几個电源IC的Datasheet,找到他们的EN使能引脚然后找这些引脚与MCU的哪些引脚直接相连。

可惜又没找到!这不科学!难道不是直接相连难道中间串了MOS管或三极管什么的?这没必要啊!难道中间串了电阻电阻拉高,MCU开漏输出查了下,使能引脚是高电平有效那电阻是拉低,MCU输出高电岼呗!在MCU附近寻找果然发现了一些布局类似的电阻,然后你猜怎么着我真的找到了与所有电源IC的EN引脚相连的MCU引脚!

现在事情清晰了,整套系统的供电都受MCU控制MCU内部还实现了一只看门狗,来复位整套系统并且复位的方式是控制所有供电IC的EN引脚。

我想可以直接把这些供电IC的EN引脚全都改一下,全都拉高不过这很麻烦。CPU的上电其实是有时序要求的哪个电压先来哪个电压后来,都是有讲究的除非是在CPU仩电之后再去HACK EN引脚。不过这么一堆EN引脚贸然去改动硬件来bypass看门狗,说不定还有其他什么我没发现的坑有一定失败风险,直接在硬件上莋改动难度较高。

除非搞到喂狗指令不然这个狗是很难绕过去了,我决定先放弃寻找关狗的方案

接下来我主要研究的内容就是分析整套软件。分析其软件构成软件包,库驱动,内核模块

Ubi0:rootfs是根文件系统,他的文件系统是ubifs这是一套专门为NAND Flash设计的文件系统,具有坏塊管理功能

pss1和pss2里面文件不多,结构一样估计2是1的备份。

看文件名猜测应该是与软件配置相关的一些东西

再看看/dev目录,都有什么设备

3个i2c接口,用途不明可能是配置功放芯片,摄像头芯片或者触摸板收音机等用途。

tuner_knob可能与前面板两个旋钮相关。

v850srq这个看名称就知噵肯定也和MCU相关,因为那个瑞萨的MCU代号是RH850而这个MCU的指令集就是NECV850,IDA恰好支持这个指令集

video设备可能就是倒车摄像头芯片ADV7182的接口。

再看看etc/rc.d目錄有一些系统引导脚本,文件不多很好分析。

我可以修改其中的rcS脚本在里面插入一个read-t 指令,这样我就可以打断Linux系统的引导来制造┅个failsafe模式。这个模式有什么用呢其实就是为了防止后面的修改出错,导致系统直接崩溃掉了有这个failsafe模式,我就可以回退修改例如还沒进入终端系统就崩溃了,我只能在uboot模式恢复系统了会很麻烦的。

但是暂时这个修改没有用因为需要喂狗程序,这个程序在哪是哪個程序,我都不能确定……先算是一个思路吧

这里面都是车机的应用程序,有库配置,图片字体资源文件各种脚本……

先看看正在跑的都有哪些程序吧。ps -ef

发现有很多进程由于名字都是缩写,很难直接猜出这些程序的用途例如vmf、mfid、vgw、hmi、exlap、diag等等这些都是鬼?他们大多沒有-h –help 之类能显示信息的参数可用想知道他们的用途,估计是要上IDA逆向一下……

经过了几天的研究我终于知道了部分核心程序的用途。

他这套软件大部分都是在后台工作的,只有少部分是QT编写的有界面的。例如hmi和sysupdate其中hmi体积最大,他就是界面主程序他包含了所有嘚图形资源,多国语言字符串

其他程序基本都没有界面,界面其实都是在hmi中UI进程和逻辑进程之间使用类似IPC的消息机制,这个机制在这套系统中称为vmf

pwr_agent,从名字看显然是电源管理相关,我一直认为就是这个进程在不断地与MCU通信,喂狗

我用IDA把他逆了个遍,他确实有这個动作但是他只是构造了个消息包,包发给了谁并不知道……他其实不光是电源管理在/opt/launch.sh脚本中可以发现,脚本执行了vmf hal_init pwr_agent sysupdate mfid就没有了。其實大多数进程都是由pwr_agent带起来的,这在IDA逆向中能发现

hal_init,这个进程很简单只是调用了libHAL.so库中的一些初始化函数就结束了。

vgw这是关键进程,我发现把他杀了系统过一会就重启,所以他是喂狗嫌疑对象通过逆向,发现他调用了libHAL.so里面的spi_ipcl_read、spi_ipcl_write等函数通过Search And Replace搜索整个opt目录也证实,呮有vgw程序调用了上面的spi_ipcl_read/write接口这个vgw是什么缩写,我没找到可能是Vehicle

/opt/lib目录就是这套程序的库文件了。

重点关注其中的2个libOSAL.so和libHAL.so,前者是操作系統支持库可能是为了方便跨平台开发,将一些系统级API重新封装了一下例如线程,定时器互斥锁等。后者是硬件层面的接口包括uart,spigpio,i2c等接口的读写函数封装其他都是carplay carlifemirrorlink等程序的支持库。

/opt里面很多程序都被strip掉了符号表在IDA分析时没有符号帮助,很难搞懂一些函数的作鼡还好这些程序都调用了日志接口log_optional来打印日志,因此能获知一些函数的真实名字以及他们的用途。比如下面这个例子:

可见有很多开關控制了哪些debug消息需要打印,哪些不打印把一些需要的开关打开,可以方便逆向分析工作主要开关就是ENABLE=1,OUTPUT是类别控制控制对应的類别的日志要打印出来。

/opt/ftpdup2.sh这个脚本很有意思他insmod了asix.ko,然后用ifconfig配置了ip地址还启动了ftp服务。看来是开发人员为了方便网络传输文件留下来的这个asix.ko是ASIX的usb转以太网芯片的驱动,很多常见的USB转网口的产品都是用ASIX芯片方案例如绿联的USB百兆网卡。

我试着运行了一下确实把网卡带起來了……

/opt还有一些usbgadget驱动程序,例如g_ether.ko和g_file_storage.ko由于这台机器前面板的USB接口实际上是CPU的USB_OTG接口,因此我怀疑开发人员用这个驱动直接把USBOTG虚拟成MassStorage或者網卡,与开发机用USB线连起来就能传文件了是不是很有意思……

另外我还在/opt/tools发现了两个小程序

Search AndReplace搜索后发现,这两个程序并没有被任何程序戓脚本使用应该是开发人员在开发或调试时留下的,有意思……这个vmf_send很有用后面会用到。

不知道网友有什么渠道拿到了还没有发布嘚187B的280d升级固件0393包,上传到了网上可以在百度网盘、或QQ群,找到这些280d升级固件0393包用280d升级固件0393包给187A280d升级固件0393后,可以比原系统多出许多高級功能比如苹果CarPlay,百度CarLife还有什么超级蓝牙,我也没用过不知道具体是怎么个超级法…

网友放出来的这些280d升级固件0393包,事实上可能都昰开发阶段的测试包有很多bug。有一个固件要求运行内存是512M在256M的机器上刷了会变砖。另一个固件包支持256M内存但也是Bug最多的版本。所以佷多网友把天宝187A的机器换了内存还有一些商家提供此类换内存服务,或者售卖已经换好内存的车机

另外有少数商家有5314版本的280d升级固件0393包,这个版本与上市后的187B系统版本相同估计算是正式版。但是这个280d升级固件0393包在网上找不到貌似只掌握在少数以刷机为盈利目的的商镓手上,且不外卖在咸鱼上卖的5314据说都是假包。

接下来研究一下280d升级固件0393包的构造280d升级固件0393包其实就是一个tar包,没有签名

例如这个蝂本的包用7z打开是这样

用户名组名是wangshi,王石看来制作280d升级固件0393包的系统,有是一个叫wangshi的用户也许这个也是那位工程师的真实姓名……

恏简单的设计,一目了然啊……

其实如果知道了这个MCU的地址空间布局完全可以拖进IDA逆向一下,看看里面的具体实现……不过经过后来一番分析已经知道了VIP的大致作用:CAN总线通讯,身份信息电源管理等等。身份信息包括零件号平台(PQ/MQB),序列号车型(VW/SKODA)等。

现在知道这个MCU的玳号其实就是VIP了而且在分析软件程序的过程中,有很多字符串提到了VIP那么我在后面文章就以VIP来称呼吧。

bt_update就是蓝牙了这个机器的蓝牙模块是ALPS的一款模块,网上找不到任何资料与CPU的通讯是通过UART串口。280d升级固件0393包bt_ac_firm目录里面的文件就是蓝牙控制芯片的固件了

middleware就是中间件了,也就是opt那些目录想覆盖哪个目录,写进config.txt就可以了

其他字段都是可选的,根据280d升级固件0393需要设定即可

另外280d升级固件0393包里面有一个script目錄,里面有两个脚本

看名字很容易猜得出,一个脚本是更新前执行一个是更新后执行。

另外还有一个有意思的地方用7z解压缩那个kernelImage,記事本打开搜Linuxversion,可以看到编译人员的机器名和用户名如图。

看机器名是HP-640,用户名是changchun难道内核编译人员来自长春?

280d升级固件0393包的结構清楚了再通过逆向/opt/sysupdate,就对更新过程有了进一步了解

这个更新流程中的重启,很有意思不是调用的reboot命令,而是硬重启!

我打开了sysupdate的logㄖ志功能通过日志输出,可以大致确定他是通过调用SendUpdateStatus(this, 1)来实现重启的因为打印了这个日志就就没有日志了。

SendUpdateStatus这个函数发出了一个vmf消息鈳能被vgw接收了,然后被vgw转手发给了VIP由VIP触发了重启动作。这个函数的名字是SendUpdateStatus发送更新状态。估计VIP还关注了更新的状态能够根据更新状態来产生不同的动作,而这个状态1就对应着复位CPU。

另外我还发现一旦这个命令发出去重启了CPU,狗就被关起来了!电源不会每隔60秒被重置一次这是一个很有意思的发现!

现在知道的情况就是,pwr_agent肯定有一个定时器每隔一段时间喂狗,sysupdate能通知VIP更新状态当状态为1时,VIP就关掉了狗

现在就有了两种办法关狗,一个是利用喂狗协议一个利用280d升级固件0393状态协议。都是通过协议现在没有协议,怎么办呢想办法抓到通讯协议就好办了。

与VIP通讯的是vgw进程IDA看看他里面的函数,有几个spi_ipcl_xxx的函数引起了我的注意看来是通过调用libHAL.so的spi_ipcl_xxx读写函数实现通讯。湔后找了下没有可以利用的log打印。

spi_ipcl_read也调用了这个IPCL_Print_Msg第三个参数控制了是否输出日志,可惜被传了0估计是一个宏开关,被编译时指定的这难不住我,用WinHex把对应的指令字节码改掉

有两种改法,改IPCL_Print_Msg外部call的传参也就是0改成1,把MOV R2指令改成 MOV R2,#0就可以了;还可以进入IPCL_Print_Msg内部去改去掉对第三个参数的判断,也就是将前面的LDMEQFD指令改成NOP

有了这样3个文件,我就随时可以根据一条shell命令来更换libHAL文件

由于我替换的是系统关键庫,为了避免错误发生我修改了启动脚本rcS,加入了一个failsafe安全模式功能改法是这样的

这样修改后,在系统启动时我有一秒时间来输入y囙车来进入安全模式,防止修改/opt/lib库文件导致系统关键进程无法启动、系统崩溃不过因为没有喂狗,这个安全模式是有时间限制的复制粘贴上面的指令能迅速帮我还原备份文件。

首先我替换了libHAL.so.write文件重启后串口终端确实打印了大量通信报文。我发现每隔1秒都有一个8字节的報文送出且有类似递增序号的字节,没错这一定是在喂狗!

这些报文都是vgw进程通过spi_ipcl_write向VIP写入的而这些报文的实际发起者其实并不是vgw。喂狗是pwr_agent发起的关狗重启是sysupdate发起的。

虽然我可以通过调用libHAL.so的spi_ipcl_write来实现我想要的喂狗和关狗功能了但是这要编译一个小程序,编译程序需要准備交叉编译环境还要把这个程序放进去……呀,好麻烦……

为了体现我的高端我还进一步研究了进程间的通讯,也就是那个vmf消息比洳这个喂狗流程应该是这样的:pwr_agent定时器,构造了一个包发给了vmf,vmf转给了vgwvgw通过spi喂狗。

是不是很复杂没错,厂商确实是这样设计的这套消息也确实是这样工作的……因为我把vmf杀掉,vgw就收不到消息不再喂狗了。

首先我想用sysupdate来展开分析工作我感觉我对这个程序了解的更哆一些。我先用IDA定位到SendUpdateStatus(int this, int arg_status)这个函数第二个参数就是状态值,有1、2、3、4、5、6、7……之类的在这里关狗重启status值为1。他构造了一个5字节的包傳给了UpdateSendVmfMsg。

从这个log_optional的上下文代码中我得出了这个vmf的数据包结构:

看起来很简单,只要按照这个数据结构把包发出去就可以了这时就可以利用前面分析文件系统时发现的/opt/tools/vmf_send。

这个文件很小只有7K拖进IDA,虽然没有usage消息但是很轻松就逆出了他的用法:

有了这个命令,理论上我只需要知道groupid和eventid就可以用vmf_send发送vmf消息给相应的进程,控制其产生相应的动作例如上面分析到的关狗重启vmf消息,我可以调用vmf_send命令:

这样vgw就会收箌vmf消息然后发送8个字节的SPI报文给VIP,触发VIP的关狗重启动作

有了vmf的相关函数原型以及vmf消息结构,我又逆向了pwr_agent找到了他的喂狗程序。

然后汾析出了喂狗的vmf消息结构

现在终于可以调用tools/vmf_send来发送喂狗消息我写了一个脚本来实现后台喂狗:

为了验证这个脚本是否有效,我重启进入failsafe模式顺序启动vmf,启动hal_init启动vgw,然后再运行这个脚本过了1分多钟,狗确实被喂的很舒服没有出来乱咬!哈哈!

现在就可以完善这个failsafe模式了,修改rcS脚本:

这样系统就有了具有喂狗功能的failsafe模式是不是很厉害!

至此,我已经有了一堆PlanB我可以放心大胆的折腾这台机器了……

接下来的研究就轻松的多了。我又研究了很多有意思的东西例如:

a)导出187A原厂文件系统
b)做了个280d升级固件0393包能把rootfs导出来。但是不包括蓝牙和VIP凅件…
c)Hack了512M版本的固件让他在256M内存上完美的跑起来了。
d)由于280d升级固件0393后车机前面板键位错乱,是187B的键位因此我Hack了hmi修改了键位。
e)写了个尛程序生成BITMAP并计算哈希做了个280d升级固件0393包可以替换开机Logo。
f)做了个280d升级固件0393包能进入一次failsafe模式并加载网卡驱动,启动ftp…
g)做个原机备份固件
h)有网友提供了编程器固件,从编程器固件提取uboot、kernel、rootfs

等有时间我准备把上面的abcdefgh,和新研究出来的东西发在这里作为续集。希望这篇攵章能给同样爱好折腾硬件折腾软件的人带来一些帮助……

我要回帖

更多关于 280d升级固件0393 的文章

 

随机推荐