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

鱼鹰谈单片机 2021-08-19 21:55

老读者应该知道,鱼鹰在实验室一直使用自制的 STlink,这次鱼鹰想制作 J-LINK,然后找到了这么一篇文章,大家可以学习一下。

(有时间可以给大家提供 ST-link、J-link 固件,这些在网上基本都能找到)

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


我做的板子,在保证功能完整的情况下,一般都会尽量做小。于是就 2.54mm 排针,或者标准的 JTAG 的体积我都不能忍。。不管什么芯片,我都会上 RT-Thread, RTT 的 finsh 调试非常好用,但是必须要有串口。

所以,大概是在大二做飞控的时候,我定义了一个 8-pin 的 FPC 来做专用的调试,里面包含了 SWD 和 UART。并且 SWD 是带 SWO 的。


image

这么多年来,我只做了一个调试器,用的 USB HUB 芯片,把 Jlink OB 和 CP2102 整合在一块板子上。

板子错误挺多的,最严重的是 CP2102 芯片整个是用飞线飞过去的。。


image

就这么不稳定地过了好多年,在知道 STM32F072 的 Jlink OB 同时支持了虚拟 UART 之后,就决定还是要做一个新的。

新旧对比。板子很快就做好了。


image

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

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

牛不牛掰!

可惜他的帖子里面提供的文件,是从5.12版本的 JlinkARM.dll,里面拔出来的,现在最新的到了至少 6.20, 我的 keil 里面是 6.10j,每次链接都会提示固件升级,神烦。

而且在我的板子上,出现了点击取消升级后,板子掉线的情况。

拿 JlinkARM.dll 开刀

于是我打算自己尝试把固件拔出来。方法跟他的一样,从 JlinkARM.dll 下手。

他本人已经在帖子里面回复了最新的 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 里面找看看,有没有一样的至少前面几个字节。比如这几个,0x38 1C 00 20


image

结果并没有。我又试试找了其他的字段,并没有什么线索。

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

于是我把 5.12j 下了下来,打开后果然定位到了固件的位置。这个版本的固件,是 38 1C 开头的。


image

但是要怎么在其他版本的 JlinkARM.dll 里面定位呢?依旧用我手上的 6.10j 版本的 JlinkARM.dll 试一下。我注意到了固件之前,也就是 38 1C 之前的这几个字节。先不管他们有什么意义,先在 6.10j 里面搜搜试试。


image

哈哈哈,果然给我找到了,难道固件就是后面  4A 25 00 EA 开头的么?现在还不好确定。先假设这里就是开始位置,那么长度是多少?

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

原博对 5.12j 版本的描述

  1. 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.

现在有两个思路,

  1. 找到 5.12 里面的 0x0A0E8,看看这个长度信息的位置有什么线索。

  2. 找到固件的结尾,看看是否是一个固定的特殊格式

打住!以上是错误的。上面那个图,仔细看的话,就会发现,右边的描述里面,写着,这个固件是给 SAM7 用的,而不是STM32!!!而且,博主并不是用 5.12j 的 JlinkARM.dll 开刀的!偏移地址根本不对。慢慢的坑。

填坑

虽然上面找到的代码,并不合适 STM32F072,但是!我找到了线索和规律,

线索就是,直接搜索单片机的型号!
规律就是,不同芯片的固件,是连续放置的!

先看线索,在博主提供的 5.12 版本里面提取的固件中,有这样一个规律。


image

单片机相关的描述之前,有一些 64个字节的 FF 和 16个字节的 00,这些明显是保留的块,具体用来干嘛的我不懂,我也不想理。然后之前是 12 * 16 个字节的数据,我印象中,这个地方应该是放置了中断跳转的函数指针,具体不确定。

但是,他们的长度是固定的,也就是说,找到单片机的描述,再往前推一定数量的字节,就是固件开始地方!

具体是多少个字节呢,17行 * 16 = 0x1FA 个 (506个)。

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

image

很轻松就找到了关于 STM32F072的描述,然后根据 保留的 FF 和 00, 往前推 12 行, 看到一个“60 1D 00 20” 开头的字段。看到的第一眼,我就很肯定这就是固件的开头了!

因为这个跟博主提供的 5.12 版本的固件太像了 “30 1C 00 20”。最后两个字节一模一样。“30” 和 “60” 在二进制上,只移位了1位,然后 1D 就很简单的是 1C+1.

找到开头了,可喜可贺,那么固件的长度是多少呢?找不到固件的长度,裁剪不出来,有个毛用?

然而,我不需要知道固件的长度。因为固件的存放,是连续的,这是我在浏览上下文发现的一个规律。我只需要知道下一个固件什么时候开始,然后大概裁剪一下就好了。原则是只能多裁剪,不能少裁剪。

