破譯優利德旗艦萬用表UT181A通訊協議
UT181A是優利德門下旗艦級手持數字萬用表,主打數據記錄(Data Logging)功能,支持USB聯機通訊。基本評測可以看我以前發的文章。前文說到,其官方或第三方軟體功能有限,缺少最重要的導出功能。另外,數據傳輸的速度也比較慢。
所以,欲對其協議進行分析,方便擴展、改進、和其它設備(比如樹莓派)連接、等等。
本文的破解/破譯方法及結論應該適用於UT171系列;UT71系列也可以參考。對破譯其它聯機通訊的設備也有借鑒意義。
可行性分析
UT181A使用了Silicon Labs HID-to-UART介面模塊CP2110. 在操作系統里呈現為一個HID設備,這樣的好處是不用裝驅動。既然它最終表現為UART協議,應該比較容易重寫其通訊協議。其實UT71系列也是類似的方案(HID轉UART),只不過用的南京沁恆的模塊。
找了一個CP2110的代碼在Linux下試了下,可以對UT181A進行基本的連接設置。但因為會話層的協議未知,所以嘗試讀寫操作時沒反應。
為了得到會話的詳情,最直接和萬能的辦法是用USB Sniffer。 試了一下Free USB Analyzer,可以看到一些數據,但不能解碼為UART層的數據。從USB到HID,再到UART,實際上是隔了兩層,需要層層剝殼,還是有點繁瑣。Free USB Analyzer的HID解碼,是解為鍵盤/滑鼠數據的;也許它的收費版可以解碼為UART。
圖:
用Free USB Analyzer截獲UT181A通訊不過我還有另一條完全不同的思路,也許會更簡單。
API Hook
十幾年前,我用過這種方法對SCSI設備的通訊進行劫獲。這些設備的通訊軟體,通常會有一個通訊模塊(動態庫),提供諸如Send/Receive的API。所以,只要自己寫一個提供同樣API的動態庫取代原有的動態庫,但在每個API的實現上,還是轉到原動態庫上,就可以實現鉤子(Hook)的效果。這樣截獲的數據塊是應用層/會話層的,比數據鏈路層/驅動層的數據有更好的可讀性。同時,還可以根據API的調用順序,得到和設備的交互流程,比如:初始化時要進行哪些設置,通訊參數,等等。
查看UT181A軟體的目錄,果然有兩個這樣的動態庫。用dumpbin /exports查看其API,初步判斷應該只要替換SLABHIDtoUART.dll 就可以了。
圖:
UT181A使用的動態庫及API從版本信息上,可以看到這個動態庫來自Silicon Labs。到其網站上找到了CP2110/4 的SDK,用SDK里的動態庫替換這兩個動態庫,64位版崩潰,換32位版,果然可以運行。
其實優利德使用的版本較老(2010年的1.4),SDK里的版本是2017年的6.7。其中,API數目由42增加到了58。不管怎樣,能跑。這樣就容易開展下一步的工作了。
圖:
CP211x SDK里的動態庫及API有了SDK就有了頭文件,有頭文件就可以寫出八股文一樣的代碼了。弄兩行腳本,自動生成大部分苦力代碼。。
圖:
HookAPI實現代碼示意很快,就有了一個「山寨」動態庫。
圖:
自己實現的SLABHIDtoUART.dll及API正版的要改名;山寨版要記住它名字。——活都找它干。
圖:
HookAPI的文件名替換
弄好了,發現山寨版的比老正版的API都少了2個。能跑,就沒深究了,畢竟優利德的軟體不會用到所有API。
看看Log文件,API的調用一目了然。這樣,我們就有了一個堅實的基礎。
圖:
通過HookAPI截獲的API調用序列CP211x SDK
發現CP211x的SDK里還提供了Linux版Library(-lslabhidtouart -lslabhiddevice)的源代碼及例子。
這兩個Library和Windows的SLABHIDtoUART.dll,SLABHIDDevice.dll對應。於是,重寫通訊協議就更容易了。對Makefile略做修改後,可以在Intel和ARM(樹莓派)架構下編譯、運行。
直接用SDK里的例子做個測試,發出第一條命令」AB CD 04 00 05 01 0A 00」後,就可以源源不斷地收到數據了。
圖:
CP211x SDK里例子和UT181A通訊後續的工作就是根據API Hook的Log,給UT181A發不同的命令,研究其反應,搜集更多的數據,以便發現數據的模式(Pattern)。
協議解碼
起始碼、長度字
上圖中,通過觀察每個輸入/輸出的數據包,發現會間隔地出現」AB CD」。用這兩個位元組對包進行分隔後,數據看起來更有規律,然後可以看出接下來兩個位元組應該是包的長度。長度可以和起始字起到相互驗證/確認的作用。
圖:
基本的會話數據結束碼/檢驗字
對收到的數據包與其實際意義進行初步的對應後,發現最後兩位元組是多餘的。推測應該是校驗字。在CRC在線計算網站上對包中的數據做CRC計算,發現與任何一種CRC編碼都不能匹配。
其實,對收到的數據,可以忽略這個校驗碼,因為USB協議保證了數據不會出錯,除非是軟體層發生了錯誤。但後來發現,對發送的命令,也多了兩個位元組。如果萬用表那端要對它收到的數據做校驗,主機端則必須生成校驗碼了。
下圖的命令中,帶有參數。9位元組長的包中有一個參數,13位元組長的包有2個參數。根據參數的變化,可以觀察出最後兩位元組的變化規律。觀察9位元組長的包,發現最後兩位元組是在參數上增加了0x11,但這顯然不能解釋13位元組長的包。進一步的分析發現,原來這個校驗就是最簡單的「校驗和」,即把前面的所有位元組(除起始碼」AB CD」外)相加。對於長達2258位元組的包也是這樣,只不過高位溢出忽略。
圖:
觀察結束碼浮點數的表示
理論上,測量值可以用整數或小數表示,小數又可以用定點或浮點。
可以用程式控制電源輸出不同的電壓來聯機測量,觀察數據的變化規律。當然,也可以直接猜一猜,反正就只有3種可能。下圖是一個例 子。
圖:
記錄列表及浮點值圖中標示了27.0, 27.1, 27.2。
不太像整型,直接拿浮點試一試。
圖:
浮點數測試代碼運氣不錯,就是普通的浮點。同時,可以看出,二進位的數據並不是萬用表或軟體界面上顯示的值,而是看起來有著「更高精度」的原始數據。當然,這個「更高精度」應該是無意義的。事實上,每個數值後面還有一個位元組(10/20/30),應該是用於描述其精度(有效位)的。
日期/時間的表示
最後剩下的,也是最難的,就是日期時間了。時間戳也是增加UT181A價值的地方。像UT71D雖然也記錄數據,但測量值沒有時間戳,只有序號。
抓取採樣數據進行分析,每個數據包最大是2258位元組,250個採樣,所以每個採樣用了9個位元組:4位元組浮點值,1位元組描述精度,還有4位元組就是時間了。是的,只有4位元組,用來表示年/月/日/時/分/秒。——夠嗎?
在採集的數據中,每個採樣對應於什麼時間是已知的。取一段連續的採樣數據,觀察其變化規律。尤其是分鐘,小時,日期和月份發生變化時,看數據如何變化。如下圖。
圖:
時間數據觀察理論上,這種時間的表示可以用一個整型,像Unix時間戳那樣。但分析上面的變化規律,看起來像是位域表示法。據此推演,結果如下。
圖:
UT181A的時間的表示法由於年份使用的是6 bit,需要固定加上2000。所以,這意味著UT181A只能用到2063年(的最後一天)。當然,這總比用Unix時間戳編碼要好一點,因為後者只能用到2038年。
傳輸速度
非常遺憾,波特率只能設置為9600。通過API調用,設置更高的波特率是成功的。但傳輸中得到的數據是亂的。
在樹莓派上測試傳輸133685個採樣,耗時1401秒,傳輸速度為95.42採樣/秒。這與PC上的速度(自己寫的代碼或官方軟體)是一致的。
樹莓派
在Debian系的Linux上(Ubuntu或樹莓派),CP2110都被識別為HID設備,不需要安裝驅動即可使用。而且,樹莓派的ARM和Intel都是小位元組序,所以不用改代碼,重新編譯一下就可以運行。
下圖是在樹莓派上(遠程)編譯、運行。
在樹莓派上編譯運行UT181A通訊程序
上一張和樹莓派的合影。
圖:
UT181A與樹莓派2063年測試
在2016年2月12日,據披露,如果把蘋果iPhone、iPad等設備的系統時間設置為1970年1月1日,隨後重啟設備,它會直接變磚。
心懷忐忑與好奇,我決定確認一下2063年12月31日的問題,於是準備把時間設置到那天的最後一分鐘。
但優利德的工程師似乎看穿了我的心思:時間只能設置到2060年!
圖:UT181A的時間只能設置到2060年
等了1分鐘後,時間變成了2061年。
但,如果我想看它出洋相,需要等上3年!——太狡猾了!
結語
通過API Hook的手段,在Windows上截獲了 CP2110的通訊詳情,破譯了UT181A命令和數據的編碼方式,重寫了主要的會話過程,實現了:實時聯機採集數據、傳輸離線採集的數據並保存為CSV的功能。代碼可以在Linux PC和樹莓派上運行(理論上,也可以移植到Windows上)。
受硬體限制,不能設置非9600的波特率,所以不能提高傳輸速度。
「致命缺陷」是:由於時間的編碼方式, UT181A只能使用到2063年。
*本文作者:loblab,轉載請註明來自 FreeBuf.COM
※IT專業人士與政策制定者:如何才能跨過交流鴻溝
※FreeBuf的黑闊們七夕都怎麼過?
※身體改造會是人類的未來嗎?植入14枚「插件」的生物黑客Patrick Paumen專訪
TAG:FreeBuf |
※俘獲U110與破譯恩尼格瑪
※AI嘗試破譯大腦語言信號,轉化準確率為40%至80%
※6月26日,19年前,人類基因組「草圖」向全世界公布,生命密碼基本破譯
※6000年的印加石被破譯?科學家:它是6000年前的宇宙星圖
※iPhone 9/ XS / XS Plus /AirPods 2? 3分鐘破譯蘋果新品6大傳聞
※600多年歷史,240頁厚的伏尼契神秘手稿,如今被人工智慧破譯!
※解密600年前的秘密,科學家利用AI成功破譯「伏尼契手稿」第一句
※90天破譯Behance大神的合成密碼
※紅軍中的「千里眼」!17歲小兵4年破譯敵軍1051本密碼,堪稱無敵
※深度學習 + 基因組學:破譯人類 30 億鹼基對
※深度學習+基因組學:破譯人類 30 億鹼基對
※古代的CD?4000年前神秘圓盤已破譯一半
※破譯一個甲骨文字可以獎勵10萬元?聽說還有4000多個文字還沒破譯
※日軍能破譯國民政府軍隊密碼的80% | 短史記
※PNAS:「破譯」DNA的更好方法
※破譯「困擾世界100年」的謎團!中國開始用望遠鏡破譯外星信號
※射電望遠鏡接到15億光年外13個神秘信號,科學家無法破譯!
※6399: 第五人格密碼機怎麼破譯 第五人格密碼機破譯方法
※國學教材新編法:48個漢字,破譯中華文明基因
※考古突破!1300年前的古埃及「魔法咒語」終於被破譯了