MSP430加密代码保护

  • 虽说加密代码保护不一定管用,想破解的人怎么也就破解了,但出于心里安慰,给破解增加点难度,还是加上吧。

使用

  • 我使用的是JTAG密码保护,操作起来很方便:
    (1)把代码复制到程序中,先不配置IAR JTAG的密码下载设置,刷程序,这样子就把JTAG的密码写到了芯片中。
    在这里插入图片描述
    (2)断电重启,配置这个地方的密码,不配置仿真器连接不上芯片,配置上程序下载正常。
    在这里插入图片描述

一、不同的MSP系列的JTAG锁定

在这里插入图片描述

1、物理 JTAG 保险丝 (熔丝)(F1xx/F2xx/F4xx)

  • 可通过物理 JTAG 安全保险丝保护 MSP430F1xx、F2xx 和 F4xx 系列器件的 JTAG。进行 JTAG 或 SBW编程之后,保险丝将由编程工具熔断。此工具会对 TEST 引脚(位于带有 TEST 引脚的器件)或 TDI 引脚 (位于带有 TEST 引脚的器件)施加保险丝熔断电压 (6.5V ±0.5V) [请参阅MSP430 Programming Via the JTAG Interface (SLAU320),了解更多详细信息]。保险丝熔断是一个不可逆的过程,会彻底禁用 JTAG 端 口,而且无法再访问 JTAG 或 SBW。当物理保险丝熔断后,将只能通过设置密码保护的引导加载程序(如 果支持并启用了此功能)来访问器件。

2、电子保险丝或无密码锁定

  • 大多数 MSP430 器件都有一个电子保险丝,此保险丝有时被称为 e-Fuse 或“JTAG 无密码锁定”。通过在内 存中将一个值设置为 2 个字(JTAG 签名),可以锁定 JTAG/SBW 接口。对 JTAG 锁定签名进行编程并复 位器件之后,将无法再通过 JTAG 或 SBW 来访问器件。在这种情况下,只能通过设置密码保护的引导加载 程序来访问器件。可以利用 BSL 来重新访问器件并清除 JTAG 签名,但这样需要输入正确的 BSL 密码或者 批量擦除器件(取决于器件系列)。MSP430 不同子系列的电子保险丝实施方式略有不同,以下部分将对此进行说明。

2.1 F5xx/F6xx 电子保险丝的实施方式

  • 在 MSP430 F5xx/F6xx 器件上,JTAG 签名位于引导加载程序的内存区域中(F5xx/F6xx 器件的闪存受保护 区域中包含一个基于闪存的 BSL),地址为 17FCh-17FFh。如果将除 00000000h 或 FFFFFFFFh 以外的任 何内容编程到这些地址,将会锁定 JTAG/SBW 接口。要对这些地址进行编程,必须先清除 SYSBSLC 寄存 器中的 SYSBSLPE 位,以解锁 BSL 闪存的受保护区域。对签名编程之后,应重新启用 BSL 保护。
  • 要清除 JTAG/SBW 锁定保护,可以使用 BSL 将 JTAG 签名清除为 00000000h。BSL 由中断矢量表的最后32 个字节 FFE0h-FFFFh 提供密码保护(请参见4 节)。由于 JTAG 签名位于受保护的 BSL 区域中,因此BSL 必须先清除 SYSBSLC 寄存器中的 SYSBSLPE 位(向地址 0182h 写入 0003h),才能向 JTAG 签名 写入 00000000h。
    在这里插入图片描述

2.2 FR5xx/FR6xx 电子保险丝的实施方式(无密码锁定)

  • 在 MSP430FR5xx/FR6xx 器件上,JTAG 签名位于 FRAM 的主区域中,地址为 FF80h-FF83h。通过向JTAG 签名写入 55555555h,可以对 JTAG/SBW 接口执行无密码锁定。
  • 要清除 JTAG/SBW 锁定保护,可以使用引导加载程序将 JTAG 签名清除为除 5555h 和 AAAAh 以外的任何 值。BSL 受密码保护,中断矢量表的最后 32 个字节 (FFE0h-FFFFh) 用作 BSL 密码(请参见4 节)。通过 在这些 FRAM 器件上使用 BSL 批量擦除命令,可轻松解锁 JTAG/SBW 访问,因为 JTAG 签名位于主存储 器中(而不是像 F5xx/F6xx 那样位于受保护的 BSL 区域中)。
    在这里插入图片描述

