news 2026/3/30 4:32:48

TC3xx调试加密以及在加密情况下调试的方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TC3xx调试加密以及在加密情况下调试的方法

1. Tricore 调试加密以及加密情况下调试方法

1.1 设置调试加密

设置调试加密实际上就是下面这个位,注意这个位会在 SSW 自动从UCB_DBG中装载到下面寄存器,前提是UCB_DBGCONFIRMATION状态会UNLOCK或者CONFIRMED

设置调试加密的有三种方法,

  • 分别是在UDE界面上设置,
  • 在程序中用数据定义UCB区域内容,
  • 在代码中直接用Flash命令操作UCB

1.1.1 通过 UDE 解密进行设置:

在连接PLS,load elf文件后会自动弹出下面对话框(或通过Tools | Programming打开),点击UCBs

选择UCB_DBG,勾选”Debug Interface Lock”, 点击Write configuration.

如果要解除保护,则可以点击”Erase configuration ” (仅支持在 Unlocked 状态下擦除)

在弹出的下面对话框设置密码(0x12345678), 共有8个字 (32字节)的密码可以设置。

在实际应用中,应该把”Set UCB to confirmed state” 勾选上,把CONFIRMED状态改成CONFIRMED, 具体看第3节。(在调试和测试时可以先不勾选)

:如果操作不成功,则重新连接和加载elf,以及烧录一下BMHD(例如下面),再试试。

1.1.2在程序中用数组定义 UCB 区域内容:

在工厂生产时,UCB部分内容不可能再使用调试器去设置,这时往往需要把UCB内容和程序一起烧录进去,然后重新上电后UCB的内容就有效了。可以用数组的方式定义UCB内容,来实现这种方式。

UCB_DBG区域定义如下:

Taskinglink文件中,定义一段UCB区域:

group (ordered) { group dbg_orig (run_addr=mem:ucb[0x2400]) { select ".rodata.dbg_orig"; } … } 在程序中定义下面数组: #pragma section farrom "dbg_orig" const Ifx_Dbg_Config dbg_orig = { 0x00000002, /* procondbg, DBGIFLOK=1 */ { 0x00000000, /**< \brief 0x004: Reserved */ 0x00000000, /**< \brief 0x008: Reserved */ 0x00000000, /**< \brief 0x00C: Reserved */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x010: Reserved (0x010 - 0x01F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x020: Reserved (0x020 - 0x02F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x030: Reserved (0x030 - 0x03F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x040: Reserved (0x040 - 0x04F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x050: Reserved (0x050 - 0x05F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x060: Reserved (0x060 - 0x06F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x070: Reserved (0x070 - 0x07F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x080: Reserved (0x080 - 0x08F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x090: Reserved (0x090 - 0x09F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0A0: Reserved (0x0A0 - 0x0AF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0B0: Reserved (0x0B0 - 0x0BF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0C0: Reserved (0x0C0 - 0x0CF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0D0: Reserved (0x0D0 - 0x0DF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0E0: Reserved (0x0E0 - 0x0EF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0F0: Reserved (0x0F0 - 0x0FF) */ }, 0x12345678, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x100: PW0-PW3 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x110: PE4-PW7 */ { 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x120: Reserved (0x120 - 0x02F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x130: Reserved (0x130 - 0x03F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x140: Reserved (0x140 - 0x04F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x150: Reserved (0x150 - 0x05F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x160: Reserved (0x160 - 0x06F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x170: Reserved (0x170 - 0x07F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x180: Reserved (0x180 - 0x08F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x190: Reserved (0x190 - 0x09F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x1A0: Reserved (0x1A0 - 0x0AF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x1B0: Reserved (0x1B0 - 0x0BF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x1C0: Reserved (0x1C0 - 0x0CF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x1D0: Reserved (0x1D0 - 0x0DF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x1E0: Reserved (0x1E0 - 0x0EF) */ }, 0x43211234, /**< \brief 0x1F0: .confirmation: 32-bit CODE, (always same)*/ { 0x00000000, /* 0x004, Reserved */ 0x00000000, /* 0x008, Reserved */ 0x00000000, /* 0x00C, Reserved */ } };

1.1.3在代码中直接用 Flash 命令操作 UCB:

可以用Flash Command直接写UCB.

可以用Erase Logical Sector Range命令擦UCB

可以用Enter Page Mode, Load PageWrite Page命令来写UCB区域。

1.2 加密情况下调试

如果在调试加密的情况下,正常连接仿真器会连不上。

这个时候在下面界面输入正确的密码,然后再次连接,就可以连上了。

下图显示连接成功:

2. HSM 调试加密

HSM 使能后,HSMSSW会判断下面DMU_SP_PROCONHSM.HSMDBGDIS,如果这个位是1,则会锁住HSM的调试接口,反之则使能HSM的调试接口

设置HSM调试加密实际上就是设置下面这个位,注意这个位会在SSW中自动从UCB_HSM中装载到下面寄存器,前提是UCB_HSMCONFIRMATION状态会UNLOCK或者CONFIRMED

