【Android 逆向】函数拦截原理 ( 可执行程序基本结构 | GOT 全局偏移表 | 可执行程序函数调用步骤 )
一、可执行程序基本结构
程序加载到内存中之后 , 会分为以下 3 3 3 个部分 :
- 可执行程序
- 自定义函数库 : Linux / Android 系统中 .so 动态库 / .a 静态库 , Windows 系统中 .dll 动态库 / .lib 静态库 ;
- 系统函数库
Java 加载到内存之后 , 是 JAR 文件或 DEX 文件 ; Python 加载到内存之后 , 是 Python 脚本 ; 但是二者最终想要在 CPU 上执行 , 还是要转为以上 3 3 3 部分才能执行 ;
二、GOT 全局偏移表
上述 可执行程序 , 自定义库 , 系统库 , 按照 3 3 3 者发生作用的机制 , 又可以进一步进行如下划分 :
可执行程序 可以 调用函数 , 这个被调用的函数 可以是 自定义库 中的函数 , 也可以是 系统库 中的函数 ;
此时就会存在一个 GOT 全局偏移表 , 当 可执行程序编译 时 , 并 不知道每个函数的具体位置 ;
函数相对于其所在的函数库的相对偏移是确定的 , 但是在不同平台加载时 , 该偏移值是不同的 ;
GOT 表的作用 : 记录每个函数的位置 , 其分为 2 2 2 部分 ;
- 跳转信息 : 一部分在 可执行程序 中是 跳转信息 , 会 跳转到函数对应的 系统库 或 自定义库中 ;
- 位置信息 : 另一部分是 函数在函数库的 位置信息 , 跳转到对应的函数库中之后 , 然后再跳转到 函数库 中的函数位置 ;
GOT 表 是在加载动态库 时生成数据的 , 根据加载函数库时的参数 , 可以设置 加载时填充位置信息 , 还是 调用时填充位置信息 ;
GOT 表是从全局加载的符号表 , 符号表中可能有值 , 也可能没有值 , 这是由动态库加载的参数决定的 , 函数调用时 , 该函数的地址值肯定是存在的 ;
三、可执行程序函数调用步骤
可执行程序函数调用步骤 :
① 函数调用 : 可执行程序 执行时 , 先调用函数 , 此时不知道 被调用的函数 地址 ;
② 根据 GOT 表跳转函数库 : 跳转到 GOT 表 , GOT 表会横跨 可执行程序 , 自定义库 , 系统库 3 3 3 部分 , 在 可执行程序 内部的部分 是 函数库跳转信息 , 先跳转到对应的函数库 ;
③ 在函数库中根据 GOT 表跳转到函数位置 : 然后查找 GOT 表在函数库部分的内容 , 是函数的地址 , 根据该函数地址跳转到函数位置 ;
相关文章
- android SurfaceView绘制实现原理解析
- Android Kotlin 数据驱动模板
- Android OpenGL ES(五)GLSurfaceView .
- Android插件化原理解析——Hook机制之动态代理
- Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net
- android 7.1去掉开机提示正在启动应用提示框
- Android跨进程抛异常的原理的实现
- Android 强制横屏、竖屏
- Android Studio 查询RecyclerView最新依赖方法
- android Launcher之获取安装的app列表的两种方法
- Android 音频倍速的原理与算法分析
- 从CM刷机过程和原理分析Android系统结构
- ASM的基础使用 Android 自动化埋点方案原理剖析
- Android View的滚动原理简单解析
- 【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )
- 【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )
- 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )
- 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
- Android Multimedia框架总结(十七)音频开发基础知识
- 【Android-Jetpack进阶】4、LiveData:Activity 监听数据变化,用 LiveData + ViewModel 在 Fragment 间共享数据
- Android EditText(失焦+焦点)+登录界面