linux智能密码锁,【胖猴小玩闹】智能门锁与网关:云丁鹿客智能门锁BLE通信的分析(中)...
1. 簡介
上一篇文章中我們研究了Loock Touch門鎖配套app中BleKey的獲取流程,整個密鑰分發和設備認證的流程都比較規范。接下來,我們將重點分析門鎖固件對BLE通信內容的處理流程,開始分析之前,我們需要先獲取門鎖固件。
之前的文章我們已經介紹了兩種獲取固件的方法:在果加門鎖的分析文章中,我們抓取了門鎖向服務器請求固件更新時的數據包;在分析海康螢石網關時,我們直接讀取了電路板上的Flash芯片。
但是以上兩種方法都不適用于Loock Touch門鎖,因為我們并沒有找到鹿客門鎖的固件更新接口,且門鎖電路板上也沒有外置的Flash芯片,固件是直接保存在MCU內置Flash存儲器中的。所以我們在本篇文章中將分享一個新的方法:通過MCU的調試接口提取固件。
2. 調試接口與調試器
在此前的文章中,我們已經介紹了通過gdbserver調試??滴炇碳绦虻姆椒?#xff0c;通常情況下,gdbserver是運行于Linux系統環境中的調試器程序,通過使用Linux系統提供的調試接口以完成調試工作,并不需要太多硬件上的輔助。而在某些場景中,例如,沒有Linux操作系統時,gdbserver等工具就無法滿足我們的調試需求了,此時需要直接使用MCU提供的硬件調試接口和功能,以完成調試工作。通過閱讀MCU的芯片手冊,可以找到MCU提供的調試方式、調試引腳等詳細信息。
為了使用MCU的調試接口,我們還需要與之對應的硬件調試器。與IDA、GDB等調試器軟件類似,通過硬件調試器,我們也可以完全掌握被調試程序的執行狀況。一般情況下,硬件調試器是通過USB接口連接到PC主機的,而硬件調試器與MCU之間的通信接口則有許多種。不同的MCU,支持的接口也不盡相同,具體信息需要查閱各芯片的手冊。
本篇文章要研究的Loock Touch門鎖使用的MCU型號為EFM32GG280F512,通過翻閱芯片手冊,可以找到其調試接口信息如下圖:
圖2-1 EFM32調試接口
上圖中的調試接口名稱為SWD接口,常見的使用SWD接口的硬件調試器有JLink、STLink等。
我們目前使用的調試器SEGGER JLink(下文簡稱為JLink)提供了對JTAG和SWD兩種調試接口的支持,具體使用時,只需要連接到對應的引腳即可,JLink中兩種接口的引腳如下圖所示:
圖2-2 SEGGER JLink的引腳定義
3. 通過調試接口提取固件
JLink調試器可以通過調試接口讀寫芯片內置的Flash,從而獲取完整的固件。并不是所有芯片都可以通過調試接口提取固件,很多設備在發行版中啟用了讀保護(Readout Protection)機制,使得我們無法通過調試接口讀到Flash內容,所幸本文中的設備并沒有啟用該機制。
接下來,我們就尋找并嘗試用JLink連接芯片的調試接口。
3.1 連接調試接口
在門鎖的電路板上,主控MCU一旁有一排過孔,我們已經在將排針焊接到這排過孔上了,如下圖所示:
圖3-1 MCU及其部分接口引腳
圖中,左側紅框內就是我們焊上的排針,電路板上標注了排針對應的MCU引腳名稱。經過萬用表測量,可以確定紅框中的IO和CLK引腳就是芯片的SWDIO和SWCLK兩個引腳,我們在圖2-1中提到這兩個引腳是SWD調試接口的一部分,那么我們將這幾個引腳按照如下圖的方式連接到JLink調試器。
圖3-2 調試接口與JLink的連接
上圖左側是圖3-1中的排針,右側是SEGGER JLink的引腳。連接完成后,將JLink連接到電腦的USB口,并打開JLink Commander命令行工具(JLink的相關工具和使用手冊等都可以在SEGGER的官網下載到:https://www.segger.com/downloads/jlink/),執行下圖中的命令:
圖3-3 使用JLink連接SWD接口
下面逐一解釋上圖中6個紅框的內容:
(1)命令行工具開啟時,會首先對JLink的狀態進行檢測(SEGGER官網的JLink,無論價格還是到貨時間都不理想,所以我們選擇了某寶,從這里打印的JLink固件信息來看,某寶的似乎是盜版產品);
(2)輸入connect指令,控制JLink開始通過調試接口連接MCU;
(3)輸入?指令選擇要調試的芯片型號,在彈出的對話框中,我們按照芯片的廠商和型號,選擇如下圖的選項;
圖3-4 芯片型號選擇
(4)輸入s指令,選擇調試接口的類型為SWD;
(5)選擇接口的通信速率,一般保持默認即可;
(6)當出現第(6)步的這些內容時,說明JLink已經通過SWD接口連接到了MCU,接下來我們就可以讀取固件或者進行調試了。
3.2 提取固件
上文提到,調試器可以讀寫芯片的內置Flash,而固件代碼就存儲在芯片內置Flash中,所以我們只需要將Flash中代碼區域的數據讀出并保存下來,就相當于拿到了固件。
按照我們分析果加門鎖時的思路,翻閱芯片手冊,可以確定代碼存儲在內存地址為0x0~0x100000的區域。我們通過JLink Commander命令行工具的savebin命令(該命令的使用方法可以去JLink的手冊中查閱)將這一區域中的二進制數據保存下來。
圖3-5 讀取固件的二進制數據
上圖中,我們拿到了固件代碼,并將其命名為LoockEfm32Fw.bin。
3.3 解析固件
在拿到固件之后,我們需要解析固件并對其進行逆向分析。通過查閱手冊可以知道,EFM32GG280的核心是ARM Cortex-M3,和果加門鎖用到的STM32L0同屬Cortex-M系列,所以我們可以按照果加門鎖相關篇章中的方法配置IDA并載入固件。載入之后,繼續沿用果加門鎖分析時的思路,尋找Reset中斷的中斷服務程序,即偏移0x4地址處的數據,跳轉之后按“c”鍵,IDA就會自動開始解析代碼,如下圖所示。
圖3-6 從Reset中斷入手解析代碼
上文提到,代碼存儲在內存地址為0x0~0x100000的區域,所以圖3-6中固件的基址為0x0。此前,我們在分析果加門鎖時,將固件載入IDA時基址是0x08000000,因為在果加的案例中,代碼存儲區域的起始地址是0x08000000。
至此,我們成功提取并解析了Loock Touch門鎖的固件,更加詳細的分析工作將在下一篇文章中進行。
4. 小結
本篇文章分享了如何通過調試接口提取芯片固件,而除了這個作用外,調試接口的主要功能是對MCU正在運行的程序進行調試,在后續文章中我們將通過JLink調試器分析門鎖固件是如何處理BLE通信數據的。
此外,值得一提的是,對大部分芯片來說,只有芯片的讀保護機制未啟用時,才能通過調試接口提取它的固件,但是也有少數芯片的讀保護機制是可以繞過的,這部分內容后續可能會以番外的形式進行分享,感興趣的讀者可以關注我們的后續文章。
Light & Yimi Hu @ PwnMonkeyLabs
總結
以上是生活随笔為你收集整理的linux智能密码锁,【胖猴小玩闹】智能门锁与网关:云丁鹿客智能门锁BLE通信的分析(中)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 韩国瑜会见陆委会主委陈明通:别给高雄念紧
- 下一篇: 幅相曲线渐近线_对数幅频特性渐近线的绘制