有人会担心,如果多余的字节被裁剪进去了,会不会影响程序,答案是否定的。为啥自己去考虑考虑。

于是我开始寻找下一个固件开始的位置,怎么找?直接用手翻。也就 40+k 的固件大小,翻几十页就好了。鼠标点几下还是很快的。

image

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

到这里其实可以结束了,想省事,直接裁剪到那堆 FFFF 里面随意位置就好,因为显然这个地方已经是另一个固件开始的地方了。符合“只多裁,不少裁”的原则。当然我是按 32bit 对齐裁剪的。新建一个文件,把固件开始位置,到结束位置复制过去,然后保存为 .bin 就可以了。

下载,测试,bingo!固件显示已经是 2017年5月的固件,比我的 jlink 驱动还新。这回不会再提示更新固件了吧


image

但是如果我想知道固件准确的结束位置,怎么办

再挖一个坑

仔细看了一下 F103 的固件,保留的 FF 区域的大小,跟 F072 固件完全不同,那我就很难确定了。当然,F103 的 Jlink OB 固件满天飞,去网站上下一个,用相同的方法查看 F103 固件的偏移量,就大概能知道是什么地方开始的了。但是,知道开始的位置并没有什么用,虽然 JlinkARM.dll 里面固件看起来是连续存放的,但是固件之间可能会有一些其他的描述符。如果想去除这些,必须找到真正的固件结束位置。

然后我就继续往上翻了。滚了几个滚轮之后,马上看到了熟悉的 pattern。一大堆 "0xFE 0xE7"

image

对比一下 5.12 JlinkARM.dll 提取的固件结尾:

image

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

然而并不是这样。。。反正这个地方失败了

image

保存,测试,失败。

坑不填了

就这么先用着吧。

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

看完以上,需要的人应该已经能自己定位固件的位置自己提取最新版本的固件了。
ST 的 DFU 软件也是各种各样的坑,祝好。

关于固件自动升级的问题

答案是:不能
以上固件在单片机的 flash 中,是从 0x8004800 开始的,从 0x8000000 开始,是 bootloader。

问题在于,博客里面提供的 bootloader 并不是 jlink 写的 bootloader。博客里面能下载的bootloader,我查看了一下,非常短。我推断它只提供了很简单的跳转到 0x8004800 的功能。

这就导致了 Jlink 的驱动,无法升级固件。没授权下拿到 Jlink 提供的 bootloader 的可能性极小。

