色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

          EEPW首頁 > 博客 > 大佬硬生生從 dll 里面提取出了 JLink 固件

          大佬硬生生從 dll 里面提取出了 JLink 固件

          發(fā)布人:魚鷹談單片機 時間:2021-08-21 來源:工程師 發(fā)布文章

          老讀者應該知道,魚鷹在實驗室一直使用自制的 STlink,這次魚鷹想制作 J-LINK,然后找到了這么一篇文章,大家可以學習一下。

          (有時間可以給大家提供 ST-link、J-link 固件,這些在網(wǎng)上基本都能找到)

          來源 :https://www.jianshu.com/p/0cd3a513f1b1

          我做的板子,在保證功能完整的情況下,一般都會盡量做小。于是就 2.54mm 排針,或者標準的 JTAG 的體積我都不能忍。。不管什么芯片,我都會上 RT-Thread, RTT 的 finsh 調(diào)試非常好用,但是必須要有串口。

          所以,大概是在大二做飛控的時候,我定義了一個 8-pin 的 FPC 來做專用的調(diào)試,里面包含了 SWD 和 UART。并且 SWD 是帶 SWO 的。

          1.jpg

          image

          這么多年來,我只做了一個調(diào)試器,用的 USB HUB 芯片,把 Jlink OB 和 CP2102 整合在一塊板子上。

          板子錯誤挺多的,最嚴重的是 CP2102 芯片整個是用飛線飛過去的。。

          2.jpg

          image

          就這么不穩(wěn)定地過了好多年,在知道 STM32F072 的 Jlink OB 同時支持了虛擬 UART 之后,就決定還是要做一個新的。

          新舊對比。板子很快就做好了。

          3.jpg

          image

          有了硬件,開始愁固件了。

          這位大神(http://akb77.com/g/stm32/jlink-ob/),從JlinkARM.dll 里面硬生生把 STM32F072 的Jlink OB 固件給拔出來了。

          牛不牛掰!

          可惜他的帖子里面提供的文件,是從5.12版本的 JlinkARM.dll,里面拔出來的,現(xiàn)在最新的到了至少 6.20, 我的 keil 里面是 6.10j,每次鏈接都會提示固件升級,神煩。

          而且在我的板子上,出現(xiàn)了點擊取消升級后,板子掉線的情況。

          拿 JlinkARM.dll 開刀

          于是我打算自己嘗試把固件拔出來。方法跟他的一樣,從 JlinkARM.dll 下手。

          他本人已經(jīng)在帖子里面回復了最新的 6.10n 這個版本的 JlinkARM.dll 的固件位置

          Can't say about 610i but for 610n start from 0x8C8054 and length 0x0B66C

          不過我沒找到這個版本的 JlinkARM.dll。我打算拿自己 keil 帶的 6.10j 的dll來嘗試定位 STM32 的固件位置。

          開始挖坑

          需要的工具是 WinHex

          首先我嘗試打開從他博客下載的固件,我的設想是,在我的 JlinkARM.dll 里面找看看,有沒有一樣的至少前面幾個字節(jié)。比如這幾個,0x38 1C 00 20

          4.jpg

          image

          結(jié)果并沒有。我又試試找了其他的字段,并沒有什么線索。

          我反思了一下,既然固件是有可能變化的,那我還是嘗試一下在博客主用的 5.12j 的 JlinkARM.dll 里面先定位一下固件。

          于是我把 5.12j 下了下來,打開后果然定位到了固件的位置。這個版本的固件,是 38 1C 開頭的。

          5.jpg

          image

          但是要怎么在其他版本的 JlinkARM.dll 里面定位呢?依舊用我手上的 6.10j 版本的 JlinkARM.dll 試一下。我注意到了固件之前,也就是 38 1C 之前的這幾個字節(jié)。先不管他們有什么意義,先在 6.10j 里面搜搜試試。

          6.jpg

          image

          哈哈哈,果然給我找到了,難道固件就是后面  4A 25 00 EA 開頭的么?現(xiàn)在還不好確定。先假設這里就是開始位置,那么長度是多少?

          于是我又回到 5.12j 里面,參考一下原博,找找是否有長度信息。

          原博對 5.12j 版本的描述

          Extract binary part from JLinkARM.dll (from JLink_V512)
          For example from offset 7153340 (0x6D26BC) and size 41192 (0x0A0E8).
          Use any binary extraction tool as you prefer.

          現(xiàn)在有兩個思路,

          找到 5.12 里面的 0x0A0E8,看看這個長度信息的位置有什么線索。

          找到固件的結(jié)尾,看看是否是一個固定的特殊格式

          打住!以上是錯誤的。上面那個圖,仔細看的話,就會發(fā)現(xiàn),右邊的描述里面,寫著,這個固件是給 SAM7 用的,而不是STM32?。?!而且,博主并不是用 5.12j 的 JlinkARM.dll 開刀的!偏移地址根本不對。慢慢的坑。

          填坑

          雖然上面找到的代碼,并不合適 STM32F072,但是!我找到了線索和規(guī)律,

          線索就是,直接搜索單片機的型號!

          規(guī)律就是,不同芯片的固件,是連續(xù)放置的!

          先看線索,在博主提供的 5.12 版本里面提取的固件中,有這樣一個規(guī)律。

          7.jpg

          單片機相關的描述之前,有一些 64個字節(jié)的 FF 和 16個字節(jié)的 00,這些明顯是保留的塊,具體用來干嘛的我不懂,我也不想理。然后之前是 12 * 16 個字節(jié)的數(shù)據(jù),我印象中,這個地方應該是放置了中斷跳轉(zhuǎn)的函數(shù)指針,具體不確定。

          但是,他們的長度是固定的,也就是說,找到單片機的描述,再往前推一定數(shù)量的字節(jié),就是固件開始地方!

          具體是多少個字節(jié)呢,17行 * 16 = 0x1FA 個 (506個)。

          好了,那我們就去其他版本的 JlinkARM.dll 里面搜,這里以我手上的 6.10j 版本為例。

          7.jpg

          很輕松就找到了關于 STM32F072的描述,然后根據(jù) 保留的 FF 和 00, 往前推 12 行, 看到一個“60 1D 00 20” 開頭的字段。看到的第一眼,我就很肯定這就是固件的開頭了!

          因為這個跟博主提供的 5.12 版本的固件太像了 “30 1C 00 20”。最后兩個字節(jié)一模一樣?!?0” 和 “60” 在二進制上,只移位了1位,然后 1D 就很簡單的是 1C+1.

          找到開頭了,可喜可賀,那么固件的長度是多少呢?找不到固件的長度,裁剪不出來,有個毛用?

          然而,我不需要知道固件的長度。因為固件的存放,是連續(xù)的,這是我在瀏覽上下文發(fā)現(xiàn)的一個規(guī)律。我只需要知道下一個固件什么時候開始,然后大概裁剪一下就好了。原則是只能多裁剪,不能少裁剪。

          有人會擔心,如果多余的字節(jié)被裁剪進去了,會不會影響程序,答案是否定的。為啥自己去考慮考慮。

          于是我開始尋找下一個固件開始的位置,怎么找?直接用手翻。也就 40+k 的固件大小,翻幾十頁就好了。鼠標點幾下還是很快的。

          9.jpg

          嘿嘿,下一個居然是 STM32F103 的 Jlink OB 固件。

          到這里其實可以結(jié)束了,想省事,直接裁剪到那堆 FFFF 里面隨意位置就好,因為顯然這個地方已經(jīng)是另一個固件開始的地方了。符合“只多裁,不少裁”的原則。當然我是按 32bit 對齊裁剪的。新建一個文件,把固件開始位置,到結(jié)束位置復制過去,然后保存為 .bin 就可以了。

          下載,測試,bingo!固件顯示已經(jīng)是 2017年5月的固件,比我的 jlink 驅(qū)動還新。這回不會再提示更新固件了吧

          10.jpg

          但是如果我想知道固件準確的結(jié)束位置,怎么辦

          再挖一個坑

          仔細看了一下 F103 的固件,保留的 FF 區(qū)域的大小,跟 F072 固件完全不同,那我就很難確定了。當然,F(xiàn)103 的 Jlink OB 固件滿天飛,去網(wǎng)站上下一個,用相同的方法查看 F103 固件的偏移量,就大概能知道是什么地方開始的了。但是,知道開始的位置并沒有什么用,雖然 JlinkARM.dll 里面固件看起來是連續(xù)存放的,但是固件之間可能會有一些其他的描述符。如果想去除這些,必須找到真正的固件結(jié)束位置。

          然后我就繼續(xù)往上翻了。滾了幾個滾輪之后,馬上看到了熟悉的 pattern。一大堆 "0xFE 0xE7"

          11.jpg

          對比一下 5.12 JlinkARM.dll 提取的固件結(jié)尾:

          12.jpg

          非常相似,所以呢,大概就是這個地方了。

          然而并不是這樣。。。反正這個地方失敗了

          13.jpg

          保存,測試,失敗。

          坑不填了

          就這么先用著吧。

          因為固件不完美,最新的 Jlink OB STM32F072 的 bin 文件 (來自 6.20e) 就不放了,如果有需求清留言。

          看完以上,需要的人應該已經(jīng)能自己定位固件的位置自己提取最新版本的固件了。

          ST 的 DFU 軟件也是各種各樣的坑,祝好。

          關于固件自動升級的問題

          答案是:不能

          以上固件在單片機的 flash 中,是從 0x8004800 開始的,從 0x8000000 開始,是 bootloader。

          問題在于,博客里面提供的 bootloader 并不是 jlink 寫的 bootloader。博客里面能下載的bootloader,我查看了一下,非常短。我推斷它只提供了很簡單的跳轉(zhuǎn)到 0x8004800 的功能。

          這就導致了 Jlink 的驅(qū)動,無法升級固件。沒授權(quán)下拿到 Jlink 提供的 bootloader 的可能性極小。

          *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



          關鍵詞: 單片機

          相關推薦

          技術(shù)專區(qū)

          關閉