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

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

文章目录

一、向进程内存写出数据

二、写出流程

三、完整代码





一、向进程内存写出数据


向内存写出数据 : 每次最多能写出 4 字节 ;


ptrace(PTRACE_POKETEXT, m_nPid, (void*)pDestAddr, d.val);


参数一 : 写出数据标志 PTRACE_POKETEXT ;

参数二 : 进程号 PID ;

参数三 : 写出去数据的地址 ;

参数四 : 写出的数据内容 , 4 字节 ;





二、写出流程


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


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


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


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


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


for (i = 0; i < j; i++) {
  // 准备写出数据 , 从 laddr 拷贝到 d.chars
  memcpy(d.chars, laddr, 4);
  // 32 位的设备上 , 最长只能读取 4 字节 
  ptrace(PTRACE_POKETEXT, m_nPid, (void*)pDestAddr, d.val);
  pDestAddr += 4;
  laddr += 4;
  }



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


读取的时候 , 如果不足 4 字节 , 我们可以将数据直接读取出来 , 不影响程序运行 ; 写出的时候 , 如果写出数据不足 4 字节 , 是 3 字节 , 那么必须保证最后一位写出时 , 不会出错 , 原来进程中 第 4 位是什么数据 , 写出去时也必须是同样的数据 , 否则进程运行出错 ;


先 读取 当前进程内存的数据 ,


// 一次性必须写入 4 字节 , 如果不足 4 字节 , 先把数据读取出来 , 即读取 4 字节出来 
  d.val = ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pDestAddr, 0);


然后 , 设置数据 ; 假如数据有 3 字节 , 那么就将上述读取的 4 字节的前 3 个字节设置成我们要修改的数据 , 这就保证了第 4 个字节不会出错 ;


// 假如数据有 3 字节 , 那么就将上述读取的 4 字节的前 3 个字节设置成我们要修改的数据 
  //  这就保证了第 4 个字节不会出错 
  for (i = 0; i < remain; i++) {
    d.chars[i] = *laddr++;
  }


最后 , 将最终的 4 字节数据写入进程内存 ;


// 最后将最终的 4 字节数据写入进程内存
  ptrace(PTRACE_POKETEXT, m_nPid, (void*)pDestAddr, d.val);//整体写入


部分代码示例 :


// 写出末尾不足 4 字节的数据部分 
  //  读取的时候 , 如果不足 4 字节 , 我们可以将数据直接读取出来 , 不影响程序运行 
  //  写出的时候 , 如果写出数据不足 4 字节 , 是 3 字节 , 那么必须保证最后一位写出时 , 不会出错 , 
  //  原来进程中 第 4 位是什么数据 , 写出去时也必须是同样的数据 , 否则进程运行出错 
  if (remain > 0) {
  // 一次性必须写入 4 字节 , 如果不足 4 字节 , 先把数据读取出来 , 即读取 4 字节出来 
  d.val = ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pDestAddr, 0);
  // 假如数据有 3 字节 , 那么就将上述读取的 4 字节的前 3 个字节设置成我们要修改的数据 
  //  这就保证了第 4 个字节不会出错 
  for (i = 0; i < remain; i++) {
    d.chars[i] = *laddr++;
  }
  // 最后将最终的 4 字节数据
  ptrace(PTRACE_POKETEXT, m_nPid, (void*)pDestAddr, d.val);//整体写入
  }





三、完整代码


向进程内存写出数据完整代码 :


// pDestAddr 写出地址 , const char* pData 写出的数据 , size_t nSize 写出数据大小 
int CPtrace::write(char* pDestAddr, const char* pData, size_t nSize)
{
  uint32_t i, j, remain;
  // 写出数据的地址 , 该地址需要不断累加计算 , 记录写出的数据地址 
  const char *laddr;
  // 联合体 , 在同一个内存地址上 , 既可以以 long 类型解析这块数据 , 也可以以 char 数组类型解析这块数据
  union u {
  long val;
  char chars[sizeof(long)];
  } d;
  // 每次读取 4 字节 , 读取次数为 nSize / 4
  j = nSize / 4;
  // 读取最后不满 4 个字节的数据 
  remain = nSize % 4;
  // 写出数据准备 
  laddr = pData;
  for (i = 0; i < j; i++) {
  // 准备写出数据 , 从 laddr 拷贝到 d.chars
  memcpy(d.chars, laddr, 4);
  // 32 位的设备上 , 最长只能读取 4 字节 
  ptrace(PTRACE_POKETEXT, m_nPid, (void*)pDestAddr, d.val);
  pDestAddr += 4;
  laddr += 4;
  }
  // 写出末尾不足 4 字节的数据部分 
  //  读取的时候 , 如果不足 4 字节 , 我们可以将数据直接读取出来 , 不影响程序运行 
  //  写出的时候 , 如果写出数据不足 4 字节 , 是 3 字节 , 那么必须保证最后一位写出时 , 不会出错 , 
  //  原来进程中 第 4 位是什么数据 , 写出去时也必须是同样的数据 , 否则进程运行出错 
  if (remain > 0) {
  // 一次性必须写入 4 字节 , 如果不足 4 字节 , 先把数据读取出来 , 即读取 4 字节出来 
  d.val = ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pDestAddr, 0);
  // 假如数据有 3 字节 , 那么就将上述读取的 4 字节的前 3 个字节设置成我们要修改的数据 
  //  这就保证了第 4 个字节不会出错 
  for (i = 0; i < remain; i++) {
    d.chars[i] = *laddr++;
  }
  // 最后将最终的 4 字节数据
  ptrace(PTRACE_POKETEXT, m_nPid, (void*)pDestAddr, d.val);//整体写入
  }
  return PTERR_SUCCESS;
}
目录
相关文章
|
1月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
276 76
|
2月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
85 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
2月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
223 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
2月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
73 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
2月前
|
安全 Android开发 iOS开发
escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
escrcpy 是一款基于 Scrcpy 的开源项目,使用 Electron 构建,提供图形化界面来显示和控制 Android 设备。它支持 USB 和 Wi-Fi 连接,帧率可达 30-120fps,延迟低至 35-70ms,启动迅速且画质清晰。escrcpy 拥有丰富的功能,包括自动化任务、多设备管理、反向网络共享、批量操作等,无需注册账号或广告干扰。适用于游戏直播、办公协作和教育演示等多种场景,是一款轻量级、高性能的 Android 控制工具。
126 1
|
1月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
171 29
JVM简介—1.Java内存区域
|
1月前
|
消息中间件 Java 应用服务中间件
JVM实战—2.JVM内存设置与对象分配流转
本文详细介绍了JVM内存管理的相关知识,包括:JVM内存划分原理、对象分配与流转、线上系统JVM内存设置、JVM参数优化、问题汇总。
JVM实战—2.JVM内存设置与对象分配流转
|
1月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
5月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
1046 1
|
2月前
|
存储 算法 Java
JVM: 内存、类与垃圾
分代收集算法将内存分为新生代和老年代,分别使用不同的垃圾回收算法。新生代对象使用复制算法,老年代对象使用标记-清除或标记-整理算法。
39 6

相关实验场景

更多