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

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

文章目录

一、可执行程序基本结构

二、GOT 全局偏移表

三、可执行程序函数调用步骤





一、可执行程序基本结构


程序加载到内存中之后 , 会分为以下 3 33 个部分 :


可执行程序

自定义函数库 : Linux / Android 系统中 .so 动态库 / .a 静态库 , Windows 系统中 .dll 动态库 / .lib 静态库 ;

系统函数库


image.png


Java 加载到内存之后 , 是 JAR 文件或 DEX 文件 ; Python 加载到内存之后 , 是 Python 脚本 ; 但是二者最终想要在 CPU 上执行 , 还是要转为以上 3 33 部分才能执行 ;






二、GOT 全局偏移表


上述 可执行程序 , 自定义库 , 系统库 , 按照 3 33 者发生作用的机制 , 又可以进一步进行如下划分 :


可执行程序 可以 调用函数 , 这个被调用的函数 可以是 自定义库 中的函数 , 也可以是 系统库 中的函数 ;


此时就会存在一个 GOT 全局偏移表 , 当 可执行程序编译 时 , 并 不知道每个函数的具体位置 ;


函数相对于其所在的函数库的相对偏移是确定的 , 但是在不同平台加载时 , 该偏移值是不同的 ;



GOT 表的作用 : 记录每个函数的位置 , 其分为 2 22 部分 ;


跳转信息 : 一部分在 可执行程序 中是 跳转信息 , 会 跳转到函数对应的 系统库 或 自定义库中 ;

位置信息 : 另一部分是 函数在函数库的 位置信息 , 跳转到对应的函数库中之后 , 然后再跳转到 函数库 中的函数位置 ;

GOT 表 是在加载动态库 时生成数据的 , 根据加载函数库时的参数 , 可以设置 加载时填充位置信息 , 还是 调用时填充位置信息 ;


GOT 表是从全局加载的符号表 , 符号表中可能有值 , 也可能没有值 , 这是由动态库加载的参数决定的 , 函数调用时 , 该函数的地址值肯定是存在的 ;

image.png







三、可执行程序函数调用步骤


可执行程序函数调用步骤 :


① 函数调用 : 可执行程序 执行时 , 先调用函数 , 此时不知道 被调用的函数 地址 ;


② 根据 GOT 表跳转函数库 : 跳转到 GOT 表 , GOT 表会横跨 可执行程序 , 自定义库 , 系统库 3 33 部分 , 在 可执行程序 内部的部分 是 函数库跳转信息 , 先跳转到对应的函数库 ;


③ 在函数库中根据 GOT 表跳转到函数位置 : 然后查找 GOT 表在函数库部分的内容 , 是函数的地址 , 根据该函数地址跳转到函数位置 ;


目录
相关文章
|
2月前
|
Dart 开发工具 Android开发
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
|
3月前
|
Java 调度 Android开发
Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?
本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。
72 1
|
3月前
|
Android开发 iOS开发 C#
Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
76 0
|
4月前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin中常见作用域函数
**Kotlin作用域函数概览**: `let`, `run`, `with`, `apply`, `also`. `let`安全调用并返回结果; `run`在上下文中执行代码并返回结果; `with`执行代码块,返回结果; `apply`配置对象后返回自身; `also`附加操作后返回自身
59 8
|
4月前
|
Android开发 Kotlin
Android面试题之kotlin中怎么限制一个函数参数的取值范围和取值类型等
在Kotlin中,限制函数参数可通过类型系统、泛型、条件检查、数据类、密封类和注解实现。例如,使用枚举限制参数为特定值,泛型约束确保参数为Number子类,条件检查如`require`确保参数在特定范围内,数据类封装可添加验证,密封类限制为一组预定义值,注解结合第三方库如Bean Validation进行校验。
77 6
|
5月前
|
Java 机器人 Linux
01. 【Android教程】系统背景及结构概述
01. 【Android教程】系统背景及结构概述
42 0
|
6月前
|
测试技术 开发工具 Android开发
安卓应用开发:打造高效用户界面的关键步骤
【5月更文挑战第27天】本文将探讨在安卓应用开发中如何通过关键步骤打造高效且用户友好的界面。我们将分析UI设计的基本原则,探究Material Design指南,并讨论如何利用Android Studio中的设计工具来优化布局和提高性能。此外,文章还将涉及如何进行有效的测试以确保应用界面既美观又实用。
|
6月前
|
Android开发
Android构建系统:Android.mk(2)函数详解
Android构建系统:Android.mk(2)函数详解
84 1
|
6月前
|
Android开发
Android Makefile中inherit-product函数和include的区别
Android Makefile中inherit-product函数和include的区别
124 0