首页
社区
课程
招聘
[翻译]对抗IDA Pro调试器ARM反汇编的技巧
2018-1-9 17:45 6202

[翻译]对抗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虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回