android的ptrace函数详细分析

公众号:小道安全
• 阅读 1423

@[toc]

1.ptrace函数详解

1.1在系统中调用需要包含头文件及函数声明

#include <sys/ptrace.h> int ptrace(int request, int pid, int addr, int data);

1.2详细分析函数

Ptrace 提供了一种父进程可以控制子进程运行,并可以检查和改变它的核心image。它主要用于实现断点调试。一个被跟踪的进程运行中,直到发生一个信号。则进程被中止,并且通知其父进程。在进程中止的状态下,进程的内存空间可以被读写。父进程还可以使子进程继续执行,并选择是否是否忽略引起中止的信号。

Request参数含义: PTRACE_TRACEME 本进程被其父进程所跟踪。其父进程应该希望跟踪子进程。 PTRACE_PEEKTEXT, PTRACE_PEEKDATA 从内存地址中读取一个字节,内存地址由addr给出。 PTRACE_PEEKUSR 从USER区域中读取一个字节,偏移量为addr。 PTRACE_POKETEXT, PTRACE_POKEDATA 往内存地址中写入一个字节。内存地址由addr给出。 PTRACE_POKEUSR 往USER区域中写入一个字节。偏移量为addr。 PTRACE_SYSCALL, PTRACE_CONT 重新运行。 PTRACE_KILL 杀掉子进程,使它退出。 PTRACE_SINGLESTEP 设置单步执行标志 PTRACE_ATTACH 跟踪指定pid 进程。 PTRACE_DETACH 结束跟踪

Intel386特有: PTRACE_GETREGS 读取寄存器 PTRACE_SETREGS 设置寄存器 PTRACE_GETFPREGS 读取浮点寄存器 PTRACE_SETFPREGS 设置浮点寄存器

1.3函数返回值

成功返回0。错误返回-1。errno被设置。

错误 EPERM 特殊进程不可以被跟踪或进程已经被跟踪。 ESRCH 指定的进程不存在 EIO 请求非法

2.功能详细描述

2.1 PTRACE_TRACEME

形式:ptrace(PTRACE_TRACEME,0 ,0 ,0) 解释:本进程被其父进程所跟踪。其父进程应该希望跟踪子进程。

2.2PTRACE_PEEKTEXT, PTRACE_PEEKDATA

形式:ptrace(PTRACE_PEEKTEXT, pid, addr, data) ptrace(PTRACE_PEEKDATA, pid, addr, data) 解释:从内存地址中读取一个字节,pid表示被跟踪的子进程,内存地址由addr给出,data为用户变量地址用于返回读到的数据。在Linux(i386)中用户代码段与用户数据段重合所以读取代码段和数据段数据处理是一样的。

2.3PTRACE_POKETEXT, PTRACE_POKEDATA

形式:ptrace(PTRACE_POKETEXT, pid, addr, data) ptrace(PTRACE_POKEDATA, pid, addr, data) 解释:往内存地址中写入一个字节。pid表示被跟踪的子进程,内存地址由addr给出,data为所要写入的数据。

2.4PTRACE_PEEKUSR

形式:ptrace(PTRACE_PEEKUSR, pid, addr, data) 解释:从USER区域中读取一个字节,pid表示被跟踪的子进程,USER区域地址由addr给出,data为用户变量地址用于返回读到的数据。USER结构为core文件的前面一部分,它描述了进程中止时的一些状态,如:寄存器值,代码、数据段大小,代码、数据段开始地址等。在Linux(i386)中通过PTRACE_PEEKUSER和PTRACE_POKEUSR可以访问USER结构的数据有寄存器和调试寄存器。

2.5PTRACE_POKEUSR

形式:ptrace(PTRACE_POKEUSR, pid, addr, data) 解释:往USER区域中写入一个字节,pid表示被跟踪的子进程,USER区域地址由addr给出,data为需写入的数据。

2.6 PTRACE_CONT

形式:ptrace(PTRACE_CONT, pid, 0, signal) 解释:继续执行。pid表示被跟踪的子进程,signal为0则忽略引起调试进程中止的信号,若不为0则继续处理信号signal。

2.7PTRACE_SYSCALL

形式:ptrace(PTRACE_SYS, pid, 0, signal) 解释:继续执行。pid表示被跟踪的子进程,signal为0则忽略引起调试进程中止的信号,若不为0则继续处理信号signal。与PTRACE_CONT不同的是进行系统调用跟踪。在被跟踪进程继续运行直到调用系统调用开始或结束时,被跟踪进程被中止,并通知父进程。

