【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;
}
目录
相关文章
|
3月前
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
|
1月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
62 0
|
2月前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
311 4
|
3月前
|
API Android开发
Android P 性能优化:创建APP进程白名单,杀死白名单之外的进程
本文介绍了在Android P系统中通过创建应用进程白名单并杀死白名单之外的进程来优化性能的方法,包括设置权限、获取运行中的APP列表、配置白名单以及在应用启动时杀死非白名单进程的代码实现。
62 1
|
3月前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
88 1
|
3月前
|
存储 缓存 Java
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
45 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
370 0
|
22天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
46 1
|
27天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
1月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。

相关实验场景

更多