RE JLinkARM.dll

前言

年假还没休完,老大就布置任务了…
去解决年前产品上的bug, 先去彻底理解LWIP工程。

手头有个以前备好的LWIP开发板, 先接好上电。
手头的JLINK好几个,随便抓了一个。MDK中调试选项中检测是JLINK V8.
不过弹出了一个JLINK授权警告,没办法和MDK配在一起调试板子。
在这里插入图片描述
本地安装的JLINK组件是J-Flash V6.46g.
本来可以再换一个JLINKV9或V10或STLINK, 不过在假期中,不想换JLINKV8了,自己来解决这个问题。换换心情。

试验

本机是最新版Win10(1909.18363.628) + 本地上以前装的IDA7.0.

尝试用JLINK.exe来连接仿真器,也是这个提示。
说明,这个提示是在一个DLL的接口中.

用IDA载入JLINK.exe, 没有找到这个告警提示. 进一步验证了,这个告警提示是从DLL中取得的。

用procexp.exe 观察弹出警告后的JLINK.exe, 发现只载入了JLinkARM.dll. 其他的DLL都是windows自带的。
C:\Program Files (x86)\SEGGER\JLink\JLinkARM.dll

分析JLinkARM.dll,查找字符串如下

.rdata:103FBCB0 aTheConnectedJL_8 db 'The connected J-Link is defective. Proper operation cannot be gua'
.rdata:103FBCB0                                         ; DATA XREF: sub_100827D0+5E↑o
.rdata:103FBCB0                 db 'ranteed.',0Ah
.rdata:103FBCB0                 db 'Please get in touch with support@segger.com and send a screenshot'
.rdata:103FBCB0                 db ' of this dialog with the e-mail.',0Ah
.rdata:103FBCB0                 db 0Ah
.rdata:103FBCB0                 db 'J-Link information:',0Ah
.rdata:103FBCB0                 db 'S/N: %d',0Ah
.rdata:103FBCB0                 db 'Firmware: %s',0Ah,0
.rdata:103FBD87                 align 4

在IDA中查找该提示的参考点
在这里插入图片描述
这个函数是 sub_100827D0
可以看到这里有个全局的标志,dword_10C95DFC, 这个标志是在其他地方检测好的,这里只是用。如果这个值为不为0,说明授权正确,按正常流程走.
如果为0, 就去取授权。
如果取不到授权,继续转圈取授权,直到取到。
如果取到的授权不对,从接口返回授权失败信息。

设置IDA将反汇编指令的字节码显示的字节长度改为最大为16字节
Options/General/Disassembly/Number of opcode bytes => 16
IDA修改指令 Edit/Patch program/Assemble…
IDA保存补丁 Edit/Patch program/Apply patches to input file

如果将test eax, eax 改为 mov eax, 1, 字节数不是2字节了,程序乱掉了。
将jnz 改成 jmp 试试
这样改,不一定行,因为eax的值没改呢。先试试。

在这里插入图片描述
保存修改,替换文件试试。

修改后, JFlash.exe好使了,不弹出授权警告.(为修改前,只要连上JLINK, 10秒钟之内,就会弹授权告警)

将修改过的JLinkARM.dll拷贝到C:\Keil_v5\ARM\Segger,这里是MDK5用到的JLINK组件.
关掉MDK5, 重启MDK5, 点击魔术棒,打开调试页面,选JLINK, 点击设置,也正常使用,无授权弹框警告。

END

后记

用HAL库写了一个程序来测试。发现30~60秒后,不能单步和下断点了。发现抱错信息是从JL2CM3.dll中来的,JL2CM3.dll中也调用了JLinkARM.dll。看来还是和JLinkARM.dll有关系。

尝试去C:\Keil_v5\ARM\Segger\JL2CM3.dll中找提示, 找到错误提示的标题 JLink - Cortex-M Error
.rdata:1013EF38	00000017	C	JLink - Cortex-M Error

再去找 Cound not stop, 找到了
.rdata:1013EFBC	0000003D	C	Could not stop Cortex-M device!\nPlease check the JTAG cable.

查找此提示的参考点,提示在sub_10006660()中,有一个大的switch, 都是错误的提示。那么sub_10006660()是一个错误处理函数了。

还有一个参考点在 sub_10009DA0(), 这是个JLINK检测函数,能检测很多种错误(e.g. 没插入JLINK等),判断挺多的,不能修改这个dll.

但是JL2CM3.dll中告警提示的上级调用还蛮复杂的,还用到了好几个全局变量。如果仅仅是兴趣,没办法继续玩了。

这次先认输,换其他调试器硬件(JLINKV9/V10 or STLINK).
如果以后有缘,再来玩。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT Jlinkarm.dll是一个用于烧录ARM芯片的库文件,它在QT开发环境中提供了一系列的函数和接口,用于控制J-Link仿真器,实现对ARM芯片的烧录操作。 要在QT中使用Jlinkarm.dll进行烧录,首先需要在QT项目中引入该库文件。可以将Jlinkarm.dll文件复制到项目的文件夹中,并在.pro文件中添加对该库文件的引用。 #include "Jlinkarm.h" 接下来,需要使用Jlinkarm.dll中提供的函数和接口来实现烧录操作。首先,可以调用JLINKARM_ConnectToDevice函数连接J-Link仿真器和目标芯片。该函数需要传入目标芯片的型号、接口速度等参数。 JLINKARM_ConnectToDevice(device); 连接成功后,可以使用JLINKARM_EraseChip函数擦除目标芯片中的数据。该函数可以传入擦除方式,例如全擦除或扇区擦除。 JLINKARM_EraseChip(); 擦除完成后,可以使用JLINKARM_WriteData函数向目标芯片中写入相关程序或固件。该函数需要传入需要写入的数据、地址和长度等参数。 JLINKARM_WriteData(data, address, length); 写入完成后,可以使用JLINKARM_ResetTarget函数复位目标芯片,使其重新启动。该函数可以传入复位方式,例如硬复位或软复位。 JLINKARM_ResetTarget(); 最后,可以调用JLINKARM_DisconnectFromDevice函数断开与目标芯片的连接。该函数可以释放与J-Link仿真器的通信通道。 JLINKARM_DisconnectFromDevice(); 以上是使用QT Jlinkarm.dll进行烧录的基本流程和函数调用。根据实际需求,可以进一步调用其他函数来读取芯片信息、处理异常情况等。通过这些函数和接口,可以在QT开发环境中方便地进行ARM芯片的烧录操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值