【Android 逆向】代码调试器开发 ( ptrace 函数 | 读取进程内存数据 )

简介: 【Android 逆向】代码调试器开发 ( ptrace 函数 | 读取进程内存数据 )

文章目录

一、读取进程内存数据

二、读取流程

三、完整代码





一、读取进程内存数据


使用 ptrace 函数读取内存数据 :


ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pRemoteAddr, 0);


传入的第一个参数可以是 PTRACE_PEEKTEXT / PTRACE_PEEKDATA / PTRACE_PEEKUSER , 这三个参数效果相同 ;


传入的第二个参数是 进程号 PID , ptrace 函数可以同时调试多个进程 ;


传入的第三个参数是内存地址 , void* 指针类型的 ;


传入的第四个参数默认为 0 ;


上述读取进程内存数据的 ptrace 方法的返回值是一个 4 字节数据 , 32 位的设备上 , 最长只能读取 4 字节 ; 可以在 for 循环中读取内存中的数据 ;






二、读取流程


读取进程内存数据时 , 每次最多只能读取 4 字节数据 , 先根据读取的大小 , 计算出读取次数 ,


// 每次读取 4 字节 , 读取次数为 nSize / 4
  j = nSize / 4;


然后再计算出最后不足 4 字节的部分 ,


// 读取最后不满 4 个字节的数据 
  remain = nSize % 4;


读取数据时 , 先循环 j 次 , 读取 j x 4 字节数据 ,


for (i = 0; i < j; i++) {
  // 32 位的设备上 , 最长只能读取 4 字节 
  d.val = ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pRemoteAddr, 0);
  // 将读取的数据拷贝到 laddr 地址中 
  memcpy(laddr, d.chars, 4);
  pRemoteAddr += 4;
  laddr += 4;
  }


最后再读取一次末尾不足 4 字节的数据 ;


// 读取最后不足 4 字节的数据 
  if (remain > 0) {
  d.val = ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pRemoteAddr, 0);
  memcpy(laddr, d.chars, remain);
  }





三、完整代码


使用 ptrace 函数读取内存完整代码示例 :


int CPtrace::read(char* pRemoteAddr, char* pBuf, size_t nSize)
{
  uint32_t i = 0, j = 0, remain = 0;
  // 拷贝数据的目的地址 , 该指针需要不断累加计算 , 记录已经读取的数据
  char *laddr;
  // 联合体 , 在同一个内存地址上 , 既可以以 long 类型解析这块数据 , 也可以以 char 数组类型解析这块数据
  union u {
  long val;
  char chars[sizeof(long)];
  } d;
  // 每次读取 4 字节 , 读取次数为 nSize / 4
  j = nSize / 4;
  // 读取最后不满 4 个字节的数据 
  remain = nSize % 4;
  // 设置读取数据的最终存放地址 
  laddr = pBuf;
  for (i = 0; i < j; i++) {
  // 32 位的设备上 , 最长只能读取 4 字节 
  d.val = ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pRemoteAddr, 0);
  // 将读取的数据拷贝到 laddr 地址中 
  memcpy(laddr, d.chars, 4);
  pRemoteAddr += 4;
  laddr += 4;
  }
  // 读取最后不足 4 字节的数据 
  if (remain > 0) {
  d.val = ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pRemoteAddr, 0);
  memcpy(laddr, d.chars, remain);
  }
  return PTERR_SUCCESS;
}
目录
相关文章
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
33 1
|
2月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
3月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
36 2
|
4月前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
51 3
|
6月前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
137 13
|
5月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
5月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
192 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
4月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。
|
5月前
|
存储 缓存 安全
【Linux】冯诺依曼体系结构与操作系统及其进程
【Linux】冯诺依曼体系结构与操作系统及其进程
178 1
|
5月前
|
小程序 Linux
【编程小实验】利用Linux fork()与文件I/O:父进程与子进程协同实现高效cp命令(前半文件与后半文件并行复制)
这个小程序是在文件IO的基础上去结合父子进程的一个使用,利用父子进程相互独立的特点实现对数据不同的操作
128 2