【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )

简介: 【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )

文章目录

一、进程注入原理

二、远程调用流程 ( 获取 so 动态库地址 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )





一、进程注入原理


调试进程 Attach 被调试进程 :


工具程序 ( 调试进程 ) 获取调试 目标进程 ( 被调试进程 ) 的权限 , 调用 ptrace 函数 , 传入 PTRACE_ATTACH 参数 ;


如果 目标进程 Attach 成功 , 该进程会自动挂起 , 暂停执行指令 ; 并返回 WUNTRACED 状态给 工具程序 , 表示 目标进程 已经进入 被调试状态 ;



调试进程 读取 被调试进程 寄存器值 :


工具程序 ( 调试进程 ) 调用 ptrace 函数 , 传入 PTRACE_GETREGS 参数 , 获取调试 目标进程 ( 被调试进程 ) 的寄存器值 , 获取成功后 , 返回给 工具程序 ( 调试进程 ) ;


工具程序 ( 调试进程 ) 中拿到寄存器值后 , 保存一份寄存器值 , 之后再进行远程调用等操作 , 最后 Detach 解除调试时 , 必须根据保存的寄存器值 , 恢复 目标进程 ( 被调试进程 ) 的寄存器值 ;



工具程序 ( 调试进程 ) 远程调用 目标进程 ( 被调试进程 ) :


远程调用 指的是 在 目标进程 ( 被调试进程 ) 中 , 执行 我们想要执行的程序 , 一般是加载 SO 动态库 或远程代码 , 使用 malloc 分配内存 , 然后将代码复制到该段内存中 , 给这块内存分配可执行权限 ;


一般情况是注入一个 SO 动态库 , 每个 SO 动态库 都是独立模块 , 这样不会破坏原有的代码体系 ,


然后 通过 远程调用 , 获取该内存的地址 , 之后就可以使用远程调用执行注入的代码 ;


注入代码 , 一般是用于修改 进程逻辑用的 , 修改 目标进程 ( 被调试进程 ) 内存中的数据 ;



进程注入原理图 :








二、远程调用流程 ( 获取 so 动态库地址 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )


远程调用 的 核心就是 要 准确的计算 要远程调用的 SO 动态库的库函数 在内存中的地址 ;



内存空间是一块线性的空间 , 内存地址从低到高依次线性排列 , 如 0x00 00 00 00 ~ 0x FF FF FF FF , 32 位地址对应的指针地址长度都是 4 字节 , 最多访问 4 GB 的内存空间 ;



工具程序 ( 调试进程 ) 又称为 " 控制进程 " , 对应下图的 控制进程 , 控制进程 在 内存中 , 占据一定的控件 ;


目标进程 ( 被调试进程 ) 又称为 " 被控制进程 " , 对应下图的 控制进程 , 被控制进程 在 内存中 , 也占据一定的控件 ;


控制进程 与 被控制进程 在内存中 , 先后顺序不确定 ;



下图的内存是 Android 设备的整体内存 ;





在 /proc/pid 对应 进程的 目录下 , 有 mmaps 文件 , 在该文件中 , 会记录所有的 so 动态库的 起止 内存地址 ;


根据 /proc/pid/mmaps 文件 , 可以获取 工具程序 ( 调试进程 ) 的 libc.so 的起止地址 , 也可以获取 目标进程 ( 被调试进程 ) 的 libc.so 的起止地址 ;


在 libc.so 中存在 dlopen 函数 , dlopen 函数有一个函数指针 ( 函数地址 ) , 该函数指针可以直接获取到 , dlopen 的名称就代表该函数的地址 , libc.so 的起始地址可以通过 /proc/pid/mmaps 文件确定 , dlopen 函数在 libc.so 的相对偏移量 ( 如 : 8 字节 ) 也是确定的 , 这样就可以知道 dlopen 函数在内存中的地址 ;


获取到 dlopen 函数地址后 , 将 IP 寄存器设置成 r_dlopen 函数地址 ; IP 寄存器存储将要执行的下一条指令的偏移量 ;


通过 mmap 函数 , 分配一块新内存 , SP 寄存器指向这块新内存 , 之后 调用 ptrace 函数传入 PTRACE_CONT 参数 , 继续执行将控制权交还给 目标进程 ( 被调试进程 ) , 继续执行 , 直到下一个中断发生 ; SP 寄存器是堆栈指针寄存器 ;


目录
相关文章
|
Android开发 开发者
Android设置View是否可用
在Android开发中,有时需要将布局设置为不可点击状态(失去焦点)。常见的解决方法是使用`setOnClickListener(null)`,但本文介绍一种更通用的方式:通过封装`setViewEnabled`方法实现。该方法可递归设置View及其子View的启用状态,支持传入目标View和布尔值(`true`为可用,`false`为禁用)。例如,调用`setViewEnabled(edittext, false)`即可禁用EditText。文章附有源码及示例动图,帮助开发者快速理解与应用。
360 1
|
安全 算法 小程序
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
1132 28
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
|
Android开发 开发者
Android中Dialog位置+样式的设置
本文介绍了在Android开发中如何设置Dialog的位置和样式。通过自定义`MyDialog`类,可以灵活调整Dialog的显示位置,例如将其固定在屏幕底部,并设置宽度匹配父布局。同时,文章还展示了如何模仿Android原生Dialog样式,通过定义`MyDialogStyle`去除标题栏、设置背景透明度、添加阴影效果以及配置点击外部关闭等功能,从而实现更加美观和符合需求的Dialog效果。代码示例详细,便于开发者快速上手实现。
798 2
|
NoSQL 应用服务中间件 PHP
布谷一对一直播源码android版环境配置流程及功能明细
部署需基于 CentOS 7.9 系统,硬盘不低于 40G,使用宝塔面板安装环境,包括 PHP 7.3(含 Redis、Fileinfo 扩展)、Nginx、MySQL 5.6、Redis 和最新 Composer。Swoole 扩展需按步骤配置。2021.08.05 后部署需将站点目录设为 public 并用 ThinkPHP 伪静态。开发环境建议 Windows 操作系统与最新 Android Studio,基础配置涉及 APP 名称修改、接口域名更换、包名调整及第三方登录分享(如 QQ、微信)的配置,同时需完成阿里云与腾讯云相关设置。
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
600 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
10881 2
|
10月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1798 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
10月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1150 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
10月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1221 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
11月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
956 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡

热门文章

最新文章