在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            博客專欄

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

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

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

            老讀者應(yīng)該知道,魚鷹在實(shí)驗(yàn)室一直使用自制的 STlink,這次魚鷹想制作 J-LINK,然后找到了這么一篇文章,大家可以學(xué)習(xí)一下。

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

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

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

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

            1.jpg

            image

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

            板子錯(cuò)誤挺多的,最嚴(yán)重的是 CP2102 芯片整個(gè)是用飛線飛過去的。。

            2.jpg

            image

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

            新舊對(duì)比。板子很快就做好了。

            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,每次鏈接都會(huì)提示固件升級(jí),神煩。

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

            拿 JlinkARM.dll 開刀

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

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

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

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

            開始挖坑

            需要的工具是 WinHex

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

            4.jpg

            image

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

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

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

            5.jpg

            image

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

            6.jpg

            image

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

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

            原博對(duì) 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)在有兩個(gè)思路,

            找到 5.12 里面的 0x0A0E8,看看這個(gè)長(zhǎng)度信息的位置有什么線索。

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

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

            填坑

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

            線索就是,直接搜索單片機(jī)的型號(hào)!

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

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

            7.jpg

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

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

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

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

            7.jpg

            很輕松就找到了關(guān)于 STM32F072的描述,然后根據(jù) 保留的 FF 和 00, 往前推 12 行, 看到一個(gè)“60 1D 00 20” 開頭的字段??吹降牡谝谎?,我就很肯定這就是固件的開頭了!

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

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

            然而,我不需要知道固件的長(zhǎng)度。因?yàn)楣碳拇娣?,是連續(xù)的,這是我在瀏覽上下文發(fā)現(xiàn)的一個(gè)規(guī)律。我只需要知道下一個(gè)固件什么時(shí)候開始,然后大概裁剪一下就好了。原則是只能多裁剪,不能少裁剪。

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

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

            9.jpg

            嘿嘿,下一個(gè)居然是 STM32F103 的 Jlink OB 固件。

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

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

            10.jpg

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

            再挖一個(gè)坑

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

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

            11.jpg

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

            12.jpg

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

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

            13.jpg

            保存,測(cè)試,失敗。

            坑不填了

            就這么先用著吧。

            因?yàn)楣碳煌昝?,最新?Jlink OB STM32F072 的 bin 文件 (來自 6.20e) 就不放了,如果有需求清留言。

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

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

            關(guān)于固件自動(dòng)升級(jí)的問題

            答案是:不能

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

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

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

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



            關(guān)鍵詞: 單片機(jī)

            相關(guān)推薦

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

            關(guān)閉