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

[翻译]对抗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直播授课

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//