我已经使用IDA解密了几天的硬件中的二进制数据块。今天,我终于通过JTAG连接了一个探针,并用openocd启动了GDB服务器。 IDA正在连接到GDB服务,但是当我附加到进程时,它显示内存中的所有零,而PC不在我期望的位置。基本上,IDA似乎没有控制权,也没有与之挂钩。顺便说一句,目标正在运行,如果不需要,我宁愿不执行暂停重置。我相信使用JTAG可以实现。

没有说句的过程,但是我真的很希望能够在代码的某些位置设置断点和单步执行。显然存在一些设置问题。有什么想法吗?

更新:

我有很多东西要学习,发现很多错误。


首先通过终端使用OPENOCD
您真的需要停止目标才能访问arm中的寄存器
好像我也拥有JTAG速度高
被测设备已打开WDT。现在关闭该选项,我可以暂停目标并查看正确的寄存器。我可以看到发生了这种情况,因为它将开始很好地读取PC,但是到降低注册表时,它将读取所有F。DUT已缓存并启用了MMU,因此尽管我可以暂停目标,然后重新启动总是以数据中止而告终。在ocd中查看arm11.c似乎有很多存根尚未实现,无法打开缓存。我已经尝试过在恢复之前刷新缓存,但仍然会中止数据。需要进行更多调查,但如果有任何建议,请告诉我。

到目前为止,谢谢您的帮助,这肯定是一种学习经验。

评论

您可以在此处发布OpenOCD输出,telnet命令行的输出以及您在GDB中使用的命令吗?我不是OpenOCD的专家,可能是错误的,但是在许多目标上,我认为您必须进入调试模式才能执行此操作,这涉及到暂停处理器。

#1 楼

事实证明,用于ARM11的openocd中存在一些错误。我最终进行了一些更改,以使其按照手臂规范运行:

arm11_debug_entry



打开数据的流失中止。检查应该是:

if (!(dscr & DSCR_STICKY_ABORT_IMPRECISE))



然后在C1控制寄存器之前添加以下代码

/* Enable Debug Cache write back, and disable line fills */
/* mcr p15,7,R0,c15,c0,0 */
retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xeeef0f10, 0x07);
if (retval != ERROR_OK)
    return retval;



现在我保存然后恢复C1控制寄存器

/* Read Modify write control register 1 to disable MMU/Cache etc. Store to reprogram upon return */
/* MRC p15,0,R0,c1,c0,0 */
arm11_run_instr_data_from_core_via_r0(arm11, 0xee110f10, &cntrlregval);
if (retval != ERROR_OK)
    return retval;

arm11->saved_c1cntrl = cntrlregval;

/* Perform Modifications */

/* MCR p15,0,R0,c1,c0,0 */
retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xee010f10, cntrlregval);
if (retval != ERROR_OK)
    return retval;



arm11_leave_debug_state

    /* disable debug cache write thrus, etc */
retval = arm11_run_instr_data_prepare(arm11);
    if (retval != ERROR_OK)
        return retval;

 retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xeeef0f10, 0x00);
    if (retval != ERROR_OK)
        return retval;

 /* re write Coprocessor control */
 retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xee010f10, arm11->saved_c1cntrl);
    if (retval != ERROR_OK)
        return retval;

 retval = arm11_run_instr_data_finish(arm11);
    if (retval != ERROR_OK)
        return retval;


我会尽力让这些更改生效,以便其他人不会遇到我的问题。

#2 楼

考虑到您想单步执行,迟早要暂停处理器,是什么让您现在无法尝试呢?

我正在尝试设想,如果正在运行的程序使总线保持使用状态,那么JTAG单元将如何检查内存?我希望TAP可以在处理器运行时访问某些边界单元,因为它们基本上是复制/镜像的值,但是其他内存我不知道。

我建议停止目标,然后再试一次。对我来说,最有意义的是IDA仅在具有控制权时才可以查询并接下来正确显示CPU寄存器和内存的状态。