-
-
[翻译]对抗IDA Pro调试器ARM反汇编的技巧
-
2018-1-9 17:45 6202
-
相较于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指令存在的函数是这样)。
成功!
更酷的是,这只是一种无效字节的组合。还有各种各样的组合形式可以导致同样的事发生。8月31日更新:
经过一番研究之后,我可以准确的说明,为什么IDA不认为这是个有效的指令,而为什么CPU可以正常的执行指令。
考虑这些:
3.13.6 无条件指令扩展空间
在ARM v5及以上版本中,有以下操作码的指令是无条件指令空间:
表3-6是已经被分配到这个区域的指令
通过一个简单的程序,可以发现PLD指令中的无效数据破坏了“addr_mode”之后4位的数据。
用这个样例程序创建一个指令并将结果写入gcc,得到了我想要的结果。现在可以(使用以上要点)创建许多相似的指令了。
你可以破坏指令其他的字段(比如addr_mode字段)来创建相似的指令来完成相同的任务。
原文链接:https://kbdsmoke.me/anti-disassembly-on-arm-ida-specifically/
本文由 看雪翻译小组 Green奇 编译
[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法