2.3 FR2xx/FR4xx 电子保险丝的实施方式

  • 在 MSP430FR2xx/FR4xx 器件上,JTAG 签名位于 FRAM 的主区域中,地址为 FF80h-FF83h(与其他FRxx 器件相同)。通过向 JTAG 签名写入除 00000000h 或 FFFFFFFFh 以外的任何内容,可以对JTAG/SBW 接口执行无密码锁(这不同于其他的 FRxx 器件)。

  • 要清除 JTAG/SBW 锁定保护,可以使用引导加载程序将 JTAG 签名清除为 00000000h 或 FFFFFFFFh。BSL 受密码保护,中断矢量表的最后 32 个字节 (FFE0h-FFFFh) 用作 BSL 密码(请参见4 节)。通过在这 些 FRAM 器件上使用 BSL 批量擦除命令,可轻松解锁 JTAG/SBW 访问,因为 JTAG 签名位于主存储器中 (而不是像 F5xx/F6xx 那样位于某个受保护的 BSL 区域中)。
    在这里插入图片描述

2.4 MSP430i2xx 电子保险丝的实施方式 - 启动代码 (SUC)

  • 在 MSP430i2xx 器件上,JTAG/SBW 器件安全性由启动代码 (SUC) 控制。在执行 BOR 或 POR 复位之 后,SUC 必须在前 64 个 MCLK 时钟周期内将器件设置为安全或不安全状态。SUC 会检查地址 0xFFDC-0xFFDF 的签名,以确定应当启用还是禁用 JTAG/SBW 访问。
  • 通过向地址 FFDCh-FFDFh 写入除 00000000h 或 FFFFFFFFh 以外的任何值,可以禁用 JTAG/SBW 接 口。在执行 POR 或 BOR 复位之后,SUC 会检查这些地址中的值。如果此值并非 00000000h 或FFFFFFFFh,则 SUC 会向 SYSJTAGDIS 寄存器写入 A5A5h,以禁用 JTAG/SBW 接口并保护器件。在执 行 BOR 或 POR 复位之后,SUC 必须在前 64 个 MCLK 周期内完成此操作。
  • 由于 MSP430i2xx 器件没有引导加载程序,因此无法清除地址 0xFFDC-0xFFDF 以重新启用 JTAG/SBW 访 问。如果用户在主存储器中实施了定制的引导加载程序,他们可以使用此程序向地址 FFDCh-FFDFh 写入00000000h。在执行 POR 或 BOR 复位之后,SUC 会检查这些地址中的值。如果此值为 00000000h 或FFFFFFFFh,SUC 将不执行任何操作,并继续执行校准例程 - 在 64 个 MCLK 周期之后,会启用 JTAG, 器件将自动处于不安全状态。
    请参阅 MSP430i2xx Family User’s Guide (SLAU335) 和器件代码示例,了解更多有关 SUC 的信息。
    在这里插入图片描述

二、JTAG 密码锁定 (FR5xx/FR6xx)

  • 有些 MSP430 FRAM 器件还允许使用 JTAG 密码锁定选项。这不同于电子保险丝/JTAG 无密码锁定,因为 使用这种机制时,无需使用引导加载程序,只需通过工具链提供用户定义的密码即可重新访问。
  • 在 MSP430FR5xx/FR6xx 器件上,JTAG 签名位于 FRAM 的主区域中,地址为 FF80h-FF83h。通过向JTAG 签名 1 (FF80h) 写入 AAAAh,并向 JTAG 签名 2 (FF82h) 写入除 5555h 以外的任何内容,即可使用 密码锁定 JTAG/SBW。写入到 JTAG 签名 2 的值用来定义所需密码的文字长度。密码从地址 FF88h 开始, 并持续 JTAG 签名 2 所设置的字数。请注意,如果密码足够长,可能会与中断矢量表所使用的地址重叠。这 些地址的密码值应是中断矢量表值,只有这样才能正确处理中断和执行代码。密码保护会对下一个 BOR 事 件生效。
    在这里插入图片描述
  • 当使用 JTAG 密码锁定功能保护器件时,工具链必须提供正确的密码才能访问器件。提供了正确的密码之 后,器件会解锁,直到发生下一个 BOR 事件为止。