设置HSM调试加密的有三种方法,分别是在UDE界面上设置,在程序中用数据定义UCB区域内容,在代码中直接用Flash命令操作UCB

2.1 设置调试加密

设置HSM调试加密的有三种方法,分别是在UDE界面上设置,在程序中用数据定义UCB区域内容,在代码中直接用Flash命令操作UCB

2.1.1在 UDE 界面上设置调试加密

选择UCB_HSM,勾选”Disable HSM debugging”, 点击Write configuration.

注意:
- 在上面的第二个选项也可以设置 Tricore 的调试保护,效果等同于第一节描述
- UCB_HSM 没有密码,因此当 COMFIRMATION 状态设为 CONFIRMED 后将不能再改。由于没有密码,在 UDE 界面中不支持输入密码调试。
- 如果要解除保护,则可以点击”Erase configuration ” (仅支持在 Unlocked 状态下擦除)

2.1.2在程序中用数组定义 UCB 区域内容:

在工厂生产时,UCB部分内容不可能再使用调试器去设置,这时往往需要把UCB内容和程序一起烧录进去,然后重新上电后UCB的内容就有效了。可以用数组的方式定义UCB内容,来实现这种方式。

UCB_HSM区域定义如下:

Taskinglink文件中,定义一段UCB区域:

/*Fixed memory Allocations for HSM Configuration*/ group (ordered) { group hsmx_orig (run_addr=mem:ucb[0x2600]) { select ".rodata.hsm_orig"; } … } 在程序中定义下面数组: #pragma section farrom "hsm_orig" const Ifx_Hsm_Config hsm_orig = { 0x00000001, /* PROCONHSM */ { 0x00000000, /* 0x004, Reserved */ 0x00000000, /* 0x008, Reserved */ 0x00000000, /* 0x00C, Reserved */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x010: Reserved (0x010 - 0x01F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x020: Reserved (0x020 - 0x02F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x030: Reserved (0x030 - 0x03F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x040: Reserved (0x040 - 0x04F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x050: Reserved (0x050 - 0x05F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x060: Reserved (0x060 - 0x06F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x070: Reserved (0x070 - 0x07F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x080: Reserved (0x080 - 0x08F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x090: Reserved (0x090 - 0x09F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0A0: Reserved (0x0A0 - 0x0AF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0B0: Reserved (0x0B0 - 0x0BF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0C0: Reserved (0x0C0 - 0x0CF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0D0: Reserved (0x0D0 - 0x0DF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0E0: Reserved (0x0E0 - 0x0EF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0F0: Reserved (0x0F0 - 0x0FF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x100: Reserved (0x100 - 0x100) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x110: Reserved (0x110 - 0x01F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x120: Reserved (0x120 - 0x02F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x130: Reserved (0x130 - 0x03F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x140: Reserved (0x140 - 0x04F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x150: Reserved (0x150 - 0x05F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x160: Reserved (0x160 - 0x06F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x170: Reserved (0x170 - 0x07F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x180: Reserved (0x180 - 0x08F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x190: Reserved (0x190 - 0x09F) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x1A0: Reserved (0x1A0 - 0x0AF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x1B0: Reserved (0x1B0 - 0x0BF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x1C0: Reserved (0x1C0 - 0x0CF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x1D0: Reserved (0x1D0 - 0x0DF) */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x1E0: Reserved (0x1E0 - 0x0EF) */ }, 0x43211234, /**< \brief 0x1F0: .confirmation: 32-bit CODE, (always same)*/ { 0x00000000, /* 0x004, Reserved */ 0x00000000, /* 0x008, Reserved */ 0x00000000, /* 0x00C, Reserved */ } };

2.1.3在代码中直接用 Flash 命令操作 UCB:

这个操作方法同 1.1.3。

2.2 加密情况下调试

如果在HSM调试加密的情况下,正常连接仿真器会连不上。

擦除保护后,连接HSM恢复正常。

3. UCB CONFIRMATION 状态

UCBCONFIRMATION状态分为UNLOCKCONFIRMED,在UNLOCK状态时,UCB可以重复擦写,当CONFIRMED状态时(相当于写保护),只有输入正确的密码,用”DisableProtection”命令对UCB临时解密,才能再操作UCB。在UDE界面下,一旦UCBCONFIRMED状态,则就不能再改变UCB的状态了。

更正当输入正确密码后,UCB 处在 CONFIRMED 也可以被更改,更改后可以再变为unlocked状态

在量产的程序中,必须改为CONFIRMED状态,因为在UNLOCK状态下,UCBPassword部分是可以读出来的(在调试器连接不上情况下,也还是可以通过ASCBootloader读出来)。

在使能了调试保护后,当UCB_DBGCONFIRMATION改为CONFIRMED后,只要知道调试密码,依然还是可以调试。

在使能了调试保护后,当UCB_HSMCONFIRMATION改为CONFIRMED后,那么HSM 的代码就永远不能调试了,除非在 HSM 的代码中加入一段后门代码,例如检测到一个信号或者命令后,把UCB中的调试保护解除。UCB_HSMCONFIRMED后,只有 HSM代码才能操作这块UCB