2.8PTRACE_KILL

形式:ptrace(PTRACE_KILL,pid) 解释:杀掉子进程,使它退出。pid表示被跟踪的子进程。

2.9PTRACE_SINGLESTEP

形式:ptrace(PTRACE_KILL, pid, 0, signle) 解释:设置单步执行标志,单步执行一条指令。pid表示被跟踪的子进程。signal为0则忽略引起调试进程中止的信号,若不为0则继续处理信号signal。当被跟踪进程单步执行完一个指令后,被跟踪进程被中止,并通知父进程。

2.10PTRACE_ATTACH

形式:ptrace(PTRACE_ATTACH,pid) 解释:跟踪指定pid 进程。pid表示被跟踪进程。被跟踪进程将成为当前进程的子进程,并进入中止状态。

2.11 PTRACE_DETACH

形式:ptrace(PTRACE_DETACH,pid) 解释:结束跟踪。 pid表示被跟踪的子进程。结束跟踪后被跟踪进程将继续执行。

2.12PTRACE_GETREGS

形式:ptrace(PTRACE_GETREGS, pid, 0, data) 解释:读取寄存器值,pid表示被跟踪的子进程,data为用户变量地址用于返回读到的数据。此功能将读取所有17个基本寄存器的值。

2.13 PTRACE_SETREGS

形式:ptrace(PTRACE_SETREGS, pid, 0, data) 解释:设置寄存器值,pid表示被跟踪的子进程,data为用户数据地址。此功能将设置所有17个基本寄存器的值。

2.14 PTRACE_GETFPREGS

形式:ptrace(PTRACE_GETFPREGS, pid, 0, data) 解释:读取浮点寄存器值,pid表示被跟踪的子进程,data为用户变量地址用于返回读到的数据。

2.15 PTRACE_SETFPREGS

形式:ptrace(PTRACE_SETREGS, pid, 0, data) 解释:设置浮点寄存器值,pid表示被跟踪的子进程,data为用户数据地址。

在安卓的逆向过程中注入很多也都是通过ptrace函数进程注入,所以这个函数在安全及逆向过程中是很重要的。

更多安全技术文章,请关注 “小道安全” 公众号,一起学习,一起进步。

点赞
收藏
评论区
推荐文章
光头强的博客 光头强的博客
1星期前
Java面向对象试题
1、 请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。 创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现 接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿 吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
Java Record 的一些思考 - 默认方法使用以及基于预编译生成相关字节码的底层实现
快速上手 Record 类我们先举一个简单例子,声明一个用户 Record。public record User(long id, String name, int age) 这样编写代码之后,Record 类默认包含的元素和方法实现包括:1. record 头指定的组成元素(int id, String name, int age),并且,这些元素都是 f
Wesley13 Wesley13
11个月前
Java爬虫之JSoup使用教程
title: Java爬虫之JSoup使用教程 date: 2018-12-24 8:00:00 +0800 update: 2018-12-24 8:00:00 +0800 author: me cover: [https://img-blog.csdnimg.cn/20181224144920712](https://www.oschin
Stella981 Stella981
11个月前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有`time`,和`datetime`两个,本文先说`time`模块。 ### 关于时间戳的几个概念 * 时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。 * 时间元组(`struct_time`),包含9个元素。  `time.struct_time(tm_y
Wesley13 Wesley13
11个月前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表: **时辰** **时间** **24时制** 子时 深夜 11:00 - 凌晨 01:00 23:00 - 01 :00 丑时 上午 01:00 - 上午 03:00 01:00 - 03 :00 寅时 上午 03:00 - 上午 0
Stella981 Stella981
11个月前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“**Java进阶架构师**”,点击右上角,将我们设为**★**“**星标**”!这样才不会错过每日进阶架构文章呀。   ![](http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)   **2
Wesley13 Wesley13
11个月前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数`NOW()`相同的格式返回日期和时间? 我知道如何使用`date()`做到这一点,但是我问是否有一个仅用于此的函数。 例如,返回: 2009-12-01 00:00:00 * * * ### #1楼 使用此功能: function getDatetimeNow() {
Wesley13 Wesley13
11个月前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_34035044 helloworld_34035044
2个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为
公众号:小道安全
公众号:小道安全
Lv1
擅长各种安全开发逆向破解黑客技术,欢迎交流技术。
8
文章
0
粉丝
1
获赞