【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 调试进程 ATTACH 附着目标进程 | 读取目标函数寄存器值并存档 )

简介: 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 调试进程 ATTACH 附着目标进程 | 读取目标函数寄存器值并存档 )

文章目录

一、调试进程 ATTACH 附着目标进程

二、读取目标函数寄存器值并存档

1、主要操作流程

2、ptrace 函数 PTRACE_GETREGS 读取寄存器值





一、调试进程 ATTACH 附着目标进程


在 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具的 main 函数分析 ) 博客中 , 在 main 函数中获取了 进程号 PID , 下面开始将 SO 动态库注入该 PID 进程号对应的目标进程 ;


ptrace 函数调用的前提是 , 当前应用必须有 root 权限 , 否则调用会失败 ;


首先 , 调用


ptrace(PTRACE_ATTACH, pid, NULL, 0)


函数附着目标进程 , 获取目标进程的控制权 , 传入 PTRACE_ATTACH 参数 ;


具体的 ptrace 函数族的参数 , 参考 【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 ) 博客 ;


之后 , 需要 阻塞等待 被调试 的 目标进程返回 , 如果目标进程状态变为 WUNTRACED 被调试状态 , 就可以执行下一步的操作 ;


int status = 0;
  /* 等待关联进程结果返回 , 目标进程状态变为 WUNTRACED */
  waitpid(pid, &status, WUNTRACED);



附着目标进程完整代码 :


/* 附着目标进程 */
int ptrace_attach(pid_t pid)
{
  /* attach 关联 要调试的 目标进程 */
  if (ptrace(PTRACE_ATTACH, pid, NULL, 0) < 0) {
  perror("ptrace_attach");
  return -1;
  }
  int status = 0;
  /* 等待关联进程结果返回 , 目标进程状态变为 WUNTRACED */
  waitpid(pid, &status, WUNTRACED);
  return 0;
}





二、读取目标函数寄存器值并存档



1、主要操作流程


声明两个结构体 , 分别用于寄存器值操作 和 存档 , 存档的结构体一定不要写入数据 , 之后恢复寄存器值时需要用到 ;


/* regs 结构体 用于存储寄存器值
    original_regs 结构体 用于存储寄存器值存档 */
  struct pt_regs regs, original_regs;


之后 , 调用 ptrace_getregs 函数 , 读取目标进程的寄存器值 ;


/* 获取寄存器值 */
  if (ptrace_getregs(target_pid, &regs) == -1)
  goto exit;


最后 , 将寄存器的值存档 ,


/* save original registers 寄存器值存档 */
  memcpy(&original_regs, &regs, sizeof(regs));


寄存器读取存档代码示例 :


/* regs 结构体 用于存储寄存器值
    original_regs 结构体 用于存储寄存器值存档 */
  struct pt_regs regs, original_regs;
  /* 获取寄存器值 */
  if (ptrace_getregs(target_pid, &regs) == -1)
  goto exit;
  /* save original registers 寄存器值存档 */
  memcpy(&original_regs, &regs, sizeof(regs));



2、ptrace 函数 PTRACE_GETREGS 读取寄存器值


在 ptrace_getregs 函数中 , 调用


ptrace(PTRACE_GETREGS, pid, NULL, regs)


方法 , 获取目标进程的寄存器数据 , 传入 PTRACE_GETREGS 参数 ;


具体的 ptrace 函数族的参数 , 参考 【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 ) 博客 ;


/* 获取寄存器值 */
int ptrace_getregs(pid_t pid, struct pt_regs* regs)
{
  if (ptrace(PTRACE_GETREGS, pid, NULL, regs) < 0) {
  perror("ptrace_getregs: Can not get register values");
  return -1;
  }
  return 0;
}


目录
相关文章
|
15天前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
132 1
|
28天前
|
大数据 Linux Android开发
Android ParcelFileDescriptor实现进程间通信
Android ParcelFileDescriptor实现进程间通信
24 0
|
2月前
|
Java 调度 开发者
构建高效微服务架构:后端开发的新趋势深入理解操作系统之进程调度策略
【4月更文挑战第30天】 随着企业数字化转型的不断深入,传统的单体应用逐渐不能满足快速迭代和灵活部署的需求。微服务架构以其高度模块化、独立部署和易于扩展的特性,成为现代后端开发的重要趋势。本文将探讨如何构建一个高效的微服务架构,包括关键的设计原则、技术选型以及可能面临的挑战。
|
2月前
|
XML 前端开发 Android开发
Android架构设计——MVC(1),Android多进程从头讲到尾
Android架构设计——MVC(1),Android多进程从头讲到尾
|
2月前
|
监控 C++
C++ Qt开发:QProcess进程管理模块
Qt是一个跨平台的C++图形库,简化了窗体应用开发,支持通过拖放组件提升效率。本章节关注`QProcess`组件,它用于控制和管理进程,例如执行命令、运行可执行文件及与外部进程通信。`QProcess`提供多种方法如`start`、`waitForStarted`和`waitForFinished`等,实现启动、监控和交互。示例展示了如何使用`QProcess`获取系统进程和信息,通过`tasklist`和`systeminfo`命令,并将结果展示在`QTreeWidget`中。
75 0
C++ Qt开发:QProcess进程管理模块
|
2月前
|
安全 Linux API
Android进程与线程
Android进程与线程
30 0
|
2月前
|
Linux 测试技术 调度
进程调度预备开发
进程调度预备开发
35 0
|
7月前
|
Windows
5.4 Windows驱动开发:内核通过PEB取进程参数
PEB结构`(Process Envirorment Block Structure)`其中文名是进程环境块信息,进程环境块内部包含了进程运行的详细参数信息,每一个进程在运行后都会存在一个特有的PEB结构,通过附加进程并遍历这段结构即可得到非常多的有用信息。在应用层下,如果想要得到PEB的基地址只需要取`fs:[0x30]`即可,TEB线程环境块则是`fs:[0x18]`,如果在内核层想要得到应用层进程的PEB信息我们需要调用特定的内核函数来获取。
72 0
5.4 Windows驱动开发:内核通过PEB取进程参数
|
7月前
|
监控 安全 API
7.1 Windows驱动开发:内核监控进程与线程回调
在前面的文章中`LyShark`一直在重复的实现对系统底层模块的枚举,今天我们将展开一个新的话题,内核监控,我们以`监控进程线程`创建为例,在`Win10`系统中监控进程与线程可以使用微软提供给我们的两个新函数来实现,此类函数的原理是创建一个回调事件,当有进程或线程被创建或者注销时,系统会通过回调机制将该进程相关信息优先返回给我们自己的函数待处理结束后再转向系统层。
82 0
7.1 Windows驱动开发:内核监控进程与线程回调
|
7月前
|
存储 Windows
4.6 Windows驱动开发:内核遍历进程VAD结构体
在上一篇文章`《内核中实现Dump进程转储》`中我们实现了ARK工具的转存功能,本篇文章继续以内存为出发点介绍`VAD`结构,该结构的全程是`Virtual Address Descriptor`即`虚拟地址描述符`,VAD是一个`AVL`自`平衡二叉树`,树的每一个节点代表一段虚拟地址空间。程序中的代码段,数据段,堆段都会各种占用一个或多个`VAD`节点,由一个`MMVAD`结构完整描述。
71 0
4.6 Windows驱动开发:内核遍历进程VAD结构体