4. 实际应用的安全考虑

在实际应该中,即使 MCU 不能被调试,但是用外部工具通过和 Bootloader 通讯,还是可以把 Flash 程序读出来,有下面两种方式可以进入 Bootloader 模式。

Bootstrap mode set by external pin:
When PINDIS=0, and HWCFG[4:5]=01/00

Bootstrap mode set by internal BMI:
When PINDIS=1, and HWCFG=100/011

如果PINDIS1,而且HWCFG] =111. 那么程序一定会从内部Flash启动,而且不可能进入任何内部bootloader

因此结论是:调试加密+BMHD 设置(PINDIS 为 1,且 HWCFG] = 111),能保证只有知道调试密码的外部工具,才能连接芯片,用其他手段无法读取 Flash 以及调试 MCU
对于HSM的程序保护,需要把 HSM 程序空间设置为HSM_Exclusive(操作UCB_HSMCOTP0/1), 这样主核和外部工具就无法读取HSM程序空间了。

如果您对英飞凌AURIX™ 系列产品感兴趣,请填写客户信息咨询表,我们将后续跟进。

Q&A:

问题一、

这句话咨询“在量产的程序中,必须改为 CONFIRMED 状态,因为在 UNLOCK 状态下,UCB 的Password 部分是可以读出来的(在调试器连接不上情况下,也还是可以通过 ASCBootloader 读出来)。

疑问1:TC3xx量产时UCB_DBG是建议设置为CONFIRMED状态是吧,是不是开启了写保护?

Ans: 量产时建议把UCB_DBG设为Confirmed状态,有写保护的作用,但是只要知道密码,还是可以通过Disable Protection命名临时解除保护,然后还是可以继续操作这个UCB(例如设为解除调试保护)

疑问2:ASCBootloader是需要使用外部的CAN总线给芯片的RAM里注入代码,那当调试口密码认证开启后,调试器都连接不上芯片,如何烧录代码呢?即使可以通过ASCBootloader读取UCB的密码那么操作也很复杂是吧。

Ans: 调试保护和ASC bootloader没有关系,即使使能调试保护,还是可以用和ASC bootloader进行通讯(前提需要让MCU进入Generic booloader/ASC bootloader mode)

疑问3:UCB_DBG的CONFIRMED 和UNLOCK 可以随机切换,UCB_HSM一旦设置为CONFIRMED 就不能再设置回UNLOCK 了吧。

Ans: UCB_DBG的CONFIRMEDUNLOCK可以切换,前提是需要知道密码,UCB_HSM一旦设置为CONFIRMED不能切回UNLOCK, 因为UCB_HSM无密码。

问题二:你好 我通过memtool操作Debug加密时,把OCDS Lock和Debug interface Lock两个选项都勾上了,导致现在解锁不了,有什么办法可以解决吗

在下面这里输入正确的密码:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/22 18:55:39

Jupyter Notebook密码保护设置:防止未授权访问

Jupyter Notebook密码保护设置&#xff1a;防止未授权访问 在云计算与远程开发日益普及的今天&#xff0c;数据科学家和AI工程师越来越依赖Jupyter Notebook进行模型实验、数据分析和教学演示。它以交互式Web界面打破了传统脚本开发的壁垒&#xff0c;让代码执行、结果可视化和…

作者头像 李华
网站建设 2026/3/26 22:12:17

自考必看!9个高效降AI率工具推荐,轻松应对查重难题

自考必看&#xff01;9个高效降AI率工具推荐&#xff0c;轻松应对查重难题 AI降重工具&#xff1a;自考论文的高效护航者 在自考论文写作过程中&#xff0c;越来越多的学生开始关注“AI生成内容检测率”&#xff08;AIGC率&#xff09;的问题。随着高校对学术规范要求的不断提高…

作者头像 李华
网站建设 2026/3/27 17:41:16

手机夸克网盘下载慢 - 实测70MB/S

今天教大家一招能解决夸克网盘限制的在线工具。这个工具也是完全免费使用的。下面让大家看看我用这个工具的下载速度咋样。地址获取&#xff1a;放在这里了&#xff0c;可以直接获取 这个速度还是不错的把。对于平常不怎么下载的用户还是很友好的。下面开始今天的教学 输入我给…

作者头像 李华
网站建设 2026/3/26 21:42:43

Java计算机毕设之基于springBoot的高校学生绩点管理系统的设计与实现课程管理、成绩录入、绩点自动计算、排名分析(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/27 15:40:39

Java毕设项目:基于springBoot的高校学生绩点管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/29 5:58:56

Conda环境克隆:快速复制已验证的PyTorch配置

Conda环境克隆&#xff1a;快速复制已验证的PyTorch配置 在深度学习项目开发中&#xff0c;最让人头疼的往往不是模型设计或调参&#xff0c;而是“环境问题”——明明在本地跑得好好的代码&#xff0c;换一台机器就报错&#xff0c;提示缺少某个库、CUDA 版本不匹配&#xff…

作者头像 李华