武汉嵌入式培训
达内武汉民大中心

15271940953

热门课程

嵌入式安全利器——JTAG

  • 时间:2018-01-31
  • 发布:达内
  • 来源:互联网

    “JTAG调试对于嵌入式安全研究具有非凡的威力,可以读写内存,可以控制 CPU运行状态,可以调试代码,几乎无所不能。可是如何对一个未知的设备进行JTAG调试呢?进行JTAG调试都需要什么步骤和准备工作呢?本次主题将一一揭示。”
    大家好,我是来自腾讯安全玄武是实验室研究员 HyperChem,也可以叫我 HC.今天和大家分享一下 JTAG调试,有做嵌入式安全的同学可能对 JTAG这个东西比较了解,如果我们可以获得调试权限,对我们是很有用的。
    JTAG究竟是什么?
    JTAG其实是 Joint Test Action Group缩写,后来成为了一个标准,成为了 IEEE的标准 1149.1.最开始 JTAG用于测试 IC芯片是否可以正常工作,DSP、FPGA等芯片同样存在 JTAG.
    JTAG可以进行芯片的调试,可以控制芯片执行任意的代码。进行嵌入式开发的时候,用来下载固件,如果大家玩路由的时候应该是用 JTAG进行编程,当然我们也可以用 JTAG来读写内存。
    我们先了解一下 JTAG的电气结构。它有一个可选的引脚 TRST,还有 4个必须的引脚,TMS、TCK、TDI和 TDO.JTAG其实通过 Test Access Tort测试访问口进行控制,JTAG控制器有 16种状态。它的状态切换就是由 JTAG的 TMS引脚 1和 0完成的。
    JTAG命令。它在 1149.1中规定了几个强制的命令,一个是 bypass命令,用于加快测试效率,还有一个外部测试指令,启用外部电路的测试使用的。还有内部测试指令,用于对芯片内部的总线等部件进行测试。此外,大部分 IC芯片都有个 IDCODE,通常对应一个 IDCODE命令。
    举个栗子:一个简单的 JTAG
    我们在这 6个引脚输出点,设置 6个移位寄存器。当你不进行 JTAG调试的时候,这 6个移位寄存器不会有任何用处,但是如果我们进行 JTAG调试的时候,我们会通过这写移位寄存器向真实的引脚写入值,也可以通过移位寄存器读取当前引脚的状态。因为 JTAG最开始设计的时候是为了监测芯片输入输出引脚状态的,而这些引脚都在芯片的边界上,因此称之为边界扫描链。
    JTAG大概有 3个寄存器,一个是 IDCODE寄存器,一个 BYPASS寄存器和边界扫描寄存器。JTAG测试的过程其实就是通过 TAP完成的。那么,JTAG到底是如何实现这样的一个尝试的?现在以 ARMV9芯片的写内存流程来做一个例子。
    首先我们需要选择一个边界扫描链,我们需要控制里面的数据,然后设置一个 JTAG的命令,这个命令是选择内部测试模式,就是一个内部测试的命令,这个内部测试会导致我们所有操作在 CPU内部,我们进行读和写不会对内存和外部设备的内容给造成影响。

    大家知道 CPU执行指令的时候会将它的指令会有一个阶段把指令读到数据总线上,这个时候我们向数据总线写入一个指令,这个指令的含义是把 R0和 R1写到 R0指向的地址,但是这个指令的意义不重要,这个操作的意义在于 R0和 R1的数值会出现在后面的执行阶段。到后面的执行阶段,再修改数据总线把 R0和 R1的值进行修改成我们需要改的样子。

武汉软件测试培训

    等它执行完毕,这个操作不会造成任何的影响。接着我们调整下一条指令的执行模式,这个时候设置一个标志位,这个标志位可以暂时挂你内部测试模式,这个意思就是说,这个指令会实际进行操作,它会真的把数据写进去。然后我们等待执行完毕,整个写内存的操作就完成了,读内存的过程其实也是差不多,只需要我们把 STR换成 LDR就可以了。这就是 JTAG的一个流程。
    如何利用 JTAG ?
    如果我们对一个设备进行 JTAG调试,我们需要具备几个要素,首先需要知道 4个引脚在哪里,这样才可以连上去;然后我们需要一个适配器,这个适配器主要完成信号的电气转换,这样我们可以通过电脑上 1010对 TAP控制器进行控制;接着我们需要一个适配器的配置文件;接下来是调试软件以及调试 CPU的信息,最后我们需要一个重置的手段。
    首先寻找 JTAG的引脚,目前比较好的找 JTAG的工具就是 JTAGULATOR这,它是个自动化寻找 JTAG引脚的工具,然后接着需要一个合适的适配器。我上面列举了一些适配器,适配器的目的主要是实现进行电气和电平的转换,我们讲到 JTAG其实它上面就是 1010的信号,这个对于我们通过软件实现其实很困难,我们需要适配器替我们完成这部分工作。
    它大概有几个类型,最开始的适配器通过打印口完成调试。现在比较流行的适配器是 FTDI类型的以及一些私有设备的接口,还有采用 COM口和网口进行通讯。我这里是今天演示用到目前的适配器,这个采用的就是比较流行的 FTDI接口。
    下面是调试软件。用于 JTAG调试的软件有很多,一些修手机用的一些软件,都是商业软件,开源软件的代表就是各个平台都支持的 GDB.我们今天用到的软件叫 OpenOCD,这个东西可以提供我们比较好的接口。
    这是 CPU的配置文件,在 OpenOCD中定义不同 CPU的文件,包含 CPU中 JTAG指令的定义以及边界扫描链。
    接下来是适配器的配置文件,其实就是描述了我们上层软件怎么和适配器连接。
    然后是重置条件,如果用商业软件它会电气层实现这样的东西,重置条件的含义是,当你的适配器连上 JTAG的时候,TAP控制器和 CPU可以处于任何的状态,不知道它的状态是什么,我们需要让 CPU回到已知的状态,这时候需要重置。对 CPU来讲会有一个引脚,检测到电压过大或者过小会直接重置。
    如何对未知设备进行 JTAG调试?

    首先识别它的引脚,然后获取 IDCODE,接着通过 IDCODE寻找 CPU配置文件。OpenOCD默认包含了很多 CPU的配置文件,可以尝试在这些文件中搜索。然后选择好合适的适配器及其配置文件就可以进行调试了。

更多武汉嵌入式培训相关资讯,请扫描下方二维码

武汉软件测试培训

上一篇:嵌入式浅析协程
下一篇:微服务~Consul服务注册与发现

武汉嵌入式培训:嵌入式Linux技术精讲

武汉嵌入式培训:嵌入式Linux学习漫谈

武汉嵌入式培训:FPGA的嵌入式系统

达内荣获“全国IT职业教育信息化教学联盟理事单位”殊荣

选择城市和中心
贵州省

广西省

海南省