Android 逆向函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )相关的知识,希望对你有一定的参考价值。





一、GOT 表拦截与插桩拦截



函数拦截有 2 2 2 种方式 :

  • 使用 GOT 表进行函数拦截 : 修改 GOT 表实现函数拦截 ;
  • 插桩拦截 : 该方法就是 在实际被调用的函数中添加跳转代码实现函数拦截 ;

【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 ) 博客中分析到 , " 使用 GOT 表进行函数拦截 " 方法不能保证 100% 成功 , 插桩拦截 可以实现 100% 拦截成功率 ;


" 插桩拦截 " 由于需要 修改代码 , 可能会 被反调试工具发现 , 如果是游戏 , 账号估计就凉了 ; 反调试工具 不可能监控所有的函数 , 一个应用的函数个数都是以万进行计算的 ;





二、插桩拦截简介



插桩拦截 : 在要 调用的实际函数 的入口处 , 写入跳转代码 , 跳转到 我们自定义的 拦截函数中 , 在拦截函数中 , 执行 处理函数 , 处理函数再次调用实际函数 或 自己执行一些其它函数 ;





三、插桩拦截涉及的 ARM 和 x86 中的跳转指令



插桩拦截 时 , 在 实际函数 入口处写入的 跳转代码 就是 汇编中的 跳转指令 ;

跳转指令 可以理解为 " 指令 " 或 " 机器码 " , 指令是人看到的 汇编指令 , 机器码是给 CPU 执行的 二进制机器码 ; 二者是等效的 ;


x86 架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 32 32 32 位指令 ;

E9 00 00 00 00 , JMP target ;

JMP 是强制跳转指令 , E9 是对应的机器码 ;


ARM 架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 32 32 32 位指令 ;

04 F0 1F E5 00 00 00 00 , B target ;

B 指令是无条件跳转指令 , 04 F0 1F E5 是对应的机器码 ;


x86 架构是 复杂指令集 , ARM 架构是 精简指令集 , 从上面的机器码可以看出区别 , x86 架构中指令有 1 1 1 字节 , ARM 架构中 指令只有 4 4 4 字节 ;

以上是关于Android 逆向函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向函数拦截 ( GOT 表数据结构分析 | 函数根据 GOT 表进行跳转的流程 )

Android 逆向函数拦截原理 ( 可执行程序基本结构 | GOT 全局偏移表 | 可执行程序函数调用步骤 )

Android 逆向函数拦截实例 ( ③ 刷新 CPU 高速缓存 | ④ 处理拦截函数 | ⑤ 返回特定结果 )

Android 逆向函数拦截实例 ( 函数拦截流程 | 定位动态库及函数位置 )

Android 逆向函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )

Android 逆向函数拦截 ( 修改内存页属性 | x86 架构插桩拦截 )