鱼鹰谈单片机 面向软件开发进阶读者,分享包括但不限于 C 语言、KEIL、STM32、51 等知识!
评论
  • 国产数字隔离器已成为现代电子产品中的关键部件,以增强的性能和可靠性取代了传统的光耦合器。这些隔离器广泛应用于医疗设备、汽车电子、工业自动化和其他需要强大信号隔离的领域。准确测试这些设备是确保其质量和性能的基本步骤。如何测试数字隔离器测试数字隔离器需要精度和正确的工具集来评估其在各种条件下的功能和性能。以下设备对于这项任务至关重要:示波器:用于可视化信号波形并测量时序特性,如传播延迟、上升时间和下降时间。允许验证输入输出信号的完整性。频谱分析仪:测量电磁干扰(EMI)和其他频域特性。有助于识别信号
    克里雅半导体科技 2024-12-20 16:35 71浏览
  • 百佳泰特为您整理2024年12月各大Logo的最新规格信息。——————————USB▶ 百佳泰获授权进行 USB Active Cable 认证。▶ 所有符合 USB PD 3.2 标准的产品都有资格获得USB-IF 认证——————————Bluetooth®▶ Remote UPF Testing针对所有低功耗音频(LE Audio)和网格(Mesh)规范的远程互操作性测试已开放,蓝牙会员可使用该测试,这是随时测试产品的又一绝佳途径。——————————PCI Express▶ 2025年
    百佳泰测试实验室 2024-12-20 10:33 118浏览
  • Supernode与艾迈斯欧司朗携手,通过Belago红外LED实现精准扫地机器人避障;得益于Belago出色的红外补光功能,使扫地机器人能够大大提升其识别物体的能力,实现精准避障;Belago点阵照明器采用迷你封装,兼容标准无铅回流工艺,适用于各种3D传感平台,包括移动设备、物联网设备和机器人。全球领先的光学解决方案供应商艾迈斯欧司朗(瑞士证券交易所股票代码:AMS)近日宣布,与国内领先的多行业三维视觉方案提供商超节点创新科技(Supernode)双方联合推出采用艾迈斯欧司朗先进Belago红
    艾迈斯欧司朗 2024-12-20 18:55 80浏览
  • 光耦合器,也称为光隔离器,是用于电气隔离和信号传输的多功能组件。其应用之一是测量电路中的电压。本文介绍了如何利用光耦合器进行电压测量,阐明了其操作和实际用途。使用光耦合器进行电压测量的工作原理使用光耦合器进行电压测量依赖于其在通过光传输信号的同时隔离输入和输出电路的能力。该过程包括:连接到电压源光耦合器连接在电压源上。输入电压施加到光耦合器的LED,LED发出的光与施加的电压成比例。光电二极管响应LED发出的光由输出侧的光电二极管或光电晶体管检测。随着LED亮度的变化,光电二极管的电阻相应减小,
    腾恩科技-彭工 2024-12-20 16:31 73浏览
  • //```c #include "..\..\comm\AI8051U.h"  // 包含头文件,定义了硬件寄存器和常量 #include "stdio.h"              // 标准输入输出库 #include "intrins.h"         &n
    丙丁先生 2024-12-20 10:18 84浏览
  • 耳机虽看似一个简单的设备,但不仅只是听音乐功能,它已经成为日常生活和专业领域中不可或缺的一部分。从个人娱乐到专业录音,再到公共和私人通讯,耳机的使用无处不在。使用高质量的耳机不仅可以提供优良的声音体验,还能在长时间使用中保护使用者听力健康。耳机产品的质量,除了验证产品是否符合法规标准,也能透过全面性的测试和认证过程,确保耳机在各方面:从音质到耐用性,再到用户舒适度,都能达到或超越行业标准。这不仅保护了消费者的投资,也提升了该公司在整个行业的产品质量和信誉!客户面临到的各种困难一家耳机制造商想要透
    百佳泰测试实验室 2024-12-20 10:37 161浏览
  • 光耦固态继电器(SSR)作为现代电子控制系统中不可或缺的关键组件,正逐步取代传统机械继电器。通过利用光耦合技术,SSR不仅能够提供更高的可靠性,还能适应更加复杂和严苛的应用环境。在本文中,我们将深入探讨光耦固态继电器的工作原理、优势、挑战以及未来发展趋势。光耦固态继电器:如何工作并打破传统继电器的局限?光耦固态继电器通过光电隔离技术,实现输入信号与负载之间的电气隔离。其工作原理包括三个关键步骤:光激活:LED接收输入电流并发出与其成比例的光信号。光传输:光电传感器(如光电二极管或光电晶体管)接收
    腾恩科技-彭工 2024-12-20 16:30 55浏览
  • 汽车行业的变革正愈演愈烈,由交通工具到“第三生活空间”。业内逐渐凝聚共识:汽车的下半场在于智能化。而智能化的核心在于集成先进的传感器,以实现高等级的智能驾驶乃至自动驾驶,以及更个性、舒适、交互体验更优的智能座舱。毕马威中国《聚焦电动化下半场 智能座舱白皮书》数据指出,2026年中国智能座舱市场规模将达到2127亿元,5年复合增长率超过17%。2022年到2026年,智能座舱渗透率将从59%上升至82%。近日,在SENSOR CHINA与琻捷电子联合举办的“汽车传感系列交流会-智能传感专场”上,艾
    艾迈斯欧司朗 2024-12-20 19:45 98浏览
  • ALINX 正式发布 AMD Virtex UltraScale+ 系列 FPGA PCIe 3.0 综合开发平台 AXVU13P!这款搭载 AMD 16nm 工艺 XCVU13P 芯片的高性能开发验证平台,凭借卓越的计算能力和灵活的扩展性,专为应对复杂应用场景和高带宽需求而设计,助力技术开发者加速产品创新与部署。随着 5G、人工智能和高性能计算等领域的迅猛发展,各行业对计算能力、灵活性和高速数据传输的需求持续攀升。FPGA 凭借其高度可编程性和实时并行处理能力,已成为解决行业痛点的关
    ALINX 2024-12-20 17:44 85浏览
  • 随着工业自动化和智能化的发展,电机控制系统正向更高精度、更快响应和更高稳定性的方向发展。高速光耦作为一种电气隔离与信号传输的核心器件,在现代电机控制中扮演着至关重要的角色。本文将详细介绍高速光耦在电机控制中的应用优势及其在实际工控系统中的重要性。高速光耦的基本原理及优势高速光耦是一种光电耦合器件,通过光信号传递电信号,实现输入输出端的电气隔离。这种隔离可以有效保护电路免受高压、电流浪涌等干扰。相比传统的光耦,高速光耦具备更快的响应速度,通常可以达到几百纳秒到几微秒级别的传输延迟。电气隔离:高速光
    晶台光耦 2024-12-20 10:18 144浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