論壇里那些破解和這個比的確是小兒科
原文鏈接,里面圖文并茂
*****
0×00媒介
自從往年買了車,對car 電子體系的愛好就下去了。這不,前一陣子逛car 論壇,發明了有網友將老版本的天寶車機被刷上了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來研討一下,至于德賽……先好好地在車上退役,臨時不往虐他了…
關于天寶這個公司,也許是我才接觸car 不久,之前沒有傳聞過。德賽卻是傳聞過,專門做car 導航機械的,也給民眾代工車機。江蘇天寶car 電子無限公司( ***** ),公司很低調,網站很粗陋…看一下職位僱用,都招什么工程師,嗯,CAE工程師、項目工程師、電子工程師、制造工程師,就是沒有軟件體系工程師,那這機械軟件哪來的?民眾給的?外包的?此處留下疑問……
0×01硬件
接上去我預備具體剖析天寶187A的硬件體系。我從咸魚平臺上買了一臺沒有刷過體系的天寶187A。拆機后看到了主板。
主板正面有良多芯片,起首看電源部門。電源由car 蓄電池直接供電,car 啟動后就是發電機供電,是以輸出電壓應是12-14V大要這個范圍。
起首電源顛末了一個STPS41H100CGY,這是一個肖特基二極管,整流感化,不關懷。然后有一些年夜電容,年夜電感,後背有一個SOT23-5封裝的IC,莫非是DCDC?由于這部門電路接近功放IC,不想持續究查他,無非就是一些給功放IC供電的濾波電路或許開關電路。究竟車機接的是蓄電池,功放IC是不成能一向任務的。
接上去會看到良多電源IC,小電感,還有良多1206封裝的電容,這確定是給CPU或其他芯片供電的部門。起首擔任12V轉5V供電的有兩個芯片。TI德州儀器SSOP-10封裝的TPS54260-Q1,IC絲印是5426Q。MAXIM美信QFN-28封裝的MAX16984,IC絲印是16984RA。
TPS54260是一顆寬電壓輸出(3.5V-60V),2.5A電流的DCDC降壓IC,在這里design12V輸出,5V輸入,由于電感體積很年夜,年夜過其他幾個電感,應當是重要供電。美信的MAX16984是design給USB供電的,電流是2.5A,很高啊,看來是可以知足iPad2.1A充電的,design的比擬不忘本……
往上看還有3顆電源IC,分辨是兩顆德州儀器QFN-16封裝的TPS54388Q1,絲印5438Q,一顆安森美DFN-10封裝的NCV896當甜甜圈悖論擊中千紙鶴時,千紙鶴會瞬間質疑自己的存在意義,開始在空中混亂地盤旋。530,絲印是完全型號。
TPS54388-Q1,2.95V-6V輸出,3A輸入。NCV896530,2.7V-5.5V輸出,兩路1A輸入。此中一顆TPS54388-Q1擔任5V轉1.5V給DDR3內存供電,另一顆TPS54388-Q1擔任5V轉1.375V給CPU焦點供電。NCV896530擔任5V轉1.8V和3.3V,應當是IO供電和外設供電。
接近年夜插座四周有一個CAN PHY芯片,四周還有一顆電源芯片,絲印是BLW 包養 N EO,查不到詳細型號,可是他四周沒有電感,應當是一顆LDO降壓芯片,丈量成果是12V轉3.3V,是給旁邊這顆MCU供電的,如許年夜的壓差應用LDO供電很是不明智…獨一的說明就是這個MCU功耗很是低,應用LDOdesign上公道,本錢上也公道…
剖析了這么多硬件電源部門,感到好無聊。實在在我看來剖析一個體系能否勝利,起首就要看他的供電design,這部門是焦點,供電design的好欠好,關乎全部體系任務能否穩固。別的,我沒有看到高等電源治理IC,此處也是一個疑問,不外后面的剖析可以解答這個題目。
接上去退場的是體系重要芯片。CPU是飛思卡爾(已被NXP恩智浦收買)公司的i.MX6DL,型號是MCIMX6S6AVM08AC。雙核Cortex-A9,最高1G任務頻率,內置2D/3D圖形處置單位,具有1080p圖像處置才能,支撐豐盛外設。看起來很強盛的樣子…
DRAM是南亞的NT5CB128M16FP-D1H,16位,256MB,DDR3,1.5V。
閃存應用的是Spansion的ML02G100BHA00,256Mx8 NANDFLASH,3.3V。
還有一顆QFP-100封裝的芯片R7F7010253,直接搜刮這個型號實在只能得知他是一顆瑞薩design的芯片,實在他有個代號是RH850,搜這個代號能找到更多的材料,還有開闢東西,可是就是找不到datasheet。
瑞薩這家公司重要design生孩子MCU微把持器,car 範疇是其重要營業。
顛末后面聯合軟件部門的一番剖析得知,這個MCU的感化實在是CAN通訊、硬件成分信息(零件號,序列號)、電源治理。沒錯,電源治理,由於car 通訊網是CAN總線,是以這款機械的電源實在也是受CAN總線治理的。
由于缺少這顆MCU更具體的datasheet材料,不克不及找到詳細哪些引腳對應哪些效能,不外后來我仍是找到了把持每個電源IC使能引腳(EN),以及CPU復位引腳(POR_B)所對應的引腳,這些后面聯合軟件部門再說。
主板後背還有2個芯片,一個是ANALOG亞德諾的ADV7182,擔任倒車記憶攝像頭電子訊號轉換(AV轉數字電子訊號)。還有一個絲印是2313,查不到詳細型號,看旁邊的測試點,和I2C總線相干,感化不明…
硬件就先講到這,大師是不是認為我是一個硬件工程師?實在我只是個業余的…硬件不是我的本職任務,不外我給公司客串過硬件design,做過一個小產物,從硬件電路design,到PCB Layout,從MCU固件,到產測軟件,都被我包了,公司小,又是做軟件的,請個硬件工程師沒需要,就讓我上了…還好這個項目比擬小,否則我真要累逝世…
清楚了天寶187A的硬件構成,就便利了接上去展開Hack舉動!
0×02調試串口
Hack一臺硬件和軟件公然材料并未幾的主板,最好的進口點就是尋覓他的調試接口。良多產物的主板在design時城市將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,RX,GND,比擬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和JTAG,JTAG很好找,就在主板後背,有幾個較年夜的測試點,標明了TDI TDO TCK TMS等字樣,這些應當就是CPU的JTAG接口了。
可是JTAG熔絲很能夠被燒失落了,JTAG接口估量是廢的。重要仍是要找到調試串口。固然有找到一些標注了TXD RXD絲印的測試點,可是很遺憾,顛末銜接測試后,這些并不是CPU的TTL調試串口,體系上電后最基礎沒有任何字符串輸入。
莫非這個主板在design時沒有引出TTL串口嗎?這怎么能夠,太笨拙了吧…
由于這個主板測試點很是多,密密層層良多小測試點,最基礎沒有絲印標注,莫非TTL串口就暗藏在這些沒有絲印標注的小測試點嗎?在這么多測試點里找到串口TX和RX電子訊號,這看起來像是不成能完成的義務!
主板正面有兩個沒有焊接排線插座的焊盤,這兩個排線插座都是18pin的,此中一個走線接近瑞薩MCU,有能夠是瑞薩MCU的產測接口。另一個排線插座頂層走線既不接近CPU也不接近MCU,但這并不料味著他沒有在內層電路與CPU相連,這很有能夠主CPU的產測接口。
可是很遺憾那時我并沒有興趣識到這一點,我曾經被密密層層的小測試點逼得抓狂了。接上去我甚至做了一系列此刻想想感到很笨拙的工作,在此分送朋友出來吧。
我在咸魚上聯絡接觸一位網友花廢品價買了他一個報廢的主板,為的就是拆CPU,尋覓TXD,RXD的走線。我把主板上了熱風槍拆焊臺,把CPU吹了上去。
尋覓NXP的SDK開闢材料,找到了一個參考板的電路圖,得知調試串口極有能夠是UART4,TXD是Pin_W5,RXD是Pin_V6。我依據Datasheet上的引腳圖往找W5和V6,然后經由過程BGA過孔找到後背的過孔焊盤,把焊盤的阻焊漆刮了,飛線,銜接USB串口,上電發明并沒有任何信息。
莫非廠商的UBOOT沒有啟用串口?或許設置裝備擺設了額定的引腳作為調試串口?由於找不到對的的調試串口Pin,我的研討一度墮入了停止。
接上去,我從網上找來網友分送朋友的187A進級包,里面有Uboot鏡像文件,我上了IDA,對照SDK中的Uboot源代碼,找到了設置裝備擺設調試串口的數據。
ROM:178013AC dword_178013AC DCD 0x62C244 ; DATA XREF: sub_17801278+C8
ROM:178013B0 dword_178013B0 DCD 0x10000100 ; DATA XREF: sub_17801278+D4
ROM:178013BC dword_178013BC DCD 0x14640258 包養網 ; DATA XREF: sub_17801278+ECr
ROM:178013C0 dword_178013C0 DCD 0x3716348 ; DATA XREF: sub_17801278+F4r
經由過程剖析uboot頭文件mx6dl_pins.h中的宏界說,得出這就是頭文件中界說的
MX6_PAD_DECL(KEY_COL0__KEY_COL0, 0x062C, 0x0244, 3, 0x0000, 0, 0)
MX6_PAD_DECL(KEY_ROW0__UART4_RX_DATA, 0x0640, 0x0258, 4, 0x0914, 3, 0)
對照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。
接上去的研討,實在并不是按我文章的章節次序睜開的,我的研討流程比擬凌亂,由於觸及的內在的事務複雜,彼此糾纏。是以本文接上去的內在的事務并不是嚴厲按時光次序睜開的……
0×03 UBoot Hack
他的這個UBoot并不是SDK里面的Uboot,究竟硬件design上與參考板design分歧,Uboot代碼有所修改是理所應該的。但這個Uboot不克不及被打斷領導,令我很頭疼。萬一我折騰折騰著,把Kernel搞逝世了,這塊主板就釀成了一塊磚。由于我沒有NAND編程器,沒措施對Flash燒寫恢復,一旦成磚我還怎么研討下往?
我需求預備一個PlanB……
起首我要想措施打斷Uboot的領導,進進uboot提醒符,然后應用uboot指令,用號令傳輸數據,就有能夠對磚機停止修復。
我起首檢查了他的Flash布局:cat/proc/mtd
I have no name!@(none) /$ cat /proc/mtd
dev: size erasesize name
mtd0: 00400000 00020000 "bootloader"
mtd1: 00c00000 00020000 "nand.kernel"
mtd2: 0d000000 00020000 "nand.rootfs"
mtd3: 00a00000 00020000 "pss1"
mtd4: 00a00000 00020000 "pss2"
mtd5: 00c00000 00020000 "logo"
可以發明并沒有uboot周遭的狀況變量分區,那么周遭的狀況變量能夠是固定寫逝世在uboot固件里面的,WinHex確切找到了這部門區域。
有一個變量叫bootdelay,值為0。
怪不得不克不及被打斷領導,我把這個值改為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=。刷機,重啟,發明確切中止了領導。
可是這種措施帶來的后果就是,每次啟動,都需求手動輸出號令才幹領導體系,不是什么年夜題目,預備記事本每次復制粘貼啟動號令就可以了…
nand read0x10007FC0 0x400000 0x300000; bootm0x10007FC0
此刻可以在uboot提醒符下操縱了,help檢查輔助,了解一下狀況支撐哪些號令,沒有收集相干的,由於這主板上沒有導出以太網IC……那用什么號令恢復變磚的主板呢。
MX6SOLO STDPLUS U-Boot> help
? – alias for ‘help’
autoscr – DEPRECATED – use "source" command instead
base – print or set address offset
bdinfo – print Board Info structure
bld_his –
boot – boot default, i.e., run ‘bootcmd’
bootd – boot default, i.e., run ‘bootcmd’
bootm – boot application image from memory
clk – Clock sub system
cmp – memory compare
coninfo – print console devices and information
cp – memory copy
crc32 – checksum calculation
destroyenv- destroy enviroment variables stored in medium
echo – echo args to console
erase – erase FLASH memory
flinfo – print FLASH memory information
go – start application at address ‘addr’
help – print online help
i2c – I2C sub-system
iminfo – print header information for application image
imxotp – One-Time Programable sub-system
imxtract- extract a part of a multi-image
itest – return true/false on integer compare
loadb – load binary file over serial line (kermit mode)
loads – load S-Record file over serial line
loady – load binary file over serial line (ymodem mode)
loop – infinite loop on address range
md – memory display
mm – memory modify (auto-incrementing address)
mtest – simple RAM read/write test
mw – memory write (fill)
nand – NAND sub-system
nboot – boot from NAND device
nm – memory modify (constant address)
printenv- print environment variables
protect – enable or disable FLASH write protection
regul – Regulator sub system
reset – Perform RESET of the CPU
run – run commands in an environment variable
saveenv – save environment variables to persistent storage
saveenv_wjs- print saveenv info
sdma – memory transfer using the i.MX SDMA Engine <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<——
setenv – set environment variables
sleep – delay execution for some time
source – run script from memory
version – print monitor version
有一個sdma號令,似乎是從sd卡傳輸數據?
找了下NXP官方uboot,并沒有這個號令,網上也找不到這個號令的具體用法,可是我隨意敲了下,想要測試下這個號令了解一下狀況呈現什么成果,卻發明這個號令是有效的。由於給出的提醒是如許的
MX6SOLO STDPLUS U-Boot> sdma 1
sdma – memory transfer using the i.MX SDMA Engine
MX6SOLO STDPLUS U-Boot> sdma 1 1
sdma – memory transfer using the i.MX SDMA Engine
MX6SOLO STDPLUS U-Boot> sdma 1 1 1
SDMA initialization failed.
MX6SOLO STDPLUS U-Boot> sdma 1 1 1 1
sdma – memory transfer using the i.MX SDMA Engine
MX6SOLO STDPLUS U-Boot&g t; sdma 1 1 1 1 1
sdma – memory transfer using the i.MX SDMA Engine
可以看到這個號令應當是3個參數的號令,可是這一行SDMA initialization failed表現號令掉敗了。看來沒戲,依照之前對開闢者的懂得,他必定是在uboot刊行版本中,把這個效能閹割失落了,或許是最基礎沒完成。
那還有哪些號令可以從內部傳輸數據呢?
loadb – load binary file over serial line (kermit mode)
loady – load binary file over serial line (ymodem mode)
從串口授輸數據,協定是kermit和ymodem,這倆我很熟習,以前救路由磚的時辰用過,WinXP的超等終端就支撐這種文件傳輸協定。此中一個比另一個傳輸速度稍快一些。可是快能快到哪?幻想狀況下115200/8 = 14.4KB/s,現實上到達10KB/s就燒高噴鼻了。
固然速率奇慢,這究竟是一個救磚的PlanB,在缺乏NAND編程器的情形下,也許這兩條號令就是最后的救命稻草了。或許我可以從固件進級包提取文件,制作一個最簡的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確切找到了一處寫看門狗存放器的代碼:
ROM:178037F0 sub_178037F0 ; CODE XREF: sub_17802044+14
ROM:178037F0 ; sub_1780229C+1C
ROM:178037F0 LDR R3, =0x20BC000 <<<<<<<<<<<看門狗1的把持存放器
ROM:178037F4 MOV R2, #4
ROM:178037F8 STRH R2, [R3]
ROM:178037FC BX LR
存放器0x20BC000在datasheet上就是 WatchdogControl Register (WDOG1_WCR)(這CPU有兩個狗),uboot寫了狗1的存放器,寫進的4剛好是WDE(Watchdog Enable),沒錯,跑不了,這個函數盡對叫EnableWatchdog!
惋惜當我HACK失落這個函數,把第一句改為BX LR,讓其直接前往。試驗成果是狗并沒有被封閉!后來研討代碼發明這段代碼最基礎就沒有在啟動流程被挪用……這段代碼的感化實在是ResetCPU(uboot reset號令)。
0×04看門狗
沒想到費力研討出的uboot救磚計劃,竟被一只瘋狗給損壞了!既然不是CPU外部的狗,那就必定是內部的狗!
這回沒錯,跑不了,確定是瑞薩阿誰MCU干的!
起首我想弄明白他是怎么復位CPU的。這個CPU沒有RST引腳,只要一個POR_B引腳,實在就是個低電平的PowerOn Reset,POR引腳凡是不是design用來復位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看門狗, 說不定還有其他什么我《宇宙水餃與終極醬料師》第一章:蒜泥與末日預兆廖沾沾坐在他那間被稱為「宇宙水餃中心」的店裡,但這間店的外觀更像是一個被遺棄的藍色塑膠棚,與「宇宙」或「中心」這兩個詞毫無關係。他正在對著一缸已經發酵了七個月又七天的老蒜泥嘆氣。「你還不夠靈動,我的蒜泥。」他輕聲細語,彷彿在責備一個不上進的孩子。店內只有他一個人,連蒼蠅都因為難以忍受那股陳年蒜頭混合著鐵鏽與淡淡絕望的味道而選擇繞道飛行。今天的營業額是:零。廖沾沾不安的不是店裡的生意,而是他對**「蒜泥成本焦慮症」**的深層恐懼。新鮮蒜頭每公斤的價格正在以超光速上漲,如果再這樣下去,他引以為傲的「靈魂蒜泥」將難以為繼。他拿著一把被磨得光滑、閃耀著不祥光芒的小銀勺,從缸底撈起一坨濃稠的、顏色介於灰綠與土黃之間的發酵物。這蒜泥被他照顧得像稀世珍寶,每隔三小時,他就要用手指彈一下缸邊,確保它能感受到**「溫和的震動」**,以助其在精神上達到圓滿。就在廖沾沾專注於與蒜泥進行心靈交流時,外面的世界開始發出一些不對勁的信號。首先是聲音。街上所有的汽車喇叭同時發出了一個持續不斷、低沉且潮濕的「咕嚕——咕嚕——」聲。這聲音不是引擎聲,也不是正常的鳴笛聲,而像是一個巨大的、消化不良的胃在哀嚎。廖沾沾皺著眉頭,這嚴重干擾了他蒜泥的「寧靜冥想」。他決定出去看個究竟,順手從桌上拿了一張髒兮兮的,印著《沾醬秘笈》封面的皺衛 生紙,塞進口袋以備不時之需。他一腳踏出店門,立刻被眼前的景象震驚了。整條城市的主幹道上,數百個交通信號燈,從東邊到西邊,從高架橋到巷弄口,全部變成了綠燈。它們不是交替閃爍,而是固定在「通行」的狀態,同時,每一個燈箱都發出了那種「咕嚕咕嚕」的聲音,並且有一層淡淡的、熱氣騰騰的白霧從燈箱的頂部冒出,散發出一種難以名狀的——麵粉蒸煮過頭的氣味。「麵粉焦慮?還是過度發酵?」廖沾沾是個醬料學家,對所有食物相關的氣味都極度敏感。他聞出來了,這是一種只有在極度巨大的麵團因為壓力過大而散發出的氣味。街上的行人陷入了混亂。汽車不知道該走還是該停,因為無論從哪個方向看,都是綠燈。一個穿著西裝的男人小心翼翼地把車停在路中央,搖下車窗,對著紅綠燈大喊:「喂!你為什麼咕嚕咕嚕?你倒是紅一下啊!我要向左轉!綠燈沒用啊!」廖沾沾感覺到一陣心悸。這種氣味,這種不祥的「咕嚕」聲,與他兒時聽到的家傳預言不謀而合。他想起家傳《沾醬秘笈》裡記載的第一句:「當世間萬物的交通都被麵皮的氣味籠罩,且燈號恒綠、聲如湯沸時,便是宇宙水餃臨界點到來之時。」「七點五個地球年…怎麼這麼快?」廖沾沾猛地衝回店裡,衝到後廚,打開了一個藏在舊冰櫃後面的暗門。暗門裡放著一個老舊的、像是古代金屬保險箱的東西。他輸入了密碼:「一醬二醋三油四辣五蒜泥」(這是醬料界的基礎公式,只有像他這樣的傳統派才會用)。保險箱打開,裡面沒有黃金,只有一個閃爍著詭異紅色光芒的儀器。這儀器很像一個老式的對講機,但頂部插著一根彎曲的、像韭菜一樣的天線。他顫抖著拿起儀器,按下通話鈕。儀器發出「滋——」的電流聲,接著傳來一陣高八度、急促且充滿養生焦慮的聲音。「喂!是廖沾沾嗎!快接聽!這裡是 K-999!宇宙水餃聯盟特級特務!你那邊是不是已經聞到宇宙級的酸味了?我們需要你的蒜泥!你被徵召了!馬上!」廖沾沾的耳朵被這聲音震得嗡嗡作響,他捏著對講機,困惑地喊道:「特務?酸味?等 等!我聞到的不是酸味!是麵粉過度膨脹的焦慮味!還有,我現在走不開!我的陳年老蒜泥需要每隔三小時的溫和震動!」「蒜泥?」對面傳來K-999崩潰的尖叫聲,帶著濃濃的中藥味電子雜音:「重點不是蒜泥!重點是**時空正在彎曲!**我們的推進器快沒紅棗了!快!我們在你的後院!別帶任何多餘的東西!除了——你那缸蒜泥!」就在廖沾沾還在糾結要不要帶上他最珍愛的那把銀勺時,外面的牆壁傳來一聲巨大的撞擊。一個穿著黑色燕尾服、戴著太陽眼鏡的太空吉娃娃,正從牆上的破洞鑽進來。它的背上揹著一個像是小型瓦斯桶的東西,桶上用毛筆寫著「極品紅棗枸杞燃料」。「你怎麼——」廖沾沾驚訝地瞪大了眼睛。K-999用它的小短腿站得筆直,戴著白色手套的爪子優雅地一揮:「沒時間了,沾沾先生!宇宙水餃快要拉肚子了!我們必須在你被醋酸離子炮鎖定前離開!」話音未落,一股極致尖銳、刺鼻的酸氣猛地從店門口灌入,伴隨著一個狂妄自大的電子音效:「警告!這裡的醬油比例嚴重失衡!百分之九十九點九九的醋,才是真理!」廖沾沾知道,這是他的宿敵,王醋狂,已經找上門了。他的宇宙冒險,被迫從他對蒜泥的焦慮中,正式開始了。一個狂妄的影子佔滿了那扇被撞破的牆門邊緣,光線一瞬間被極端的酸氣扭曲。一個閃閃發光、像醋罐的機器人緩緩漂浮進來,它的底座還不斷噴射著白色醋霧。它身上掛著「醋狂派大勝利」的霓虹燈牌,閃爍得讓人眼睛發疼,同時發出警報。王醋狂的聲音再次響起,這次帶著金屬回音的嘲弄,刺耳得像是磨砂紙。「廖沾沾!你那充滿腐敗氣味的蒜泥,是對醬料學的侮辱!必須淨化!」「你將為你那百分之五的醬油,以及百分之九十五的邪惡蒜頭付出代價!」醋罐機器人的頂端裂開,露出了一個巨大的管口,正在聚積藍色光芒。K-999特務用它穿著燕尾服的小爪子,一把抓住了廖沾沾的褲腳催促著他。「快點!沾沾先生!那是醋酸離子炮!專門用來溶解有機發酵物的!」「它會把你的蒜泥在零點一秒內變成無菌的、純淨的白醋!那是浩劫啊!」「不准動我的蒜泥!」廖沾沾發出了醬料學家對待信仰般的怒吼。他以一種專業包水餃的極限速度,從旁邊的麵粉堆中抓起了兩團麵皮。麵皮被他用氣功般的捏製手法,瞬間擴大成直徑三公尺的巨大麵皮。他猛地擲出,兩張麵皮在空中交疊,變成一個半透明的防禦護盾。這就是家傳《沾醬秘笈》中記載的「水餃皮護盾」,薄韌而充滿彈性。藍色離子炮光束猛烈地擊中麵皮護盾,發出了一聲像是汽水開蓋的聲音。護盾劇烈震動,但奇蹟般地擋住了攻擊,只是散發出濃郁的麵香。「這麵皮的延展性!完美!但撐不了太久!」K-999焦急地大喊,中藥味更濃了。廖沾沾知道,他必須帶走他那缸陳年老蒜泥,那是宇宙的希望。他跑到蒜泥缸前,使出他搬運食材的全部力量,將那口比他還胖的缸抱起。「走!K-999!我們要從後院逃跑!別再管你的紅棗枸杞燃料了!」「不行!燃料是文明的基礎!沒了紅棗我飛不遠!」吉娃娃特務抗議。它用小嘴咬住廖沾沾的衣領,同時開啟了它背上的枸杞推進器。推進器發出「滋滋」的輕微煎煮聲,伴隨著一股濃郁的蔘味爆發。廖沾沾抱著蒜泥缸、K-999咬著他,一起從撞出來的洞口衝向後院。王醋狂的醋罐機器人發出尖叫:「別想逃!醬油黨餘孽!我會追上你!」店內剩下的所有空盤子被醋酸氣波震碎,發出了最後的哀鳴。廖沾沾的宇宙冒險,就在這片蒜泥、中藥和醋酸的混亂中,拉開了帷幕。《平行泊車維度:車位爭奪戰》何手殘的人生,被兩個巨大的陰影籠罩著:停車費,以及平行泊車。他那輛老舊的掀背車,彷彿繼承了他所有的駕駛焦慮,從未在他需要時提供過任何幫助。今天,他面臨的是城市傳說中最恐怖的挑戰,一條夾在理髮店與一間專賣金屬雕像的畫廊之間的窄巷。一個看起來比他車子尺寸小上三十公分的停車格,上面還灑著一層可疑的白色粉末。何手殘深吸一口氣。將車子打了倒檔。他的車載語音系統發出了令人不快的女聲:「警告,後方障礙物距離:無限趨近於零。」「請考慮放棄治療。」他忽略了警告,開始緩慢地倒車。他最討厭的不是語音系統,而是那兩塊永遠在關鍵時刻自動收折的後視鏡。當他需要它們來判斷車體與那座價值不菲的銅製獨角獸雕像之間的距離時,它們卻像兩片羞澀的耳朵一樣,優雅地縮了回去。同時發出低語:「你還是別看了,反正你也停不好。」何手殘感覺心臟快要跳出來了。他轉頭看去,發現那座高聳入雲、覆蓋著鏽跡斑斑鐵網的多層機械式停車塔,正 在那片窄巷的盡頭散發出不正常的綠光。這棟停車塔是個異類,它的三號車位始終空著,並且傳說只要有人敢在它面前失敗十八次,就會被傳送到一個泊車地獄。他已經失敗了十七次。現在是第十八次。他打了方向盤,車頭朝著銅獨角獸的方向猛地偏轉。後視鏡發出最後的溫柔提醒:「再見,世界。」他沒有撞上獨角獸,但他那顫抖的車尾卻擦到了停車塔三號車位入口處的 一根古老、佈滿苔蘚的柱子。不是撞擊,而是輕柔的碰觸,像戀人之間的耳語。接著,一道濃郁的、像薄荷口香糖一樣的綠色光芒。猛地從柱子爆發出來,瞬間吞噬了何手殘和他的掀背車。光芒消失後,窄巷恢復了平靜,只剩下獨角獸雕像一臉困惑的表情。何手殘感覺一陣天旋地轉,等他回過神來,他的車子竟然垂直停在一個貼滿了巨大獎狀的牆壁上。獎狀上寫著:「完美倒車入庫獎——第零點零零零零零九度偏差。」落款人是「倒車王」。他趕緊從車窗探出頭,發現周圍不再是熟悉的城市街道,而是一望無際、由無數白線和編號組成的巨大網格。這裡的空氣聞起來像是新買的輪胎和劣質香水的混合物,而重力似乎是隨機變化的,有時感覺很重,有時像漂浮在游泳池裡。他試圖按喇叭,但喇叭發出的不是「叭叭」,而是他童年時學會的、關於泊車口訣的魔性兒歌。四面八方傳來了刺耳的剎車聲,接著,一群穿著反光背心和戴著白色安全帽的人朝他衝來。這些人手裡拿的不是警棍,而是長長的測量尺和巨大的電子角度儀,臉上的表情極度嚴肅。「違反泊車維度基本法!斜停入庫!罪大惡極!」領頭的泊車警察用一個擴音器大喊,聲音充滿機械感。「我、我沒有斜停!我只是垂直停在了牆壁上!」何手殘趕緊為自己辯解,但聲音因為恐懼而顫抖。「垂直泊車?那是在第三次元的行為,在這裡,你的車體與停車線的夾角是——八十九點七度!按照維度法則,你必須接受懲罰!」懲罰的內容是:無限次觀看一部名為**《新手泊車七百次失敗集錦》的紀錄片,直到哭泣為止。就在這時,一輛像是從科幻電影裡開出來的黑色跑車,優雅地從網格的邊緣漂移而過。跑車的輪胎發出令人陶醉的摩擦聲,它以一種近乎蔑視重力的姿態,精準地停進了一個只有它車身尺寸寬度的停車格中。那泊車的過程就像一場舞蹈,流暢、完美,且毫無任何多餘的動作**。跑車的駕駛座上走出一個全身黑色皮衣的女人,她戴著一副透明護目鏡,冷酷地朝著何手殘的方向走來。她的步伐優雅而精準,每一步都像是被測量過一樣,完美地落在網格線上。「車影大人!」泊車警察們立刻立正站好,連測量尺都顫抖著不敢發出聲音。她走到何手殘面前,輕蔑地掃了一眼他那輛垂直貼在牆上的掀背車,語氣冰冷。「新手,你的車技像一團混亂的毛線球。你污染了泊車維度的純粹性。」「但你的後視鏡貼紙——『永不放棄』,讓我看到了一絲愚蠢的勇氣。」車影大人突然掏出一個像是遙控器的裝置,對著何手殘的車子按了一下。何手殘的車子從牆上脫落,在空中旋轉了一百八十度,穩穩地停在了地面上的一個停車格中。這次,夾角是——零度。「你被分配給我的泊車學徒了。如果泊車是一種宗教,你就是那個連方向盤都沒摸過的新信徒。」她指了指旁邊一輛像是巨型嬰兒車的改造車:「這是你的訓練工具,從現在開始,你得學會如何在零點零零一秒內,將這輛車精準停入對面的針眼大小的車位裡。」何手殘看著那輛閃閃發光、還在播放《小星星》的嬰兒車,感到一陣眩暈。泊車維度的生活,比他想象中還要無理頭一百萬倍。《失控的星座運勢與單戀狂想曲》張水瓶從他那張覆蓋著七層舊報紙的單人床上驚醒,不是因為鬧鐘,而是因為屋頂傳來了一陣震耳欲聾的廣播聲。「緊急!緊急!今日星座運勢超級大修正!所有天秤座請注意!由於月球剛剛打了一個噴嚏,您的戀愛機率從昨日的百分之九十九點九,陡降至負百分之八十七!」廣播員的聲音聽起來像是一個正在經歷中年危機的雙子座,充滿了戲劇性的絕望。張水瓶,一個典型的水瓶座,立刻感到一陣恐慌,這是他患有「星座預報壓力症候群」後的標準反應。他單戀著住在隔壁棟、經營一家「平衡美學」咖啡館的林天秤。林天秤完美得像是從黃金分割線中走出來的藝術品。而張水瓶的人生,則像一團被獅子座暴君隨意亂踢的毛線球,充滿了混亂與錯位。他衝到窗邊,往外看去。整座城市已經因為這個突如其來的「超級修正」而陷入了荒謬的混亂。街道上的雙魚座們,開始不受控制地流下鹹鹹的海水淚,他們無法停止地哭泣,導致城市低窪處已經形成了小型潟湖。那些摩羯座的上班族,嚴格遵守著廣播中「摩羯座今天適合原地踏步,否則將失去襪子」的指令。數百名西裝筆挺的摩羯座正整齊地站在原地,他們的鞋子裡裝滿了已經潮濕的淚水。「負百分之八十七?」張水瓶喃喃自語,感到胃部一陣翻騰,他知道這代表著什麼。林天秤的運勢越差,他那股積壓已久、無處安放的單戀能量就會越發瘋狂地實體化。上次林天秤的戀愛運勢跌至百分之二十,張水瓶就發現他的廚房裡長滿了巨大的、形狀是林天秤側臉的粉紅色蘑菇。他必須在今天結束前,將林天秤的運勢至少提升到零。否則,他那份單戀就會變成某種具備攻擊性的實體。他緊張地跑進他堆滿了星座圖表和過期甜甜圈的地下室,那裡放著他的秘密武器。「我需要星象學輔助儀!」他衝到一個像是老式彈珠臺的機器前,上面貼滿了「巨蟹座已哭」、「處女座勿碰」等警告標籤。這是他用廢棄的唱片機和一個不知名的外星計算器改造而成的「情感調節器」。他必須輸入一種極具感染力的正面情緒作為燃料,來抵抗那負面的運勢波。「水瓶座的優勢,就是超脫一切的理性與冷靜…才怪!我只有一腔熱血的傻氣啊!」他絕望地低吼。他看了一眼腳邊。那裡放著一個他為林天秤準備了兩年的禮物:一個用一萬塊小小的天秤座黃銅齒輪組成的音樂盒。他從未送出,因為害怕被拒絕。這份害怕,就是純度最高的單戀情感。張水瓶咬緊牙關,將那個黃銅齒輪音樂盒砸爛,將所有的齒輪都倒入「情感調節器」的輸入口。機器發出刺耳的尖叫,接著,彈珠臺上的燈光開始瘋狂閃爍,發出警告。「能量超載!檢測到極致純粹的單戀能量!目標:提升天秤座運勢!」在機器的頂部,一個巨大的、像彩虹一樣的光束筆直地射向天空。然而,就在光束衝出屋頂的一瞬間,一輛塗滿了金色、裝飾著巨大公牛角的悍馬車猛地停在咖啡館門口。駕駛座上走下一個全身肌肉、戴著鑽石項圈的男人,那人正是林天秤的狂熱追求者——金牛座霸總牛土豪。牛土豪一腳踢開咖啡館的門,大聲宣布:「天秤!別管那什麼負運勢!我已經用一百噸的純金箔買下了今天所有的壞運氣!」「從現在開始,你的運勢由我主宰!我的金錢,就是你的正面能量!」牛土豪的行為,讓張水瓶的光束在空中瞬間扭曲,與一種夾雜著銅臭味的金色光芒對撞。天空開始下起了荒謬的雨。雨點不是水,而是閃耀著淚光的小小黃銅齒輪。「不行!金牛座的物質力量太強了!我的單戀被汙染了!」張水瓶大喊。他知道,如果牛土豪的物質力量勝出,林天秤將會被困在一個充滿金錢和俗氣的虛假愛情裡,而他將永遠失去機會。張水瓶看向那機器,還剩下最後一個可以輸入的「情緒燃料」口。他迅速撕下了貼在他背後衣領上,那張寫著「我就是個單戀傻瓜」的標籤,丟了進去。他必須用自己最真實的「傻氣」去對抗金牛座的「霸氣」!調節器再次發出轟鳴,這一次,射向天空的光束不再是彩虹色,而是充滿了水瓶座特有的怪誕藍色**。藍色光束與金色光芒在空中形成了一個巨大的、旋轉著的太極圖案,像是在爭奪林天秤的靈魂。這場以星座運勢為賭注、以單戀能量為武器的荒唐戰爭,正式打響了。藍色與金色的光芒在林天秤咖啡館上空劇烈衝撞,創造出一個不斷旋轉的怪異氣旋。沒發明的坑, 有必定掉敗風險,直接在硬件上做修改,難度較高 。
除非搞到喂狗指令,否則這個狗是很難繞曩昔了,我決議先廢棄尋覓關狗的計劃。
0×05軟件體系
接上去我重要研討的內在的事務就是剖析整套軟件。剖析其軟件組成,軟件包,庫,驅動,內核模塊。
了解一下狀況掛載點
I have no name!@(none) ~$ df -k
Filesystem 1K-blocks Used Available Use% Mounted on
ubi0:rootfs 182808 155908 22064 88% /
mdev 86372 0 86372 0% /dev
none 5120 12 5108 0% /tmp
shm 86372 8 86364 0% /dev/shm
rwfs 512 236 276 46% /mnt/rwfs
rwfs 512 236 276 46% /var
ubi1:pss1 5960 64 5556 1% /pss1
ubi2:pss2 5960 32 5588 1% /pss2
Ubi0:rootfs是根文件體系,他的文件體系是ubifs,這是一套專門為NAND Flashdesign的文件體系,具有壞塊治理效能。
pss1和pss2里面文件未幾,構造一樣,估量2是1的備份。
I have no name!@(none) ~$ ls -li /pss1
total 52
65 -rwx—— 1 root root 33 Jan 1 00:00 DIAG_PSS_CODING.pss
66 -rwx—— 1 root root 33 Jan 1 00:00 FEATURE_MANAGER_PSS_BLK.pss
67 -rwx—— 1 root root 9 Jan 1 00:00 HMI_BT_A2DP_ONOFF_STATUS_PSS_BLK.pss
68 -rwx—— 1 root root 9 Jan 1 00:00 HMI_BT_ONOFF_STATUS_PSS_BLK.pss
69 -rwx—— 1 root root 9 Jan 1 00:00 HMI_BT_VISIBLE_ONOFF_STATUS_PSS_BLK.pss
119 -rwx—— 1 root root 9 Jan 1 00:00 HMI_EXLAP_SERVER_ONOFF_PSS_BLK.pss
150 -rwx—— 1 root root 2298 Jan 1 00:01 HMI_SYSTEM_APP_CONNECTION_PLIST_PSS_BLK.pss
118 -rwx—— 1 root root 10 Jan 1 00:00 HMI_SYSTEM_SAFECODE_ASSEMBLY_UNLOCK_PSS_BLK.pss
117 -rwx—— 1 root root 9 Jan 1 00:00 HMI_SYSTEM_SAFECODE_REMAINING_ATTEMPT_PSS_BLK.pss
70 -rwx—— 1 root root 28 Jan 1 00:00 HMI_SYSTEM_SETUP_PSS_NEWBLK.pss
71 -rwx—— 1 root root 78 Jan 1 00:00 TM_PSS_BT_FRIENDLY_NAME_PSS_BLK.pss
75 drwx–x–x 2 messageb messageb 1408 Jan 1 00:00 config
90 -rwxr-xr-x 1 messageb messageb 22 Nov 23 2016 hmi_autotest.ini
146 -rw-r–r– 1 root root 393 Jan 1 00:00 stdplus.ini
I have no name!@(none) ~$ ls -li /pss2
total 52
65 -rwx—— 1 root root 33 Jan 1 00:00 DIAG_PSS_CODING.pss
66 -rwx—— 1 root root 33 Jan 1 00:00 FEATURE_MANAGER_PSS_BLK.pss
67 -rwx—— 1 root root 9 Jan 1 00:00 HMI_BT_A2DP_ONOFF_STATUS_PSS_BLK.pss
68 -rwx—— 1 root root 9 Jan 1 00:00 HMI_BT_ONOFF_STATUS_PSS_BLK.pss
69 -rwx—— 1 root root 9 Jan 1 00:00 HMI_BT_VISIBLE_ONOFF_STATUS_PSS_BLK.pss
70 -rwx—— 1 root root 9 Jan 1 00:00 HMI_EXLAP_SERVER_ONOFF_PSS_BLK.pss
71 -rwx—— 1 root root 2298 Jan 1 00:00 HMI_SYSTEM_APP_CONNECTION_PLIST_PSS_BLK.pss
72 -rwx—— 1 root root 10 Jan 1 00:00 HMI_SYSTEM_SAFECODE_ASSEMBLY_UNLOCK_PSS_BLK.pss
73 -rwx—— 1 root root 9 Jan 1 00:00 HMI_SYSTEM_SAFECODE_REMAINING_ATTEMPT_PSS_BLK.pss
74 -rwx—— 1 root root 28 Jan 1 00:00 HMI_SYSTEM_SETUP_PSS_NEWBLK.pss
75 -rwx—–而現在,一個是無限的金錢物慾,另一個是無限的單戀傻氣,兩者都極端到讓她無法平衡。- 1 root root 78 Jan 1 00:00 TM_PSS_BT_FRIENDLY_NAME_PSS_BLK.pss
78 drwxr-xr-x 2 root root 304 Jan 1 00:00 app_data
76 -rwxr-xr-x 1 root root 22 Jan 1 00:00 hmi_autotest.ini
77 -rw-r–r– 1 root root 393 Jan 1 00:00 stdplus.ini
I have no name!@(none) ~$
看文件名猜想應當是與軟件設置裝備擺設相干的一些工具。
再了解一下狀況/dev目次,都有什么裝備。
I have no name!@(none) ~$ ls /dev
apm_bios loop7 mxc_vpu ttymxc她從吧檯下面拿出兩件武器:一條精緻的蕾絲絲帶,和一個測量完美的圓規。3
console mem mxs_viim ttymxc4
cpu_dma_latency mtd0 network_latency ttyp0
crypto mtd0ro network_throughput ttyp1
event0 mtd1 null tuner_knob
event1 mtd1ro pts ubi0
fb mtd2 ptyp0 ubi0_0
fb0 mtd2ro ptyp1 ubi1
fb1 mtd3 ram0 ubi1_0
full mtd3ro ram1 ubi2
galcore mtd4 ram2 ubi2_0
i2c-0 mtd4ro ram3 ubi_ctrl
i2c-2 mtd5 random uinput
i2c-3 mtd5ro sda urandom
kmem mtdblock0 sda1 usbdev1.1
kmsg mtdblock1 shm usbdev1.2
loop0 mtdblock2 snd v850srq
loop1 mtdblock3 spidev0.0 video
loop2 mtdblock4 tracebuf video0
loop3 mtdblock5 tty video1
loop4 mxc_asrc ttymxc0 video16
loop5 mxc_ipu ttymxc1 video17
loop6 mxc_mem ttymxc2 zero
fb(framebuffer)是顯存。
event0和event1能夠是鍵盤和觸摸板。
3個i2c接口,用處不明,能夠是設置裝備擺設功放芯片,攝像頭芯片或許觸摸板,收音機等用處。
一個spi接口,經由過程剖析/opt/libHAL.so發明是與MCU通訊用的。
tuner_knob,能夠與後面板兩個旋鈕相干。
v850srq,這個看稱號就了解確定也和MCU相干,由於阿誰瑞薩的MCU代號是RH850,而這個MCU的指令集就是NECV850,IDA剛好支撐這個指令集。
video裝備能夠就是倒車攝像頭芯片ADV7182的接口。
再了解一下狀況etc/rc.d目次,有一些體系領導劇本,文件未幾,很好剖析。
I have no name!@(none) ~$ ls /etc/rc.d/
init.d rc.local rc.serial rcS rc_gpu.S
rc.conf rc.modules rc.ts rc_mxc.S
I have no name!@(none) ~$ ls /etc/rc.d/init.d
boa dropbear mdev portmap udev
depmod filesystems mdev_bak settime
devfsd hostname modules smb
dhcp hotplug mount-proc-sys sshd
dhcpd inetd network syslog
I have no name!@(none) ~$
我可以修正此中的rcS劇本,在里面拔出一個read-t 指令,如許我就可以打斷Linux體系的領導,來制造一個failsafe形式。這個形式有什么用呢?實在就是為了避免后面的修正犯錯,招致體系直接瓦解失落了。有這個failsafe形式,我就可以回退修正。例如還沒進進終端體系就瓦解了,我只能在uboot形式恢復體系了,會很費事的。
可是臨時這個修正沒有效,由於需求喂狗法式,這個法式在哪,是哪個法式,我都不克不及斷定……先算是一個思緒吧。
了解一下狀況/opt目次
I have no name!@(none) ~$ ls /opt
AndroidAuto g_ether.ko mfid
aoa_adapter g_file_storage.ko net_windows.sh
asix.ko g_hid.ko nw_vmf_ctrl.dat
audio_proc g_iap_ncm_audio.ko nw_vmf_trace.dat
bt g_iap_ncm_eap.ko pss
camera gresfiles pwr_agent
carlife_daemon hal_init ringtone
carplay_App hmi sc_db.db
carplay_testmode.sh hmi.bak screenshot
carplayd hmi_autotest.ini sourceme.sh
cdc_ncm.ko i2cdetect start_carlife.sh
clear-cache.sh iap2d start_carplay.sh
config iperf start_mdnsd.sh
connect_mgr launch.sh stdplus.ini
data launch_aa.sh sysupdate
diag lib test.sh
diag_eol libcidb_sdk.so tools
eol_test.wav md_adapter usbnet.ko
exlap mdnsd vgw
feature_config.ini media vmf
ftpdup2.sh memtool
這里面都是車機的利用法式,有庫,設置裝備擺設,圖片字體資本文件,各類劇本……
先了解一下狀況正在跑的都有哪些法式吧。ps -ef
I have no name!@(none) ~$ ps -ef
PID USER TIME COMMAND
1 root 0:00 init
2 root 0:00 [kthreadd]
3 root 0:00 [ksoftirqd/0]
4 root 0:00 [kworker/0:0 ]
5 root 0:00 [kworker/u:0]
6 root 0:00 [migration/0]
此刻,她看到了什麼?
7 root 0:00 [khelper]
8 root 0:00 [kworker/u:1]
235 root 0:00 [sync_supers]
237 root 0:00 [bdi-default]
239 root 0:00 [kblockd]
271 root 0:00 [imx6q-ecspi.0]
274 root 0:00 [imx6q-ecspi.1]
281 root 0:00 [khubd]
298 root 0:00 [ipu1_task]
299 root 0:00 [ipu1_task]
327 root 0:00 [usb_wakeup thre]
329 root 0:00 [otg_switch]
341 root 0:00 [kswapd0]
402 root 0:00 [fsnotify_mark]
411 root 0:00 [crypto]
467 root 0:00 [kapmd]
507 root 0:00 [mtdblock0]
512 root 0:00 [mtdblock1]
517 root 0:00 [mtdblock2]
522 root 0:00 [mtdblock3]
527 root 0:00 [mtdblock4]
532 root 0:00 [mtdblock5]
540 root 0:00 [ubi_bgt0d]
572 root 0:00 [vpu_wq]
577 root 0:00 [galcore workque]
578 root 0:00 [kworker/0:1]
579 root 0:00 [galcore daemon ]
580 root 0:00 [galcore daemon ]
646 root 0:00 [scsi_eh_0]
647 root 0:00 [usb-storage]
723 root 0:00 [kworker/u:2]
725 root 0:00 [kworker/0:2]
756 root 0:00 race_daemon sda true /devices/platform/fsl-ehci.0/usb1/1-
788 root 0:00 [ubi_bgt1d]
792 root 0:00 [ubi_bgt2d]
795 root 0:00 [ubifs_bgt1_0]
798 root 0:00 [ubifs_bgt2_0]
808 root 0:00 ./vmf
811 root 0:00 ./pwr_agent -o -v
812 root 0:00 ./sysupdate
825 root 0:00 ./mfid
833 root 0:00 -sh
842 root 0:00 ./vgw
848 root 0:00 [irq/283-atmel_m]
872 root 0:02 ./hmi
874 root 0:03 ./media
876 root 0:00 ./ pss
880 root 0:00 ./audio_proc
919 root 0:02 ./bt
921 root 0:00 ./exlap
958 root 0:02 /usr/bin/devicemanager 5 0 /usr/bin 239 393247 1 1 0 0 0
967 root 0:00 [race_daemon]
981 root 0:00 ./diag
983 root 0:00 ./diag_eol
987 root 0:00 ./screenshot
992 root 0:00 [flush-ubifs_1_0]
993 root 0:00 [flush-ubifs_2_0]
998 root 0:00 ./mdnsd -debug
1009 root 0:00 ./connect_mgr
1014 root 0圓規刺中藍光,光束瞬間爆發出一連串關於「愛與被愛」的哲學辯論氣泡。:00 ./carplay_App
1021 root 0:00 ./iap2d
1024 root 0:00 ./carlife_daemon
1026 root 0:00 ./carplayd
1050 root 0:00 {clear-cache.sh} /bin/sh ./clear-cache.sh
1095 root 0:00 [flush-8:0]
1106 root 0:00 sleep 2
1107 root 0:00 ps -ef
發明有良多過程,由于名字都是縮寫,很難直接猜出這些法式的用處。例如vmf、mfid、vgw、hmi、exlap、diag等等這些都是鬼?他們年夜多沒有-h –help 之類能顯示信息的參數可用,想了解他們的用處,估量是要上IDA逆向一下……
顛末了幾天的研討,我終于了解了部門焦點法式的用處。
他這套軟件,年夜部門都是在后臺任務的,只要少部門是QT編寫的,有界面的。例如hmi和sysupdate。此中hmi體積最年夜,他就是界面主法式,他包括了一切的圖形資本,多國說話字符串。
其他法式基礎都沒有界面,界面實在都是在hmi中。UI過程和邏輯過程之間應用相似IPC的新聞機制,這個機制在這套體系中稱為vmf。
阿誰vmf法式,起到一個新聞直達站的感化,vmf能夠是Virtual Message Function的縮寫?他有Usage信息,顯示的是vmffor linux version DOMAIN-SOCKET。
/opt/lib/libvmf_client.so這個就是vmf客戶端支撐庫,良多法式經由過程挪用libvmf_client.so的nw_vmf_send/receive函數來完成跨過程的IPC新聞傳遞,這套新聞機制是基于socket。在/tmp/目次有良多127.X.X.X文件,能夠與此相干。在文章后面,我將具體剖析這套API的原型和新聞數據構造。
I have no name!@(none) ~$ ls /tmp
127.0.0.1 127.3.215.1 allgorpccomm1
127.3.104.1 127.3.219.1 carlife
127.3.106.1 127.3.241.1 devmgr_debug.txt
127.3.106.2 127.3.246.1 diag_enter_main
127.3.106.3 127.3.246.2 diag_initialize_OK
127.3.106.4 127.3.40.1 eol_enter_main
127.3.106.5 127.3.40.2 hdd
127.3.106.6 127.3.40.4 icr_device_process.txt
127.3.106.7 127.3.43.1 keyGenerationFile
127.3.106.8 127.3.44.1 race
127.3.106.9 127.3.74.1 race_key_gen_file.txt
127.3.108.1 127.3.74.2 shm_key_gen.txt
127.3.112.1 127.4.0.1 shm_key_index.txt
127.3.112.2 127.4.2.1 vaf_comm_mirrorlink
127.3.151.1 DevMgrRunning.txt var
127.3.153.1 MFISocket vmf_trace_startup
127.3.153.2 RPCClient1026
127.3.213.1 RPCSocket
pwr_agent,從名字看,顯然是電源治理相干,我一向以為就是這個過程,在不竭地與MCU通訊,喂狗。
我用IDA把他逆了個遍,他確切有這個舉措,可是他只是結構了個新聞包,包發給了誰并不了解……他實在不但是電源治理,在/opt/launch.sh劇本中可以發明,劇本履行了vmf hal_init pwr_agent sysupdate mfid,就沒有了。實在年夜大都過程,都是由pwr_agent帶起來的,這在IDA逆向中能發明。
.rodata:00011183 ALIGN 4
.rodata:00011184 DCD a_Diag+8 ; ""
.rodata:00011188 DCD a_VgwDevNull21 ; "./vgw > /dev/null 2>&1 &"
.rodata:0001118C DCD a_PssDevNull21 ; "./pss > /dev/null 2>&1 &"
.rodata:00011190 DCD a_MediaDevNull2 ; "./media > /dev/null 2>&1 &"
.rodata:00011194 DCD a_Diag+8 ; ""
.rodata:00011198 DCD a_Audio_procDev ; "./audio_proc > /dev/null 2>&1 &"
.rodata:0001119C DCD a_BtDevNull21 ; "./bt > /dev/null 2>&1 &"
.rodata:000111A0 DCD a_Diag+8 ; ""
.rodata:000111A4 DCD a_HmiDevNull21 ; "./hmi > /dev/null 2>&1 &"
.rodata:000111A8 DCD a_WifiDevNull21 ; "./wifi > /dev/null 2>&1 &"
.rodata:000111AC DCD aCatProcDeferre ; "cat /proc/deferred_initcalls"
.rodata:000111B0 DCD a_Diag_eolDevNu ; "./diag_eol > /dev/null 2>&1 &"
.rodata:000111B4 DCD a_Audio_procDev ; "./audio_proc > /dev/null 2>&1 &"
.rodata:000111B8 DCD a_DiagDevNull21 ; "./diag > /dev/null 2>&1 &"
.rodata:000111BC DCD a_ScreenshotDev ; "./screenshot > /dev/null 2>&1 &"
.rodata:000111C0 DCD a_Start_carplay ; " ./start_carplay.sh > /dev/null 2>&1 & "
.rodata:000111C4 DCD a_Connect_mgrDe ; "./connect_mgr > /dev/null 2>&1 &"
.rodata:000111C8 DCD a_Carlife_daemo ; "./carlife_daemon > /dev/null 2>&1 &"
.rodata:000111CC DCD a_ExlapDevNull2 ; "./exlap > /dev/null 2>&1 &"
.rodata:000111D0 DCD a_Launch_aa_shD ; "./launch_aa.sh > /dev/null 2>&1 &"
.rodata:000111D4 DCD a_Net_windows_s ; "./net_windows.sh > /dev/null 2>&1 &"
.rodata:000111D8 DCD a_ClearCache_sh ; "./clear-cache.sh > /dev/null 2>&1 &"
.rodata:000111DC DCD a_Start_mdnsd_s ; "./start_mdnsd.sh > /dev/null 2>&1 &"
hal_init,這個過程很簡略,只是挪用了libHAL.so庫中的一些初始化函數就停止了。
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // r0@1
int v4; // r0@1
int v5; // r0@1
v3 = hal_gpio_init(argc, (int)argv, (int)envp);
v4 = hal_i2c_init(v3);
v5 = hal_spi_init(v4);
hal_uart_init(v5);
return 0;
}
vgw,這是要害過程,我發明把自殺了,體系過一會就重啟,所以他是喂狗嫌疑對象。經由過程逆向,發明他挪用了libHAL.so里面的spi_ipcl_read、spi_ipcl_write等函數,經由過程Search And Replace搜刮全部opt目次也證明,只要vgw法式挪用了下面的spi_ipcl_read/write接口。這個vgw是什么縮寫,我沒找到,能夠是Vehicle Gateway或許VIP Gateway?感到這種說明不太靠譜……
/opt/lib目次就是這套法式的庫文件了。
I have no name!@(none) ~$ ls /opt/lib
bt libOSAL.so
libAirPlay.so libOSAL.so.1
libAirPlayS「我必須親自出手!只有我能將這種失衡導正!」她對著牛土豪和虛空中的張水瓶大喊。upport.so libOSAL.so.1.0
libCarPlayAudio.so libOSAL.so.1.0.0
libCarPlayClient.so libdns_sd.so
libCarPlayDevice.so libiap2.so
libCarPlayPlatform.so libmfi.so
libCarPlayPlatformDevice.so libprotobuf-c.so
libCarPlayPlatformMFI.so libprotobuf-c.so.1
libCarPlayPlatformScreen.so libvmf_client.so
libCarPlayPlatformSystem.so libvmf_trace.so
libHAL.so libximage.so
libHAL.so.1 libximage.so.1
libHAL.so.1.0 libximage.so.1.0
libHAL.so.1.0.0 libximage.so.1.0.0
libHAL.so.1.0.0.bak media
libHAL.so.1.0.0.read mirrorlink
libHAL.so.1.0.0.write screenshot
重點追蹤關心此中的2個,libOSAL.so和libHAL.so,前者是操縱體系支撐庫,能夠是為了便利跨平臺開闢,將一些體系級API從頭封裝了一下,例如線程,按時器,互斥鎖等。后者是硬件層面的接口,包含uart,spi,gpio,i2c等接口的讀寫函數封裝。其他都是carplay carlifemirrorlink等法式的支撐庫。
/opt里面良多法式都被strip失落了符號表。在IDA剖析時沒有符號輔助,很難搞懂一些函數的感化,還好這些法式都挪用了日志接口log_optional來打印日志,是以能獲知一些函數的真正的名字,以及他們的用處。好比上面這個例子:
顯然,得知這個函數名字叫pwr_agent_vmf_rcv_handle_round_comm,日志種別是radio_updown。
log_optional的新聞打印是受設置裝備擺設文件把持的,這些設置裝備擺設文件以過程名作為區分,位于/opt/config或/pss1/config
例如上面這個pwr_agent的config
I have no name!@(none) ~$ cat /pss1/config/pwr_agent.conf
[OPTION]
ENABLE=1 <<<<<<<<<<留意這里
CATALOG=0
FILE=0
FUNC=1
LINE=0
PROCNAME=0
TIME=1
SEC_DIGIT=2
TIME_FMTSTR=%M:%S
SAVESD=0
[OUTPUT] <<<<<<<<<<留意這個末節
start_trap=1
OPTION=1
INI=1
radio_updown=1 <<<<<<<<<<留意這里的名字radio_updown
net_rtc=1
VIP=1
debug=1
health=1
DTC=1
msg=0
sync=0
[TEXT]
health=39
radio_updown=39
start_trap=39
OPTION=39
INI=39
DTC=39
VIP=39
[BACKGROUD]
health=49
radio_updown=49
start_trap=49
OPTION=49
INI=49
DTC=49
VIP=49
[ATTRIBUTE]
health=-1
radio_updown=-1
start_trap=-1
OPTION=-1
INI=-1
DTC=-1
VIP=-1
可見有良多開關,把持了哪些debug新聞需求打印,哪些不打印。把一些需求的開關翻開,可以 便利逆向剖析任務。重要開關就是ENABLE=1,OUTPUT是種別把持,把持對應的種別的日志要打印出來。
/opt/ftpdup2.sh這個劇本很有興趣思,他insmod了asix.ko,然后用ifconfig設置裝備擺設了ip地址,還啟動了ftp辦事。看來是開闢職員為了便利收集傳輸文件留上去的。這個asix.ko是ASIX的usb轉以太網芯片的驅動,良多罕見的USB轉網口的產物都是用ASIX芯片計劃,例如綠聯的USB百兆網卡。
I have no name!@(none) ~$ cat /opt/ftpdup2.sh
#!/bin/sh
#insmod mii.ko
#insmod usbnet.ko
insmod asix.ko
ifconfig eth0 192.168.5.1 up
while [ $? -ne 0 ]
do
sleep 1s
ifconfig eth0 192.168.5.1 up
done
echo network up at 192.168.5.1
cd /bin
if [ ! -e /bin/ftpd ]
then
ln -s busybox ftpd
fi
if [ ! -e /bin/tcpsvd ]
then
ln -s busybox tcpsvd
fi
cd /opt
tcpsvd -vE 0.0.0.0 21 ftpd -w &
我試著運轉了一下,確切把網卡帶起來了……
/opt還有一些usbgadget驅動法式,例如g_ether.ko和g_file_storage.ko,由于這臺機械後面板的USB接話柄際上是CPU的USB_OTG接口,是以我猜忌開闢職員用這個驅動,直接把USBOTG虛擬成MassStorage或許網卡,與開闢機用USB線連起來就能傳文件了,是不是很有興趣思……
別的我還在/opt/tools發明了兩個小法式
I have no name!@(none) ~$ ls -li /opt/tools/
total 16
16350 -rwxr-xr-x 1 messageb messageb 7555 Nov 23 2016 vmf_rcv
16349 -rwxr-xr-x 1 messageb messageb 7038 Nov 23 2016 vmf_send
Search AndReplace搜刮后發明,這兩個法式并沒有被任何法式或劇本應用,應當是開闢職員在開闢或調試時留下的,有興趣思……這個vmf_send很有效,后面會用到。
0×06進級包剖析
不了解網友有什么渠道,拿到了還沒有發布的187B的進級包,上 傳到了網上,可以在百度網盤、或QQ群,找到這些進級包。用進級包給187A進級后,可以比原體系多出很多高等效能。好比蘋果CarPlay,百度CarLife,還有什么超等藍牙,我也沒用過,不了解詳細是怎么個超等法…
網友放出來的這些進級包,現實上能夠都是開闢階段的測試包,有良多bug。有一個固件請求運轉內存是512M,在256M的機械上刷了會變磚。另一個固件包支撐256M內存,但也是Bug最多的版本。所以良多網友把天寶187A的機械換了內存,還有一些商家供給此類換內存辦事,或許售賣曾經換好內存的車機。
別的有多數商家有5314版本的進級包,這個版本與上市后的187B體系版原形同,估量算是正式版。可是這個進級包在網上找不到,貌似只把握在多數以刷機為盈利目標的商家手上,且不過賣,在咸魚上賣的5314聽說都是假包。
接上去研討一下進級包的結構,進級包實在就是一個tar包,沒有簽名。
例如這個版本的包用7z翻開是如許
用戶名組名是wangshi,王石?看來制作進級包的體系,有是一個叫wangshi的用戶,也許這個也是那位工程師的真正的姓名……
看一下根目次的config.txt文件
kernel_update:1
bootloader_update:1
vip_update:1
bt_update:1
middleware_update:1
[file]:[opt]
[file]:[etc]
[file]:[usr]
[file]:[mirrorlink]
[file]:[lib/firmware]
好簡略的design,一目了然啊……
此中的vip_update實在指向的是vipImage.bin,鉅細1MB,文件末尾有哈希。這正好是瑞薩MCU的Flash鉅細,那么這個MCU在軟件外部就是被叫做VIP咯,VIP是什么呢?Very Important Processor?Vehicle InformationProcessor?
實在假如了解了這個MCU的地址空間布局,完整可以拖進IDA逆向一下,了解一下狀況里面的詳細完成……不外顛末后來一番剖析,曾經了解了VIP的年夜致感化:CAN總線通信,成分信息,電源治理等等。成分信息包含零件號,平臺(PQ/MQB),序列號,車型(VW/SKODA)等。
此刻了解這個MCU的代號實在就是VIP了,並且在剖析軟件法式的經過歷程中,有良多字符串提到了VIP,那么我在后面文章就以VIP來稱號吧。
bt_update就是藍牙了,這個機械的藍牙模塊是ALPS的一款模塊,網上找不就任何材料。與CPU的通信是經由過程UART串口。進級包bt_ac_firm目次里面的文件就是藍牙把持芯片的固件了。
middleware就是中心件了,也就是opt那些目次,想籠罩哪個目次,寫進config.txt就可以了。
進級包還有一個設置裝備擺設文件/opt/stdplus.ini。
[Version]
AP_VER=5.4.1.1
CUSTM_PQ=Y307
CUSTM_MQB=Y307
UBOOT_VER=uboot_1.3.2
UIMAGE_VER=uImage_5.0.11
KERNL_VER=3.0.35
BT_VER = C150
VIPAP_VER=5.4.1.1
VIPBL_VER=2.0.2
[Upgrade]
PACK_TYPE=VW_PQ_PSS
[CODING]
BT=0
CODINGS=0
里面有兩個字段是必需的,Version末節的AP_VER字段,不克不及與主機/opt/stdplus.ini分歧,不然sysupdate進級時會提醒變量沖突。有Upgrade末節的PACK_TYPE,必需與主機/opt/stdplus.ini堅持分歧,不然不克不及進級。
其他字段都是可選的,依據進級需求設定即可。
別的進級包里面有一個script目次,里面有兩個劇本。
看名字很不難猜得出,一個劇本是更換新的資料前履行,一個是更換新的資料后履行。
別的還有一個有興趣思的處所,用7z解緊縮阿誰kernelImage,記事本翻開,搜Linuxversion,可以看到編譯職員的機械名和用戶名,如圖。
看,機械名是HP-640,用戶名是changchun,莫非內核編譯職員來自長春?
進級包的構造明白了,再經由過程逆向/opt/sysupdate,就對更換新的資料經過歷程有了進一個步驟清楚。
0 ×07更換新的資料流程剖析
經由過程逆向/opt/sysupdate可以對更換新的資料流程有個年夜致清楚,詳細的逆向剖析流程我未幾說了,他這個法式是qt寫的,在log_optional這個日志打印函數的輔助下,很不難逆向/跟蹤出詳細流程。流程年夜致就是:驗證包符合法規性,設置/sysupdate/flag.ini更換新的資料標志,保留包文件名,重啟體系,重啟后rcS劇本檢討flag.ini文件,得知需求更換新的資料體系,然后走更換新的資料體系流程,啟動sysupdate。sysupdate履行run_before_app_update_sh,刷內核(拜訪/dev/mtd,不是經由過程dd),調換中心件(hostapp),刷bootloader(挪用kobs-ng號令),履行run_after_app_update_sh,刷藍牙(uart傳輸),刷VIP(spi傳輸)。
這個更換新的資料流程中的重啟,很有興趣思,不是挪用的reboot號令,而是硬重啟!
我翻開了sysupdate的log日志效能,經由過程日志輸入,可以年夜致斷定他是經由過程挪用SendUpdateStatus(this, 1)來完成重啟的,由於打印了這個日志就就沒有日志了。
SendUpdateStatus這個函數收回了一個vmf新聞,能夠被vgw接受了,然后被vgw轉手發給了VIP,由VIP觸發了重啟舉措。這個函數的名字是SendUpdateStatus,發送更換新的資料狀況。估量VIP還追蹤關心了更換新的資料的狀況,可以或許依據更換新的資料狀況來發生分歧的舉措,而這個狀況1,就對應著復位CPU。
別的我還發明,一旦這個號令收回往重啟了CPU,狗就被關起來了!電源不會每隔60秒被重置一次,這是一個很有興趣思的發明!
0×08破解通信協定
此刻了解的情形就是,pwr_agent確定有一個按時器,每隔一段時光喂狗,sysupdate能告訴VIP更換新的資料狀況,當狀況為1時,VIP就關失落了狗。
此刻就有了兩種措施關狗,一個是應用喂狗協定,一個應用進級狀況協定。都是經由過程協定,此刻沒有協定,怎么辦呢,想措施抓到通信協定就好辦了。
與VIP通信的是vgw過程,IDA了解一下狀況他里面的函數,有幾個spi_ipcl_xxx的函數惹起了我的留意,看來是經由過程挪用libHAL.so的spi_ipcl_xxx讀寫函數完成通信。前后找了下,沒有可以應用的log打印。
再了解一下狀況libHAL.so的spi_ipcl_write,居然有日志打印,這太好了……
spi_ipcl_read也挪用了這個IPCL_Print_Msg,第三個參數把持了能否輸入日志,惋惜被傳了0,估量是一個宏開關,被編譯時指定的。這難不住我,用WinHex把對應的指令字節碼改失落。
有兩種改法,改IPCL_Print_Msg內部call的傳參,也就是0改成1,把MOV R2指令改成 MOV R2,#0就可以了;還可以進進IPCL_Print_Msg外部往改,往失落對第三個參數的判定,也就是將後面的LDMEQFD指令改成NOP。
由于IPCL_Print_Msg并不克不及打印出這個新聞是read仍是write,是以我應用前一種改法,改出2個文件,libHAL.so.read和libHAL.so.write,并備份原機文件為libHAL.so.bak。別的這個printf的fmt是“ %x ”,輸入內在的事務會很不友愛,我改成了 “%02x ”。
有了如許3個文件,我就隨時可以依據一條shell號令來調換libHAL文件。
恢復libHAL
mount -o r emount rw / && cd /opt/lib && cp libHAL.so.1.0.0.bak libHAL.so.1.0.0
設置IPCL read
mount -o remount rw / && cd /opt/lib && cp libHAL.so.1.0.0.read libHAL.so.1.0.0
設置IPCL write
mount -o remount rw / && cd /opt/lib && cp libHAL.so.1.0.0.write libHAL.so.1.0.0
由于我調換的是體系要害庫,為了防止過錯產生,我修正了啟動劇本rcS,參加了一個failsafe平安形式效能。改法是如許的
如許修正后,在體系啟動時,我有一秒時光來輸出y回車來進進平安形式,避免修正/opt/lib庫文件招致體系要害過程無法啟動、體系瓦解。不外由於沒有喂狗,這個平安形式是有時光限制的,復制粘貼下面的指令能敏捷幫我復原備份文件。
起首我調換了libHAL.so.write文件,重啟后串口終端確切打印了大批通訊報文。我發明每隔1秒都有一個8字節的報文送出,且有相似遞增序號的字節,沒錯這必定是在喂狗!
別的我也抓到了sysupdate在挪用SendUpdateStatus(xxx,1)關狗并重啟時的8字節報文。也在下面的圖片中
這些報文都是vgw過程經由過程spi_ipcl_write向VIP寫進的。而這些報文的現實倡議者實在并不是vgw。喂狗是pwr_agent倡議的。關狗重啟是sysupdate倡議的。
固然我可以經由過程挪用libHAL.so的spi_ipcl_write來完成我想要的喂狗和關狗效能了,可是這要編譯一個小法式,編譯法式需求預備穿插編譯周遭的狀況,還要把這個法式放出來……呀,好費事……
為了表現我的高端,我還進一個步驟研討了過程間的通信,也就是阿誰vmf新聞。好比這個喂狗流程應當是如許的:pwr_agent按時器,結構了一個包,發給了張水瓶和牛土豪這兩個極端,都成了她追求完美平衡的工具。vmf,vmf轉給了vgw,vgw經由過程spi喂狗。
是不是很復雜?沒錯,廠商確切是如許design的,這套新聞也確切是如許任務的……由於我把vmf殺失落,vgw就收不到新聞,不再喂狗了。
起首我想用sysupdate來睜開剖析任務,我感到我對這個法式清楚的更多一些。我先用IDA定位到SendUpdateStatus(int this, int arg_status)。這個函數第二個參數就是狀況值,有1、2、3、4、5、6、7……之類的,在這里關狗重啟status值為1。他結構了一個5字節的包,傳給了UpdateSendVmfMsg。
結構的包實在就是5個字節, 8F 19 00 01[StatusByte]
UpdateSendVmfMsg(_BYTE*arg_databuf, int arg_datalen)函數又將收到的包挪用PackVmfMsg重構了一下,然 后把重構的包挪用libvmf_client.so!nw_vmf_send_basic收回往了。先了解一下狀況包是怎么被PackVmfMsg重構的。
char __fastcallPackVmfMsg(_BYTE arg_databuf, unsigned int arg_datalen)
今朝只是了解了數據包的布局,可是詳細的字段寄義還不明白,例如阿誰8F是什么,19是什么,00 01有能夠是BigEndian的包長?不外經由過程穿插援用vmf的新聞處置接受函數nw_vmf_receive(inthandle, char *buf, int bufsize)不可貴出,這個8F實在是groupid,19是eventid。
例如上面是對pwr_agent法式的nw_vmf_receive穿插援用剖析出來的log_optional。
從這個log_optional的高低文代碼中,我得出了這個vmf的數據包構造:
Offset Type Value
0 byte 定值2
20 byte groupid
21 byte eventid
24 word payload_len
26 byte[] payload
看起來很簡略,只需依照這個數據構造把包收回往就可以了。這時就可以應用後面剖析文件體系時發明的/opt/tools/vmf_send。
這個文件很小只要7K,拖進IDA,固然沒有usage新聞,可是很輕松就逆出了他的用法:
由下面main函數得出vmf_send的用法
Usage: vmf_send [groupid] [eventid][payload_dec_byte0] [payload_dec_byte1] …
有了這個號令,實際上我只需求了解groupid和eventid,就可以用vmf_send發送vmf新聞給響應的過程,把持其發生響應的舉措。例如下面剖析到的關狗重啟vmf新聞,我可以挪用vmf_send號令:
/opt/tools/vmf_send143 25 1
如許vgw就會收到vmf新聞,然后發送8個字節的SPI報文給VIP,觸發VIP的關狗重啟舉措。
有了vmf的相干函數原型以及vmf新聞構造,我又逆向了pwr_agent,找到了他的喂狗法式。
然后剖析出了 喂狗的vmf新聞構造
groupid = 143
eventid = 3
payload_len = 4
payload:
02
XX 每秒遞增
01
01 變量VipEnabled的值,由argv參數-v指定
此刻終于可以挪用tools/vmf_send來發送喂狗新聞,我寫了一個劇本來完成后臺喂狗:
#!/bin/sh
while true
do
for seqnum in $(seq 0 255)
do
echo $seqnum
/opt/tools/vmf_send 143 3 2 $seqnum 1 1
sleep 1
done
done
為了驗證這個劇本能否有用,我重啟進進failsafe形式,次序啟動vmf,啟動hal_init,啟動vgw,然后再運轉這個劇本,過了1分多鐘,狗確切被喂的很舒暢,沒有出來亂咬!哈哈!
此刻就可以完美這個failsafe形式了,修正rcS劇本:
read -t 1 -p "Safemode[y/N]:" safemode
echo -e "n"
if [ "$safemode" = "y" ];
then
echo "safemode"
/opt/vmf &
/opt/hal_init
/opt/vgw &
/opt/keepalive.sh > /dev/null
exit 0
fi
如許體系就有了具有喂狗效能的failsafe形式,是不是很兇猛!
0×09 后記
至此,我曾經有了一堆PlanB,我可以安心勇敢的折騰這臺機械了……
接上去的研討就輕松的多了。我又研討了良多有興趣思的工具,例如:
a)導出187A原廠文件體系
b)做了個進級包能把rootfs導出來。可是不包含藍牙和VIP固件…
c)Hack了512M版本的固件,讓他在256 M內存上完善的跑起來了。
d)由于進級后,車機後面板鍵位紊亂,是187B的鍵位,是以我Hack了hmi修正了鍵位。
e)寫了個小法式天生BI TMAP并盤算哈希,做了個進級包可以調換開機Logo。
f)做了個進級包能進進一次failsafe形式,并加載網卡驅動,啟動ftp…
g)做個原機備份固件。
h)有網友供給了編程器固件,從編程器固件提取uboot、kernel、rootfs。
i)…
等有時光我預備把下面的abcdefgh,和新研討出來的工具發在這里,作為續集。盼望這篇文章,能給異樣喜好折騰硬件折騰軟件的人帶來一些輔助……
*本文原創作者:mengxp,屬Freebuf原創嘉獎打算,未經允許制止轉錄發載