?
本環(huán)境是蛇矛實(shí)驗(yàn)室基于"火天網(wǎng)演攻防演訓(xùn)靶場(chǎng)"進(jìn)行搭建,通過(guò)火天網(wǎng)演中的環(huán)境構(gòu)建模塊,可以靈活的對(duì)目標(biāo)網(wǎng)絡(luò)進(jìn)行設(shè)計(jì)和配置,結(jié)合虛實(shí)結(jié)合技術(shù)能夠快速將wifi、藍(lán)牙等進(jìn)行接入并保證正常運(yùn)行邏輯,從而可以快速進(jìn)行場(chǎng)景搭建和復(fù)現(xiàn)驗(yàn)證工作。
?
背景
?藍(lán)牙技術(shù)始于愛(ài)立信公司的1994年方案,它是研究在移動(dòng)電話和其他配件間進(jìn)行低功耗、低成本無(wú)線通信連接的方法。發(fā)明者希望為設(shè)備間的通訊創(chuàng)造一組統(tǒng)一規(guī)則(標(biāo)準(zhǔn)化協(xié)議),以解決用戶間互不兼容的移動(dòng)電子設(shè)備。1997年前愛(ài)立信公司此概念接觸了移動(dòng)設(shè)備制造商,討論其項(xiàng)目合作發(fā)展,結(jié)果獲得支持。1998年項(xiàng)目正式啟動(dòng)。1998年5月,愛(ài)立信、諾基亞、東芝、IBM和英特爾公司等五家著名廠商, 在聯(lián)合開(kāi)展短程無(wú)線通信技術(shù)的標(biāo)準(zhǔn)化活動(dòng)時(shí)提出了藍(lán)牙技術(shù),其宗旨是提供一種短距離、低成本的無(wú)線傳輸應(yīng)用技術(shù)。這五家廠商還成立了藍(lán)牙特別興趣組,以使藍(lán)牙技術(shù)能夠成為未來(lái)的無(wú)線通信標(biāo)準(zhǔn)。芯片霸主Intel公司負(fù)責(zé)半導(dǎo)體芯片和傳輸軟件的開(kāi)發(fā),愛(ài)立信負(fù)責(zé)無(wú)線射頻和移動(dòng)電話軟件的開(kāi)發(fā),IBM和東芝負(fù)責(zé)筆記本電腦接口規(guī)格的開(kāi)發(fā)。1999年下半年,著名的業(yè)界巨頭微軟、摩托羅拉、三康、朗訊與藍(lán)牙特別小組的五家公司共同發(fā)起成立了藍(lán)牙技術(shù)推廣組織,從而在全球范圍內(nèi)掀起了一股“藍(lán)牙”熱潮。全球業(yè)界即將開(kāi)發(fā)一大批藍(lán)牙技術(shù)的應(yīng)用產(chǎn)品,使藍(lán)牙技術(shù)呈現(xiàn)出極其廣闊的市場(chǎng)前景,并預(yù)示著21世紀(jì)初將迎來(lái)波瀾壯闊的全球無(wú)線通信浪潮。
?
如對(duì)藍(lán)牙基礎(chǔ)有過(guò)了解,可以直接看第三章。
1.藍(lán)牙基礎(chǔ)
藍(lán)牙出現(xiàn)的原因,是為了解決從有線數(shù)據(jù)傳輸?shù)綗o(wú)線傳輸數(shù)據(jù)過(guò)程的問(wèn)題。目前藍(lán)牙的版本:1.1、1.2、2.0、2.1、3.0、4.0、4.1、4.2、5.0、5.1、5.2、5.3。藍(lán)牙版本一直在更新,"<4.0" 的被稱為經(jīng)典藍(lán)牙(Classic Bluetooth),">=4.0" 開(kāi)始有了低功耗藍(lán)牙(Bluetooth Low Energy,一般簡(jiǎn)寫(xiě)為BLE)。其實(shí)我們常說(shuō)的藍(lán)牙4.0并不等同于BLE,BLE只是藍(lán)牙4.0的子集;藍(lán)牙4.0是一個(gè)綜合性協(xié)議規(guī)范。藍(lán)牙4.0版本以后技術(shù)模式上分為低功耗藍(lán)牙(BLE)和經(jīng)典藍(lán)牙(BR/EDR)兩種、市場(chǎng)藍(lán)牙產(chǎn)品大多數(shù)為僅支持BLE的,也有兩者都支持的。藍(lán)牙 4.0 的芯片模式分為 Single mode 與 Dual mode。Single mode 只能與藍(lán)牙 4.0 互相傳輸無(wú)法向下與 3.0/2.1/2.0 版本兼容;Dual mode 可以向下兼容 3.0/2.1/2.0 版本。前者應(yīng)用于使用紐扣電池的傳感器設(shè)備,例如對(duì)功耗要求較高的心率檢測(cè)器和溫度計(jì);后者應(yīng)用于傳統(tǒng)藍(lán)牙設(shè)備,同時(shí)兼顧低功耗的需求。
Bluetooth :經(jīng)典藍(lán)牙 ,特點(diǎn)是耗電量大,傳輸距離近,速度一般,適合數(shù)據(jù)量大的傳輸。(相關(guān)設(shè)備:藍(lán)牙耳機(jī)、藍(lán)牙音響)
Bluetooth Smart :Single mode藍(lán)牙只支持低功耗藍(lán)牙,特點(diǎn)是耗電量小,傳輸距離遠(yuǎn)速度快,適合數(shù)據(jù)量小的傳輸。(相關(guān)設(shè)備:藍(lán)牙鎖、藍(lán)牙燈泡、藍(lán)牙手環(huán))
Bluetooth Smart Ready:Dual mode藍(lán)牙同時(shí)支持經(jīng)典藍(lán)牙和低功耗藍(lán)牙。(相關(guān)設(shè)備:手機(jī))
藍(lán)牙5.0是由藍(lán)牙技術(shù)聯(lián)盟在2016年提出的藍(lán)牙技術(shù)標(biāo)準(zhǔn),藍(lán)牙5.0針對(duì)低功耗設(shè)備速度有相應(yīng)提升和優(yōu)化,有著更廣的覆蓋范圍和相較四倍的速度提升,同時(shí)還提供了基于AoA/AoD 等定位的功能,并且針對(duì)物聯(lián)網(wǎng)進(jìn)行了很多底層優(yōu)化,讓使用藍(lán)牙做為標(biāo)準(zhǔn)的物聯(lián)網(wǎng)應(yīng)用更加強(qiáng)大。
?
BLE協(xié)議架構(gòu)
要實(shí)現(xiàn)一個(gè)BLE應(yīng)用,需要一個(gè)支持BLE射頻的芯片,然后基于一個(gè)與芯片配套的協(xié)議棧,開(kāi)發(fā)藍(lán)牙應(yīng)用。協(xié)議棧的作用就是軟件和硬件之間的橋梁,對(duì)應(yīng)用數(shù)據(jù)進(jìn)行封包然后生成可以通過(guò)射頻發(fā)送的空中數(shù)據(jù)包及其逆向過(guò)程。藍(lán)牙協(xié)議將藍(lán)牙整體分成了兩層架構(gòu),底層是核心協(xié)議,描述了藍(lán)牙核心技術(shù)的基礎(chǔ)和規(guī)范,包括了Host和Controller。應(yīng)用層協(xié)議則基于具體需求,使用核心協(xié)議提供的機(jī)制,實(shí)現(xiàn)不同的功能策略。這兩部分在不同的藍(lán)牙協(xié)議版本中略有區(qū)別,但大致上是,Controller完成硬件側(cè)的規(guī)范制訂,包括信號(hào)調(diào)制解調(diào),會(huì)抽象出用于通信的邏輯鏈路,可能存在一個(gè)或多個(gè),如LE Controller、BR/EDR Controller;Host則在邏輯鏈路的基礎(chǔ)上完成更友好的封裝,屏蔽掉技術(shù)細(xì)節(jié),方便應(yīng)用層對(duì)數(shù)據(jù)的使用。
BLE協(xié)議架構(gòu)由下面幾部分組成:
1.物理層(PHY):PHY層用來(lái)指定BLE所用的無(wú)線頻段,調(diào)制解調(diào)方式和方法等。
2.鏈路層(LL):LL層是整個(gè)BLE協(xié)議棧的核心,要做的事情非常多,比如具體選擇哪個(gè)射頻通道進(jìn)行通信,怎么識(shí)別空中數(shù)據(jù)包,具體在哪個(gè)時(shí)間點(diǎn)把數(shù)據(jù)包發(fā)送出去,怎么保證數(shù)據(jù)的完整性,ACK如何接收,如何進(jìn)行重傳,以及如何對(duì)鏈路進(jìn)行管理和控制等等。LL層只負(fù)責(zé)把數(shù)據(jù)發(fā)出去或者收回來(lái),對(duì)數(shù)據(jù)進(jìn)行怎樣的解析則交給上面的GAP或者GATT。
3.主機(jī)控制接口(HCI):HCI主要用于2顆芯片實(shí)現(xiàn)BLE協(xié)議棧的場(chǎng)合,用來(lái)規(guī)范兩者之間的通信協(xié)議和通信命令等。這一層可以是軟件或者硬件接口,如UART、SPI、USB等。
4.通用訪問(wèn)配置文件(GAP):GAP是對(duì)LL層payload(有效數(shù)據(jù)包)如何進(jìn)行解析的兩種方式中的一種,而且是最簡(jiǎn)單的那一種。GAP簡(jiǎn)單的對(duì)LL payload進(jìn)行一些規(guī)范和定義,因此GAP能實(shí)現(xiàn)的功能極其有限。GAP目前主要用來(lái)進(jìn)行廣播,掃描和發(fā)起連接等。
5.邏輯鏈路控制級(jí)自適應(yīng)協(xié)議(L2CAP):L2CAP對(duì)LL進(jìn)行了一次簡(jiǎn)單封裝,LL只關(guān)心傳輸?shù)臄?shù)據(jù)本身,L2CAP就要區(qū)分是加密通道還是普通通道,同時(shí)還要對(duì)連接間隔進(jìn)行管理。
6.安全管理(SMP):SMP用來(lái)管理BLE連接的加密和安全的,如何保證連接的安全性,同時(shí)不影響用戶的體驗(yàn),這些都是SMP要考慮的工作。
7.屬性協(xié)議(ATT):簡(jiǎn)單來(lái)說(shuō),ATT層用來(lái)定義用戶命令及命令操作的數(shù)據(jù),比如讀取某個(gè)數(shù)據(jù)或者寫(xiě)某個(gè)數(shù)據(jù)。BLE協(xié)議棧中,開(kāi)發(fā)者接觸最多的就是ATT。BLE引入了attribute概念,用來(lái)描述一條一條的數(shù)據(jù)。Attribute除了定義數(shù)據(jù),同時(shí)定義該數(shù)據(jù)可以使用的ATT命令,因此這一層被稱為ATT層。
8.通用屬性配置文件(GATT):GATT 是在 ATT 上面的一層結(jié)構(gòu),定義了使用 ATT的服務(wù)框架,GATT用來(lái)規(guī)范attribute中的數(shù)據(jù)內(nèi)容,并運(yùn)用group(分組)的概念對(duì)attribute進(jìn)行分類管理,GATT規(guī)定配置文件(profile)的結(jié)構(gòu)。沒(méi)有GATT,BLE協(xié)議棧也能跑,但互聯(lián)互通就會(huì)出問(wèn)題,也正是因?yàn)橛辛薌ATT和各種各樣的應(yīng)用profile,BLE擺脫了ZigBee等無(wú)線協(xié)議的兼容性困境,成了出貨量最大的2.4G無(wú)線通信產(chǎn)品。GATT定義了使用ATT的服務(wù)框架。在BLE中,所有被profile或者服務(wù)用到的數(shù)據(jù)塊稱為“特性”,兩個(gè)建立連接的設(shè)備之間的所有數(shù)據(jù)通信都是通過(guò)GATT子程序處理。GATT層用于已連接的藍(lán)牙設(shè)備之間的數(shù)據(jù)通信,應(yīng)用程序和profile直接使用GATT層。當(dāng)兩個(gè)設(shè)備建立連接之后,它們就處于下面兩種角色之一:GATT服務(wù)器:為GATT客戶端提供數(shù)據(jù)服務(wù)的設(shè)備。GATT客戶端:從GATT服務(wù)器讀寫(xiě)應(yīng)用數(shù)據(jù)的設(shè)備。
2.低功耗藍(lán)牙工作流程
在BLE中存在兩個(gè)角色,一個(gè)是中心角色(Central),一個(gè)是外圍角色(Peripheral),藍(lán)牙設(shè)備或手機(jī)都可以單獨(dú)作為Central或Peripheral角色。外設(shè)角色的作用是為中心角色提供各種數(shù)據(jù),中心角色可以掃描并接收多個(gè)外設(shè)角色數(shù)據(jù)( 外圍角色中的設(shè)備進(jìn)行廣播,中心角色的設(shè)備掃描尋找廣播),數(shù)據(jù)以服務(wù)(Service)和特性(Characteristic)的形式呈現(xiàn)。
藍(lán)牙工作流程:藍(lán)牙廣播->掃描設(shè)備->設(shè)備配對(duì)->數(shù)據(jù)傳輸。
這里以智能手環(huán)為例,我們簡(jiǎn)單理解藍(lán)牙的工作流程為:智能手環(huán)(外圍設(shè)備)開(kāi)啟藍(lán)牙后會(huì)進(jìn)行廣播,這時(shí)智能手環(huán)會(huì)在3個(gè)廣播信道(37,38,39)上發(fā)送相同的廣播報(bào)文,此時(shí)手機(jī)(中心設(shè)備)打開(kāi)藍(lán)牙后,手機(jī)中藍(lán)牙適配器自帶掃描器開(kāi)始工作(掃描也在三個(gè)特定的廣播信道進(jìn)行),掃描器接收廣播信道的報(bào)文后,發(fā)出掃描請(qǐng)求報(bào)文,智能手環(huán)發(fā)送掃描響應(yīng)報(bào)文,這時(shí)手機(jī)就知道了發(fā)現(xiàn)了周邊有一個(gè)智能手環(huán)設(shè)備。手機(jī)在點(diǎn)擊連接智能手環(huán)時(shí),發(fā)起連接請(qǐng)求報(bào)文,智能手環(huán)收到并處理后返回連接回應(yīng)報(bào)文,此時(shí)倆者一旦連接建立之后,則開(kāi)始使用數(shù)據(jù)報(bào)文(這里不理解也沒(méi)關(guān)系,后面會(huì)講解)。連接成功后,倆者開(kāi)始通信,通信過(guò)程中手機(jī)發(fā)現(xiàn)藍(lán)牙耳機(jī)存在某種服務(wù),服務(wù)中存在一些特性如獲取人體心率,這些特性允許手機(jī)通過(guò)特定的信道發(fā)出讀、寫(xiě)等請(qǐng)求進(jìn)行數(shù)據(jù)傳輸,上面過(guò)程中所有的數(shù)據(jù)傳輸均以無(wú)線的形式在空中傳播。
?
如何通過(guò)無(wú)線發(fā)送藍(lán)牙數(shù)據(jù)包
再理解藍(lán)牙工作流程的細(xì)節(jié)前,我們先來(lái)看藍(lán)牙無(wú)線通信是如何進(jìn)行的。下面部分內(nèi)容來(lái)自于該文章(https://www.cnblogs.com/schips/p/12293062.html),原理講解比較通透,所以我拷貝了一部分。假設(shè)有設(shè)備A和設(shè)備B,設(shè)備A要把自己目前的電量狀態(tài)83%(十六進(jìn)制表示為0x53)發(fā)給設(shè)備B,該怎么做呢?作為一個(gè)開(kāi)發(fā)者,他希望越簡(jiǎn)單越好,對(duì)他而言,他希望調(diào)用一個(gè)簡(jiǎn)單的API就能完成這件事,比如send(0x53),實(shí)際上我們的BLE協(xié)議棧就是這樣設(shè)計(jì)的,開(kāi)發(fā)者只需調(diào)用send(0x53)就可以把數(shù)據(jù)發(fā)送出去了,其余的事情BLE協(xié)議棧幫你搞定。很多人會(huì)想,BLE協(xié)議棧是不是直接在物理層就把0x53發(fā)出去,就如下圖所示:
這種方式初看起來(lái)挺美的,但由于很多細(xì)節(jié)沒(méi)有考慮到,實(shí)際是不可行的。首先,它沒(méi)有考慮用哪一個(gè)射頻信道來(lái)進(jìn)行傳輸,在不更改API的情況下,我們只能對(duì)協(xié)議棧進(jìn)行分層,為此引入LL層,開(kāi)發(fā)者還是調(diào)用send(0x53),send(0x53)再調(diào)用send_LL(0x53,2402M)(注:2402M為信道頻率)。這里還有一個(gè)問(wèn)題,設(shè)備B怎么知道這個(gè)數(shù)據(jù)包是發(fā)給自己的還是其他人的,為此BLE引入access address概念,用來(lái)指明接收者身份,其中,0x8E89BED6這個(gè)access address比較特殊,它表示要發(fā)給周邊所有設(shè)備,即廣播。如果你要一對(duì)一的進(jìn)行通信(BLE協(xié)議將其稱為連接),即設(shè)備A的數(shù)據(jù)包只能設(shè)備B接收,同樣設(shè)備B的數(shù)據(jù)包只能設(shè)備A接收,那么就必須生成一個(gè)獨(dú)特的隨機(jī)access address以標(biāo)識(shí)設(shè)備A和設(shè)備B兩者之間的連接。
廣播方式
我們先來(lái)看一下簡(jiǎn)單的廣播情況,這種情況下,我們把設(shè)備A叫advertiser(廣播者),設(shè)備B叫scanner或者observer(掃描者)。廣播狀態(tài)下設(shè)備A的LL層API將變成send_LL(0x53,2402M, 0x8E89BED6)。由于設(shè)備B可以同時(shí)接收到很多設(shè)備的廣播,因此數(shù)據(jù)包還必須包含設(shè)備A的device address(0xE1022AAB753B)以確認(rèn)該廣播包來(lái)自設(shè)備A,為此send_LL參數(shù)需要變成(0x53,2402M, 0x8E89BED6, 0xE1022AAB753B)。LL層還要檢查數(shù)據(jù)的完整性,即數(shù)據(jù)在傳輸過(guò)程中有沒(méi)有發(fā)生竄改,為此引入CRC24對(duì)數(shù)據(jù)包進(jìn)行檢驗(yàn) (假設(shè)為0xB2C78E) 。同時(shí)為了調(diào)制解調(diào)電路工作更高效,每一個(gè)數(shù)據(jù)包的最前面會(huì)加上1個(gè)字節(jié)的preamble(前導(dǎo)幀),preamble一般為0x55或者0xAA。這樣,整個(gè)空中包就變成(注:空中包用小端模式表示!):
上面這個(gè)數(shù)據(jù)包還有如下問(wèn)題:
沒(méi)有對(duì)數(shù)據(jù)包進(jìn)行分類組織,設(shè)備B無(wú)法找到自己想要的數(shù)據(jù)0x53。為此我們需要在access address之后加入兩個(gè)字段:LL header和長(zhǎng)度字節(jié)。LL header用來(lái)表示數(shù)據(jù)包的LL類型,長(zhǎng)度字節(jié)用來(lái)指明payload的長(zhǎng)度
設(shè)備B什么時(shí)候開(kāi)啟射頻窗口以接收空中數(shù)據(jù)包?如上圖case1所示,當(dāng)設(shè)備A的數(shù)據(jù)包在空中傳輸?shù)臅r(shí)候,設(shè)備B把接收窗口關(guān)閉,此時(shí)通信將失敗;同樣對(duì)case2來(lái)說(shuō),當(dāng)設(shè)備A沒(méi)有在空中發(fā)送數(shù)據(jù)包時(shí),設(shè)備B把接收窗口打開(kāi),此時(shí)通信也將失敗。只有case3的情況,通信才能成功,即設(shè)備A的數(shù)據(jù)包在空中傳輸時(shí),設(shè)備B正好打開(kāi)射頻接收窗口,此時(shí)通信才能成功,換句話說(shuō),LL層還必須定義通信時(shí)序。
當(dāng)設(shè)備B拿到數(shù)據(jù)0x53后,該如何解析這個(gè)數(shù)據(jù)呢?它到底表示濕度還是電量,還是別的意思?這個(gè)就是GAP層要做的工作,GAP層引入了LTV(Length-Type-Value)結(jié)構(gòu)來(lái)定義數(shù)據(jù),比如020105,02-長(zhǎng)度,01-類型(強(qiáng)制字段,表示廣播flag,廣播包必須包含該字段),05-值。由于廣播包最大只能為31個(gè)字節(jié),它能定義的數(shù)據(jù)類型極其有限,像這里說(shuō)的電量,GAP就沒(méi)有定義,因此要通過(guò)廣播方式把電量數(shù)據(jù)發(fā)出去,只能使用供應(yīng)商自定義數(shù)據(jù)類型0xFF,即04FF590053,其中04表示長(zhǎng)度,F(xiàn)F表示數(shù)據(jù)類型(自定義數(shù)據(jù)),0x0059是供應(yīng)商ID(自定義數(shù)據(jù)中的強(qiáng)制字段),0x53就是我們的數(shù)據(jù)(設(shè)備雙方約定0x53就是表示電量,而不是其他意思)。
最終空中傳輸?shù)臄?shù)據(jù)包將變成:“AA D6BE898E 60 0E 3B75AB2A02E1 02010504FF5900 53 8EC7B2”
AA – 前導(dǎo)幀(preamble)
D6BE898E – 訪問(wèn)地址(access address)
60 – LL幀頭字段(LL header)
0E – 有效數(shù)據(jù)包長(zhǎng)度(payload length)
3B75AB2A02E1 – 廣播者設(shè)備地址(advertiser address)
02010504FF590053 – 廣播數(shù)據(jù)
8EC7B2 – CRC24值
有了PHY,LL和GAP,就可以發(fā)送廣播包了,但廣播包攜帶的信息極其有限,而且還有如下幾大限制:
無(wú)法進(jìn)行一對(duì)一雙向通信 (廣播是一對(duì)多通信,而且是單方向的通信)
由于不支持組包和拆包,因此無(wú)法傳輸大數(shù)據(jù)
通信不可靠及效率低下。廣播信道不能太多,否則將導(dǎo)致掃描端效率低下。為此,BLE只使用37(2402MHz) /38(2426MHz) /39(2480MHz)三個(gè)信道進(jìn)行廣播和掃描,因此廣播不支持跳頻。由于廣播是一對(duì)多的,所以廣播也無(wú)法支持ACK。這些都使廣播通信變得不可靠。
掃描端功耗高。由于掃描端不知道設(shè)備端何時(shí)廣播,也不知道設(shè)備端選用哪個(gè)頻道進(jìn)行廣播,掃描端只能拉長(zhǎng)掃描窗口時(shí)間,并同時(shí)對(duì)37/38/39三個(gè)通道進(jìn)行掃描,這樣功耗就會(huì)比較高。
而連接則可以很好解決上述問(wèn)題,下面我們就來(lái)看看連接是如何將0x53發(fā)送出去的。
連接方式
到底什么叫連接(connection)?像有線UART,很容易理解,就是用線(Rx和Tx等)把設(shè)備A和設(shè)備B相連,即為連接。用“線”把兩個(gè)設(shè)備相連,實(shí)際是讓2個(gè)設(shè)備有共同的通信媒介,并讓兩者時(shí)鐘同步起來(lái)。藍(lán)牙連接有何嘗不是這個(gè)道理,所謂設(shè)備A和設(shè)備B建立藍(lán)牙連接,就是指設(shè)備A和設(shè)備B兩者一對(duì)一“同步”成功,其具體包含以下幾方面:
設(shè)備A和設(shè)備B對(duì)接下來(lái)要使用的物理信道達(dá)成一致
設(shè)備A和設(shè)備B雙方建立一個(gè)共同的時(shí)間錨點(diǎn),也就是說(shuō),把雙方的時(shí)間原點(diǎn)變成同一個(gè)點(diǎn)
設(shè)備A和設(shè)備B兩者時(shí)鐘同步成功,即雙方都知道對(duì)方什么時(shí)候發(fā)送數(shù)據(jù)包什么時(shí)候接收數(shù)據(jù)包
連接成功后,設(shè)備A和設(shè)備B通信流程如下所示:
如上圖所示,一旦設(shè)備A和設(shè)備B連接成功(此種情況下,我們把設(shè)備A稱為Master或者Central,把設(shè)備B稱為Slave或者Peripheral),設(shè)備A將周期性以CI(connection interval)為間隔向設(shè)備B發(fā)送數(shù)據(jù)包,而設(shè)備B也周期性地以CI為間隔打開(kāi)射頻接收窗口以接收設(shè)備A的數(shù)據(jù)包。同時(shí)按照藍(lán)牙spec要求,設(shè)備B收到設(shè)備A數(shù)據(jù)包150us后,設(shè)備B切換到發(fā)送狀態(tài),把自己的數(shù)據(jù)發(fā)給設(shè)備A;設(shè)備A則切換到接收狀態(tài),接收設(shè)備B發(fā)過(guò)來(lái)的數(shù)據(jù)。由此可見(jiàn),連接狀態(tài)下,設(shè)備A和設(shè)備B的射頻發(fā)送和接收窗口都是周期性地有計(jì)劃地開(kāi)和關(guān),而且開(kāi)的時(shí)間非常短,從而大大降低系統(tǒng)功耗并大大提高系統(tǒng)效率。
現(xiàn)在我們看看連接狀態(tài)下是如何把數(shù)據(jù)0x53發(fā)送出去的,從中大家可以體會(huì)到藍(lán)牙協(xié)議棧分層的妙處。
對(duì)開(kāi)發(fā)者來(lái)說(shuō),很簡(jiǎn)單,他只需要調(diào)用send(0x53)
GATT層定義數(shù)據(jù)的類型和分組,方便起見(jiàn),我們用0x0013表示電量這種數(shù)據(jù)類型,這樣GATT層把數(shù)據(jù)打包成130053(小端模式?。?/p>
ATT層用來(lái)選擇具體的通信命令,比如讀/寫(xiě)/notify/indicate等,這里選擇notify命令0x1B,這樣數(shù)據(jù)包變成了:1B130053
L2CAP用來(lái)指定connection interval(連接間隔),比如每10ms同步一次(CI不體現(xiàn)在數(shù)據(jù)包中),同時(shí)指定邏輯通道編號(hào)0004(表示ATT命令),最后把ATT數(shù)據(jù)長(zhǎng)度0x0004加在包頭,這樣數(shù)據(jù)就變?yōu)椋?40004001B130053
LL層要做的工作很多,首先LL層需要指定用哪個(gè)物理信道進(jìn)行傳輸(物理信道不體現(xiàn)在數(shù)據(jù)包中),然后再給此連接分配一個(gè)Access address(0x50655DAB)以標(biāo)識(shí)此連接只為設(shè)備A和設(shè)備B直連服務(wù),然后加上LL header和payload length字段,LL header標(biāo)識(shí)此packet為數(shù)據(jù)packet,而不是control packet等,payload length為整個(gè)L2CAP字段的長(zhǎng)度,最后加上CRC24字段,以保證整個(gè)packet的數(shù)據(jù)完整性,所以數(shù)據(jù)包最后變成:
AA – 前導(dǎo)幀(preamble)
0x50655DAB – 訪問(wèn)地址(access address)
1E – LL幀頭字段(LL header)
08 – 有效數(shù)據(jù)包長(zhǎng)度(payload length)
04000400 – ATT數(shù)據(jù)長(zhǎng)度,以及L2CAP通道編號(hào)
1B – notify command
0x0013 – 電量數(shù)據(jù)handle
0x53 – 真正要發(fā)送的電量數(shù)據(jù)
0xF650D5 – CRC24值
雖然開(kāi)發(fā)者只調(diào)用了 send(0x53),但由于低功耗藍(lán)牙協(xié)議棧層層打包,最后空中實(shí)際傳輸?shù)臄?shù)據(jù)將變成下圖所示的模樣,這就既滿足了低功耗藍(lán)牙通信的需求,又讓用戶API變得簡(jiǎn)單,可謂一箭雙雕!
AAAB5D65501E08040004001B130053D550F6
在理解了上面的知識(shí)后,我們可以進(jìn)行下面的內(nèi)容了。
?
藍(lán)牙廣播
低功耗藍(lán)牙一共有40個(gè)信道,頻段范圍從2402兆赫茲到2480兆赫茲,每?jī)烧缀掌澮粋€(gè)信道,其中37、38、39是廣播信道,剩余的是數(shù)據(jù)信道。
藍(lán)牙廣播就是在這37,38,39三個(gè)信道上廣播數(shù)據(jù),一個(gè)廣播數(shù)據(jù)包最長(zhǎng)37個(gè)字節(jié),其中有六個(gè)字節(jié)用作藍(lán)牙設(shè)備的mac地址,剩余的31個(gè)字節(jié)又被分為若干個(gè)廣播數(shù)據(jù)結(jié)構(gòu)體,藍(lán)牙規(guī)范里面稱為ad structure。每一個(gè)廣播數(shù)據(jù)結(jié)構(gòu)體有三部分組成,分別是結(jié)構(gòu)體長(zhǎng)度類型和內(nèi)容。其中長(zhǎng)度占用1字節(jié),類型1字節(jié),和若干個(gè)字節(jié)內(nèi)容。這里面長(zhǎng)度等于一加N(內(nèi)容字節(jié)數(shù))。
下圖中共有兩個(gè)廣播數(shù)據(jù)結(jié)構(gòu)體,第一個(gè)廣播數(shù)據(jù)結(jié)構(gòu)體的長(zhǎng)度為0x4,表示后面有四個(gè)字節(jié)屬于這個(gè)結(jié)構(gòu)體。緊接著是第二個(gè)廣播數(shù)據(jù)結(jié)構(gòu)體,長(zhǎng)度為0x03,表示后面有三個(gè)字節(jié)屬于這個(gè)結(jié)構(gòu)體。上面提到了一個(gè)廣播數(shù)據(jù)結(jié)構(gòu)體最大可用的字節(jié)數(shù)為31個(gè),如果沒(méi)有用完的話,系統(tǒng)會(huì)在后面自動(dòng)補(bǔ)零,湊夠31個(gè)字節(jié)。
注意:藍(lán)牙廣播最多只能廣播31個(gè)字節(jié)的數(shù)據(jù),如果要廣播的數(shù)據(jù)超過(guò)了31個(gè)字節(jié),可以把一部分?jǐn)?shù)據(jù)放到掃描響應(yīng)里面。
上面提到了廣播數(shù)據(jù)結(jié)構(gòu)體組成方式,如果我們要想知道這些廣播數(shù)據(jù)的具體含義,就必須知道每一個(gè)廣播數(shù)據(jù)結(jié)構(gòu)體的廣播類型,廣播類型藍(lán)牙官網(wǎng)已經(jīng)制定了詳細(xì)的標(biāo)準(zhǔn),我們可以在官網(wǎng)下載完整的AD type 進(jìn)行查看。下圖是幾個(gè)比較常用的類型,比如009表示藍(lán)牙設(shè)備的名稱,0xa表示藍(lán)牙設(shè)備的發(fā)射功率,0xff為廠商自定義類型。我們知道了廣播數(shù)據(jù)結(jié)構(gòu)體的類型,后面的數(shù)據(jù)內(nèi)容是我們比較關(guān)注的,這些內(nèi)容采用的是utf-8編碼,所以可以傳輸中文。下圖中的數(shù)據(jù)內(nèi)容0x31 0x32 0x33 0x34 表示的字符串是"1234"。那么第一個(gè)廣播結(jié)構(gòu)體所表示的含義就是指定了藍(lán)牙設(shè)備名稱為1234,第二個(gè)廣播數(shù)據(jù)結(jié)構(gòu)體發(fā)射功率為8dbm。第三個(gè)廣告數(shù)據(jù)結(jié)構(gòu)體是廠商自定義數(shù)據(jù),其數(shù)據(jù)內(nèi)容的含義由廠商決定。
?
掃描與響應(yīng)
藍(lán)牙廣播大致可以分為如下四類:
?
可連接非定向可連接 定向不可連接 非定向可掃描 非定向可連接
?
非定向是大部分普通的藍(lán)牙設(shè)備采用的廣播方式
可連接定向呢主要用于已配對(duì)設(shè)備中的快速連接
不可連接非定向是藍(lán)牙信標(biāo)或藍(lán)牙傳感器常用的廣播方式
可掃描非對(duì)象是在不可連接非對(duì)象的基礎(chǔ)上加入了掃描響應(yīng)的功能,能夠通過(guò)掃描響應(yīng)來(lái)承載更多的數(shù)據(jù)
這個(gè)表格總結(jié)出了這幾種廣播類型的功能。藍(lán)牙廣播是藍(lán)牙設(shè)備主動(dòng)發(fā)射的一些數(shù)據(jù),而掃描響應(yīng)的是藍(lán)牙從機(jī)收到藍(lán)牙主機(jī)的掃描請(qǐng)求之后,回復(fù)給藍(lán)牙主機(jī)的數(shù)據(jù),掃描響應(yīng)的數(shù)據(jù)格式和藍(lán)牙廣播的數(shù)據(jù)格式完全一樣,不同的是廣播數(shù)據(jù)是主動(dòng)發(fā)射的,而掃描響應(yīng)的數(shù)據(jù)呢是在收到其他設(shè)備的掃描請(qǐng)求之后才會(huì)觸發(fā)的。
掃描響應(yīng)數(shù)據(jù)和廣播數(shù)據(jù)格式是一樣的,掃描響應(yīng)數(shù)據(jù)是非必需的,掃描響應(yīng)數(shù)據(jù)可以作為廣播數(shù)據(jù)的補(bǔ)充,掃描響應(yīng)需要一定的觸發(fā)條件。
?
服務(wù)與特性
以藍(lán)牙鼠標(biāo)為例,我們來(lái)看一下它的服務(wù)和特性是如何實(shí)現(xiàn)的,在手機(jī)上打開(kāi)名叫谷雨藍(lán)牙的微信小程序,搜索藍(lán)牙鼠標(biāo)后點(diǎn)擊連接。連接成功后,展示的就是該設(shè)備的服務(wù)列表,一共有五個(gè)服務(wù),每個(gè)服務(wù)上面的英文單詞是服務(wù)的名稱。
下面還有一行uuid,隨便點(diǎn)開(kāi)一個(gè)服務(wù),展開(kāi)是該服務(wù)里面的特性,每一個(gè)特性由特性名稱,特性u(píng)uid和特性的訪問(wèn)權(quán)限組成。一個(gè)藍(lán)牙設(shè)備里面可以包含若干個(gè)服務(wù),一個(gè)服務(wù)里面包含若干個(gè)特性,每個(gè)特性里面又可以有讀寫(xiě)通知等權(quán)限,每一個(gè)服務(wù)和特性都要有一個(gè)uuid。
uuid是藍(lán)牙組織定義的用于區(qū)分各個(gè)服務(wù)和特性的標(biāo)識(shí)符,用戶可以自定義16 bit uuid,也可使用官方定義好的16bit uuid。uuid總長(zhǎng)度是128bit,比如下面就是兩個(gè)標(biāo)準(zhǔn)的uuid。但是藍(lán)牙設(shè)計(jì)者考慮到128bit的uuid太長(zhǎng),使用起來(lái)不太方便。為了方便使用,藍(lán)牙組織定義了一些16位的uuid的基地址,可以與16位uuid進(jìn)行拼接,形成128bit的uid。
?
數(shù)據(jù)傳輸
上面我們學(xué)習(xí)了藍(lán)牙服務(wù)和特性,我們知道了服務(wù)與特性。那么數(shù)據(jù)之間是怎么傳輸?shù)哪?,這里我們學(xué)習(xí)一下數(shù)據(jù)的傳輸,低功耗藍(lán)牙通信是基于一個(gè)個(gè)特性實(shí)現(xiàn)的,每一個(gè)特性可以被看作一個(gè)數(shù)據(jù)點(diǎn),數(shù)據(jù)的收發(fā)都要依托于這些數(shù)據(jù)點(diǎn)。對(duì)數(shù)據(jù)點(diǎn)的操作方法有如下常用的五種類型:
read
write
write with no response,
notify
indicate
這幾種通信方式的區(qū)別,設(shè)備作為從機(jī),手機(jī)作為主機(jī)
read操作,就是手機(jī)讀取設(shè)備中某個(gè)特性的值。
write操作就是手機(jī)修改設(shè)備中某個(gè)特性的值。
write with no response,與write操作類似,只不過(guò)寫(xiě)完之后不需要設(shè)備回應(yīng),write操作則需要設(shè)備回應(yīng)。
notify,操作是設(shè)備里面的數(shù)據(jù)發(fā)生變化之后,通知手機(jī)來(lái)取數(shù)據(jù),需要在手機(jī)端訂閱相應(yīng)的通知才有效。
indicate與notify操作類似,不同之處在于,indicate需要手機(jī)回應(yīng),notify則不需要。
上面部分內(nèi)容來(lái)自于課程(https://www.bilibili.com/video/BV1ad4y1d7AM/),如果大家感興趣,可以前去學(xué)習(xí)。
3.藍(lán)牙抓包分析
?電腦抓包
這里以windows為例,我們作為初學(xué)者,一般使用CC2540/nrf52840 usb dongle來(lái)抓取藍(lán)牙數(shù)據(jù)包,買板子后并且按照手冊(cè)安裝好環(huán)境后,更新驅(qū)動(dòng)。利用平臺(tái)USB設(shè)備接入模塊接入藍(lán)牙模塊,并可連接對(duì)實(shí)物藍(lán)牙手環(huán)進(jìn)行測(cè)試
打開(kāi)wireshark就可以看到nrf sniffer的接口后,我們直接雙擊就可以抓包了。
開(kāi)啟抓包后,使外圍設(shè)備開(kāi)啟廣播模式。等待外圍設(shè)備廣播包穩(wěn)定后,點(diǎn)擊wireshark 中 Device列表外圍設(shè)備的mac地址,開(kāi)啟中心設(shè)備進(jìn)行掃描和連接,就可以抓取倆個(gè)設(shè)備之間的通信包。
注意:下圖中devcies下拉列表中沒(méi)有鼠標(biāo)的mac地址,說(shuō)明并不能抓取設(shè)備連接后通信過(guò)程,但是這里還是可以分析一下廣播和連接的過(guò)程。
廣播包中PDU的類型如下:
?
? 0000 ADV_IND:可連接通用連接廣播 ??0001 ADV_DIRECT_IND:可連接定向連接(指定設(shè)備)廣播 ??0010 ADV_NONCONN_IND:不可連接通用廣播 ??0011 SCAN_REQ:掃描請(qǐng)求 ??0100 SCAN_RSP:掃描響應(yīng) ??0101 CONNECT_REQ:連接請(qǐng)求 ??0110 ADV_SCAN_IND:可掃描通用廣播 ??0111-1111 Reserved ??位[4:5]:保留 ??位[6]:RxAdd ??位[7]:TxAdd ??位[8:13]:廣播數(shù)據(jù)長(zhǎng)度 (最大為37 字節(jié)) ??位[14:15]:保留
?
?
BLE 連接過(guò)程中有三個(gè)重要的數(shù)據(jù)包:SCAN_REQ, SCAN_RSP 和 CONNECT_REQ(CONN_REQ又稱為CONNECT_IND)。SCAN_REQ:掃描請(qǐng)求,由主設(shè)備向從設(shè)備發(fā)出,目的是為了獲得從設(shè)備的響應(yīng)以得到更多的從設(shè)備廣播數(shù)據(jù)信息(包括設(shè)備名字,或者服務(wù)UUID,及其它如廠家特定格式的信息(如硬件版本,軟件版本號(hào),設(shè)備系列號(hào)等等)。
?
?
?
SCAN_RSP: 從設(shè)備對(duì)就主設(shè)備發(fā)起的SCAN_REQ的響應(yīng),作為廣播包的補(bǔ)充,從設(shè)備可以給主設(shè)備更多的廣播數(shù)據(jù),比如說(shuō),有些設(shè)備在廣播包里面沒(méi)有設(shè)備名字,這個(gè)時(shí)候就可以把設(shè)備名字放在這個(gè)包里面發(fā)給主設(shè)備。
CONNECT_REQ(CONN_REQ又稱為CONNECT_IND):主設(shè)備向從設(shè)備發(fā)出連接請(qǐng)求。至此連接建立完成(從設(shè)備不會(huì)響應(yīng)這個(gè)請(qǐng)求),如果從設(shè)備沒(méi)有連接上面的問(wèn)題的話,以后主從雙方會(huì)開(kāi)始相互交換有效數(shù)據(jù)(基于GAP,GATT及SMP協(xié)議)或者交換空包。
BLE抽象出一個(gè)協(xié)議:Attribute protocol,該協(xié)議將這些“信息”以“Attribute(屬性)”的形式抽象出來(lái),并提供一些方法,供遠(yuǎn)端設(shè)備(remote device)讀取、修改這些屬性的值(Attribute value)。一般情況下,ATT 層用來(lái)定義用戶命令及命令操作的數(shù)據(jù),當(dāng)我們想要給設(shè)備發(fā)送惡意報(bào)文,這些操作需要在ATT協(xié)議層完成,這里我們需要重點(diǎn)關(guān)注一下ATT報(bào)文。
下圖中,實(shí)線包含的部分為ATT層。ATT報(bào)文由Attribute Opcode和Attribute Parameters組成。
ATT層是固定的CID,當(dāng)L2CAP層的CID為0x4時(shí),為ATT層。
ATT報(bào)文中的Opcode決定了后面的Parameters,例如后文中0x1b為Notify,那么后面的Parameters就為Attribute Handle和Attribute Value組成,我們?cè)诜治鰰r(shí)需要重點(diǎn)關(guān)注Attribute Value的值。
上面在數(shù)據(jù)傳輸小節(jié)中已經(jīng)講解了Notify,Notify是當(dāng)中心設(shè)備訂閱從設(shè)備相應(yīng)服務(wù)時(shí),從設(shè)備里面的數(shù)據(jù)發(fā)生變化后,從設(shè)備通知中心設(shè)備來(lái)取數(shù)據(jù)。下圖為opcode為Notification的ATT報(bào)文。
除了上述方法外,我們還可以使用藍(lán)牙適配器(電腦自帶也行)與藍(lán)牙調(diào)試工具進(jìn)行抓包分析,使用方法位正常連接藍(lán)牙設(shè)備后,藍(lán)牙啟動(dòng)調(diào)試工具就可以看到服務(wù)與特性,并且可以看到通信日志以及發(fā)送報(bào)文到設(shè)備。藍(lán)牙調(diào)試工具比較多,這里不進(jìn)行推薦,百度搜索下載就行。
Linux系統(tǒng)抓包與上面相同,大多采用適配器與調(diào)試工具組合進(jìn)行抓包分析,bluetoothd、hcitool和gatttool都是比較好用的工具。
?
手機(jī)抓包
當(dāng)我們想要抓取手機(jī)app與藍(lán)牙設(shè)備的通信時(shí),有時(shí)ble sniffer板子無(wú)法抓到通信包,那么就我們需要安裝adb環(huán)境進(jìn)行藍(lán)牙調(diào)試,整個(gè)過(guò)程比較方便。
下面我以某智能手環(huán)為例,進(jìn)行藍(lán)牙抓包分析。windows安裝好adb并配置環(huán)境后,下載adb驅(qū)動(dòng)安裝包,打開(kāi)ADB Driver Installer程序,通過(guò)數(shù)據(jù)線將手機(jī)與電腦連接。手機(jī)開(kāi)發(fā)者選項(xiàng)中打開(kāi)usb調(diào)試,此時(shí)出現(xiàn)密鑰并保存后,ADB Driver installer點(diǎn)擊refresh就會(huì)出現(xiàn)手機(jī)設(shè)備。
打開(kāi)android killer,點(diǎn)擊android,在已找到的設(shè)備中選擇手機(jī)設(shè)備后,點(diǎn)擊日志即可查看Android設(shè)備日志信息。
點(diǎn)擊開(kāi)始進(jìn)行日志記錄,此時(shí)手機(jī)app綁定智能手環(huán)進(jìn)行操作時(shí),就會(huì)抓取到手機(jī)app的日志信息。
日志信息中,會(huì)包含藍(lán)牙通信等信息,有助于幫助我們分析藍(lán)牙通信流程。若此時(shí)出現(xiàn)有利于我們分析藍(lán)牙流程的日志信息,我們可以通過(guò)有限的信息對(duì)app進(jìn)行逆向分析,找出藍(lán)牙實(shí)現(xiàn)的功能實(shí)現(xiàn)。
當(dāng)Android killer日志信息不能獲取到有效信息時(shí),我們可以手機(jī)開(kāi)發(fā)者選項(xiàng)中打開(kāi)啟用藍(lán)牙HCI信息收集日志開(kāi)關(guān),設(shè)置完之后電腦adb連接手機(jī),然后打開(kāi)藍(lán)牙設(shè)備和手機(jī)上和連接設(shè)備的APP,這個(gè)過(guò)程藍(lán)牙設(shè)備和app間發(fā)送的數(shù)據(jù)包都會(huì)被記錄下來(lái)。
收集完畢后,我們可以使用"adb pull /data/log/bt"將已收集的藍(lán)牙日志文件保存到adb環(huán)境中的bt文件夾下。
使用wireshark分析日志文件,當(dāng)使用手機(jī)app查看今日數(shù)據(jù)時(shí),手環(huán)會(huì)發(fā)送總步數(shù)、心率、睡眠時(shí)間等信息給手機(jī)app。
當(dāng)使用手機(jī)收到短信時(shí),手環(huán)會(huì)進(jìn)行提醒,此過(guò)程中app藍(lán)牙數(shù)據(jù)包傳入手環(huán)。
一個(gè)簡(jiǎn)單例子
上面我們講解了低功耗藍(lán)牙的基礎(chǔ)知識(shí)和抓包技巧。這里做一個(gè)簡(jiǎn)單的攻擊示例,目的是向手環(huán)發(fā)送信息使其顯示。
首先是抓包分析,這里嘗試使用nrf52840對(duì)其進(jìn)行抓包,只能抓到廣播通道報(bào)文,抓包無(wú)果。
然后嘗試使用Android killer日志信息
根據(jù)其調(diào)試信息,嘗試對(duì)手機(jī)app進(jìn)行逆向分析,并沒(méi)有找到發(fā)送信息相關(guān)的有效代碼,分析無(wú)果。
最后,使用hci調(diào)試日志進(jìn)行抓包,抓取其通信包裹。
獲取log文件后,使用wireshark進(jìn)行分析。發(fā)現(xiàn)當(dāng)我們連接手環(huán)后的讀取信息的操作與寫(xiě)入操作均在handle 0x11進(jìn)行操作,返回handle位0x0e,并且wirte指令操作在uuid為0xff00的特性中,那么我們就明確了攻擊的服務(wù)特性和handle。
重新使用hci調(diào)試日志進(jìn)行抓包,這次抓包過(guò)程做了發(fā)送倆次信息的操作,手環(huán)并且成功顯示。
第一次發(fā)送信息人為:pwn,信息為:111
第二次發(fā)送信息人為:pwn,信息為:222
分析時(shí),我們重點(diǎn)關(guān)注write command,并且handle為0x11,找到了發(fā)送信息人前面的報(bào)文為0x0a020000020e
這里為發(fā)送提示信息人的報(bào)文
這里為發(fā)送信息內(nèi)容的報(bào)文
這里為發(fā)送信息內(nèi)容的報(bào)文的后一條報(bào)文
緊接著就是第二次發(fā)送信息人之間的一條報(bào)文
后面與第一次發(fā)送報(bào)文相同
那么我們就知道了,發(fā)送第一次信息和第二次信息都發(fā)送了4個(gè)報(bào)文,分別為信息推送報(bào)文,信息人報(bào)文,信息內(nèi)容報(bào)文,結(jié)束推送報(bào)文。那么我們就可以在0xff02特性中進(jìn)行write with no response操作,重放這些報(bào)文進(jìn)行驗(yàn)證。
注意:中心設(shè)備與手環(huán)發(fā)送消息需要發(fā)送報(bào)文進(jìn)行綁定,這里為了方便操作,這里我直接使用手機(jī)藍(lán)牙調(diào)試工具進(jìn)行發(fā)送。
驗(yàn)證成功后,后續(xù)當(dāng)我們分析出每一條操控藍(lán)牙設(shè)備的指令,就可以將想要發(fā)送的消息按照指定格式進(jìn)行發(fā)送與BLE設(shè)備通訊,從而實(shí)現(xiàn)對(duì)藍(lán)牙設(shè)備的攻擊。
?
總結(jié)
? 這一小節(jié),我們學(xué)習(xí)藍(lán)牙無(wú)線通信的基礎(chǔ)知識(shí),以及對(duì)藍(lán)牙智能手環(huán)的簡(jiǎn)單抓包分析和攻擊,初步理解了低功耗藍(lán)牙的內(nèi)容。
?蛇矛實(shí)驗(yàn)室成立于2020年,致力于安全研究、攻防解決方案、靶場(chǎng)對(duì)標(biāo)場(chǎng)景仿真復(fù)現(xiàn)及技戰(zhàn)法設(shè)計(jì)與輸出等相關(guān)方向。團(tuán)隊(duì)核心成員均由從事安全行業(yè)10余年經(jīng)驗(yàn)的安全專家組成,團(tuán)隊(duì)目前成員涉及紅藍(lán)對(duì)抗、滲透測(cè)試、逆向破解、病毒分析、工控安全以及免殺等相關(guān)領(lǐng)域。
審核編輯:湯梓紅
評(píng)論