-
-
[翻译]对抗IDA Pro调试器ARM反汇编的技巧
-
发表于: 2018-1-9 17:45 6572
-
相较于X86/64架构,ARM被认为在某种程度上更美好、怪癖更少,但这并不意味着不能做点有趣的事,对吧?
所以我查找ARM arch手册,找到了这样一个指令:
10.6.4 PLD
PLD指令用于告诉存储系统,对一个指定地址的数据访问即将到来。存储系统可以调用一些加速存储器访问的方法,比如预读取(pre-loading)方法, 将包含指定地址的cache行预读入cache中。PLD是hint(提示)指令,用于优化存储系统性能,没有架构定义的作用,不支持该指令的存储系统可以忽 略它(相当于空指令)。
语法
PLD <addressing_mode>
其中:
<addressing_mode>
寻址方式为Addressing Mode 2 - Load and Store Word or Unsigned Byte on page A5-18。指定指令的I,U,Rn和addr_mode位。只有P为1且 W为0的寻址模式适用于此指令。
架构版本
ARMv5E版本及以上,除了ARMv5TExP
例外
无
注释
条件 与大多数ARM指令不同,该指令不可以条件执行。
写回 清除位[24](P位)或设置位[21](W位)会返回不可预测的结果。
数据中止 该指令从未发生过数据中止,也从未报出任何由<addressing_mode>生成地址所产生的存储系统异常。这些存储系统异常应该都被自动 忽略了。比如,如果在执行PLD指令时发生异常,存储系统会将PLD当作空指令执行来忽略异常。
因为该指令开始执行时(几乎)没有表现,我需要用一些可寻址的东西来看看IDA是怎样解释它的。
这会预读取2字节到下下一条指令。
现在,假设你想破坏缓存中的数据。
根据之前的手册说明,如果给指令无效数据,它不会发生数据中止,也不会报出任何异常。如果发生异常,就当空指令执行。然而IDA不知道这些。
在之前的例子中,我修改过ARM处理器,每个指令为4个字节,即使一个指令是有缺陷的,也会回到一个正确的指令继续执行。
如果给PLD无效数据,IDA完全无法解析这个(有点)有效的指令,它就会吓坏了!
我添加了一些空指令来制造戏剧性效果(显示IDA没有重新开始反汇编,至少对PLD指令存在的函数是这样)。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课