1、在 CCS 中使用 JTAG 密码锁定

  • 相关 zip 文件 (http://www.ti.com/cn/lit/zip/slaa685) 中的代码示例 JTAG_lock_FR5xx_with_password.c 显示 了如何在 Code Composer Studio™IDE (CCS) 中为 MSP430FR5969 器件设置 JTAG 密码锁定。但请注意,有些生产编程工具可能还提供了一个选项,以便从 GUI 界面设置密码,而不必将密码硬编码到项目中。
  • 对于 MSP430 TI C/C++ 编译器,使用 #pragma DATA_SECTION 将正确的签名放到链接器文件的.jtagsignature 部分,并将密码放到 .jtagpassword 部分。使用 #pragma RETAIN 防止编译器优化数据(因为程序不会使用这些数据)。
#pragma RETAIN(JTAG_signatures)
#pragma DATA_SECTION(JTAG_signatures, ".jtagsignature")
const uint16_t JTAG_signatures[] = {0xAAAA, 0x0002};
 
#pragma RETAIN(JTAG_password)
#pragma DATA_SECTION(JTAG_password, ".jtagpassword")
const uint8_t JTAG_password[] = {0x12, 0x34, 0x56, 0x78};

如下示例显示了使用 2 字密码 12h 34h 56h 78h 锁定的器件的 TI-txt 二进制文件的一部分:
在这里插入图片描述

  • 当器件由密码锁定并完成 BOR 复位(此时设置将会生效)之后,必须提供密码,才能重新访问器件以进行 重新编程。在 CCS 中提供密码,然后在 targetConfigs 文件夹中打开器件的 .ccxml 文件。在“AdvancedSetup”下方,单击链接“Target Configuration”。然后单击器件型号下方的“MSP430”,并在“Password: (HEX format)”框中输入要在解锁器件时提供的密码。对于上述示例,密码为 12h 34h 56h 78h。应以文字形式写入 密码,先写入最低有效文字,因此对于此示例,输入 0x34127856。要找到为工具链提供密码的正确顺序, 一种简单的方法是使用内存浏览器并将视图设置为“16-Bit Hex – TI Style”,然后在首次加载时查看编程到器 件中的密码。
    在这里插入图片描述
  • 注: 当加载不同的用户项目时,如果在器件此前加载的代码中启用了 JTAG 密码锁定,则首次进入 器件时,必须在项目设置中提供正确的密码并擦除器件。擦除器件之后,如果没有在新项目中 启用 JTAG 密码锁定,则会解锁器件并能够正常对其进行调试。

2、在 IAR 中使用 JTAG 密码锁定

  • 相关 zip 文件中的代码示例 JTAG_lock_FR5xx_with_password.c 显示了如何在 IAR 中的 MSP430FR5969
    器件上设置 JTAG 密码锁定。但请注意,有些生产编程工具可能还提供了一个选项,以便从 GUI 界面设置 密码,而不必将密码硬编码到项目中。
  • 对于 IAR C/C++ 编译器,使用 #pragma 位置从地址 FF80h 开始放置正确的签名,从地址 FF88h 开始放置 密码。使用 __root 关键字防止编译器优化数据(因为程序不会使用这些数据)。
#pragma location = 0xFF80
__root const uint16_t JTAG_signatures[] = {0xAAAA, 0x0002};

#pragma location = 0xFF88
__root const uint8_t JTAG_password[] = {0x12, 0x34, 0x56, 0x78};

如下示例显示了使用 2 字密码 12h 34h 56h 78h 锁定的器件的 TI-txt 二进制文件的一部分
在这里插入图片描述

  • 要在 IAR 中提供密码,请在Project > Options 菜单中转到 “Debugger” > “FET Debugger”,然后选择"
    Download" 选项卡。在"JTAG password"框中,输入要在解锁器件时提供的密码。对于上述示例,密码为
    12h 34h 56h 78h。应以文字形式写入密码,先写入最低有效文字,因此对于此示例,输入 0x34127856。要 找到为工具链提供密码的正确顺序,一种简单的方法是使用“内存”视图并将格式设置为“2x Units”,然后在首 次加载时查看编程到器件中的密码。
    在这里插入图片描述
  • 注: 当加载不同的用户项目时,如果在器件此前加载的代码中启用了 JTAG 密码锁定,则首次进入 器件时,必须在项目设置中提供正确的密码并擦除器件。擦除器件之后,如果没有在新项目中 启用 JTAG 密码锁定,则会解锁器件并能够正常对其进行调试。

三、IP 封装 (IPE)

  • IP 封装 (IPE) 是诸如 MSP430FR59xx/69xx 系列 MSP430 FRAM 微控制器上提供的一种功能。(注意:对 于 MSP432 器件上的 IP 保护安全区特性,请参阅应用报告Software IP Protection on MSP432P4xxMicrocontrollers (SLAA660)。)
  • IP 封装允许用户封装 FRAM 存储器的某个区域以防止他人读取。当 IPE 激活时,即使使用 JTAG,也无法 从 IP 封装区域以外的任何位置对 IP 封装区域中的任何代码或数据进行读取或写入访问。要去除 IPE 保护, 需要执行由工具链提供支持的特殊批量擦除序列。任何形式的代码保护都不是无懈可击的,但此功能会为JTAG/SBW 或引导加载程序的安全性提供额外一层保护,适用于密钥等敏感数据或者被用户视为知识产权(IP) 的专有代码。
  • IP 封装的安全性和存储在其内的代码的安全性是一样的 - 即使代码位于封装区域内,糟糕的代码安全性措施 也会让代码变得更容易受到攻击。需要特别注意可以读取/写入地址的代码或者不遵循可靠编码实践的代码。 当封装执行结束时,如果需要隐藏代码对所使用的任何硬件模块和外设寄存器或者 RAM 执行的操作,则还 必须将这些模块清除为它们的原始状态。

更多IPE具体操作参照:https://download.csdn.net/download/Davidysw/14040153

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值