文章目录

  • 一、准备 mmap 函数的参数
  • 二、mmap 函数远程调用

一、准备 mmap 函数的参数


上一篇博客 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 ) 中介绍了 mmap 函数 ;

mmap 函数的函数原型如下 :

<sys/mman.h>
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);
int munmap(void* start,size_t length);

mmap 函数参数含义 :

  • void* start : 如果为 0 就是让系统自动分配 , 如果不为 0 , 则由用户指定分配的地址 ;
  • size_t length : 申请分配内存的大小 ;
  • int prot : 内存保护标志 , 如 PROT_READ | PROT_WRITE | PROT_EXEC , 表示 可读 | 可写 | 可执行 ;
  • int flags : 映射对象类型标志位标志位 , 如 MAP_ANONYMOUS | MAP_PRIVATE , 表示 匿名 | 私有 ;
  • int fd : 文件描述符 ; 没有设置为 0 ;
  • off_t offset : 被映射对象的起点偏移量 , 一般设置 0 ;

将 mmap 的参数放到 parameters 数组中 , 之后要将该地址传递给远程进程的 ESP 寄存器 , 用于指定

 long parameters[10];/* 下面是远程调用 mmap 函数分配栈内存信息 *//* call mmap 调用 mmap 函数传入的参数 */parameters[0] = 0;  // addr  地址让系统分配 , 也可以指定内存地址parameters[1] = 0x4000; // size 分配的内存大小 0x4000 字节 , 也就是 16KB ,  mmap 函数的参数胡parameters[2] = PROT_READ | PROT_WRITE | PROT_EXEC;  // prot  可读 | 可写 | 可执行 parameters[3] = MAP_ANONYMOUS | MAP_PRIVATE; // flags  匿名 | 私有 parameters[4] = 0; //fd  文件描述符 parameters[5] = 0; //offset  偏移量

二、mmap 函数远程调用


由于远程调用涉及到寄存器的操作 , 因此 arm 架构 与 x86 架构的 远程调用是不同的 , 本次开发的是 x86 架构下的远程调用 ;

首先 , 将 mmap 函数执行的参数 , 写出到远程进程的内存中 , 调用 ptrace_writedata 方法 , 写出内存数据 ;

     /* 设置 ESP 栈指针寄存器 */regs->esp -= (num_params) * sizeof(long);/* 将 long* params 参数写出到 pid 对应的远程进程中 , 然后将写出后数据的首地址 , 设置到 pid_t pid 进程号对应的远程进程的 ESP 寄存器中 , 设置的数据长度 4 字节 */ptrace_writedata(pid, (uint8_t*)(void*)regs->esp, (uint8_t*)params, (num_params) * sizeof(long));

此外还要在栈中设置一个 0 地址 , 为了保证远程进程执行完毕后 , 自动访问 0 地址 , 导致崩溃 , 这样调试程序就可以收回控制权 ; 参考 【Android 逆向】Android 进程注入工具开发 ( EIP 寄存器指向 dlopen 函数 | ESP 寄存器指向栈内存 | 调试程序收回目标进程控制权 ) 博客 ;

 /* 设置一个 0 地址 */long tmp_addr = 0x00;/* 设置 0 地址的作用是 保证 远程进程 访问该 0 地址 导致崩溃 , 调试工具收回进程控制权 */regs->esp -= sizeof(long);ptrace_writedata(pid, (uint8_t*)(regs->esp), (uint8_t*)&tmp_addr, sizeof(tmp_addr));

然后 , 设置 远程进程 的 EIP 寄存器 , 指定执行哪个函数 , 这个 函数地址 是在 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 ) 博客中获取的 mmap 函数地址 ;

 /* 设置 EIP 寄存器值 , 存储 CPU 下一条将要执行的指令 */regs->eip = addr;/* 设置 pid 远程进程的寄存器值 */if (ptrace_setregs(pid, regs) == -1|| ptrace_continue(pid) == -1) {printf("error\n");return -1;}

最后 , 调用 ptrace_continue 方法 , 执行该 mmap 函数 ;

ptrace_continue(pid)

mmap 函数远程调用 完整代码 :

#elif defined(__i386__)
long ptrace_call(pid_t pid, uint32_t addr, long* params, uint32_t num_params, struct user_regs_struct* regs)
{/* 参数说明 :  */if (num_params > 0 && (params != NULL)) {/* 设置 ESP 栈指针寄存器 */regs->esp -= (num_params) * sizeof(long);/* 将 long* params 参数写出到 pid 对应的远程进程中 , 然后将写出后数据的首地址 , 设置到 pid_t pid 进程号对应的远程进程的 ESP 寄存器中 , 设置的数据长度 4 字节 */ptrace_writedata(pid, (uint8_t*)(void*)regs->esp, (uint8_t*)params, (num_params) * sizeof(long));}/* 设置一个 0 地址 */long tmp_addr = 0x00;/* 设置 0 地址的作用是 保证 远程进程 访问该 0 地址 导致崩溃 , 调试工具收回进程控制权 */regs->esp -= sizeof(long);ptrace_writedata(pid, (uint8_t*)(regs->esp), (uint8_t*)&tmp_addr, sizeof(tmp_addr));/* 设置 EIP 寄存器值 , 存储 CPU 下一条将要执行的指令 */regs->eip = addr;/* 设置 pid 远程进程的寄存器值 */if (ptrace_setregs(pid, regs) == -1|| ptrace_continue(pid) == -1) {printf("error\n");return -1;}/* 等待远程调用执行完毕 */int stat = 0;waitpid(pid, &stat, WUNTRACED);while (stat != 0xb7f) {if (ptrace_continue(pid) == -1) {printf("error\n");return -1;}waitpid(pid, &stat, WUNTRACED);}return 0;
}

【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )相关推荐

  1. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )

    文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...

  2. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )

    文章目录 一.mmap 简介 二.mmap 函数作用 一.mmap 简介 mmap 函数的作用是 将 文件 映射到 内存中 , 映射的单位必须是 PAGE_SIZE ; mmap 函数引入头文件 : ...

  3. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )

    文章目录 一.dlsym 函数简介 二.获取 目标进程 linker 中的 dlsym 函数地址 三.远程调用 目标进程 linker 中的 dlsym 函数 获取 注入的 libbridge.so ...

  4. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 linker 中的 dlopen 函数地址 并 通过 远程调用 执行该函数 )

    文章目录 一.dlopen 函数简介 二.获取 目标进程 linker 中的 dlopen 函数地址 三.远程调用 目标进程 linker 中的 dlopen 函数 一.dlopen 函数简介 dlo ...

  5. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具收尾操作 | 关闭注入的动态库 | 恢复寄存器 | 脱离远程调试附着 )

    文章目录 一.dlclose 函数简介 二.关闭注入的 libbridge.so 动态库 三.恢复寄存器 四.脱离远程调试附着 一.dlclose 函数简介 dlclose 函数的作用是 卸载一个 指 ...

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

    文章目录 一.调试进程 ATTACH 附着目标进程 二.读取目标函数寄存器值并存档 1.主要操作流程 2.ptrace 函数 PTRACE_GETREGS 读取寄存器值 一.调试进程 ATTACH 附 ...

  7. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )

    文章目录 一.获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 二.从 /proc/pid/maps 文件中获取 指定 进程 中的 /system/l ...

  8. python执行系统命令后获取返回值的几种方式集合

    第一种情况 os.system('ps aux') 执行系统命令,没有返回值 第二种情况 result = os.popen('ps aux') res = result.read() for lin ...

  9. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具的 main 函数分析 )

    文章目录 一.注入流程 二.注入工具的 main 函数分析 一.注入流程 开始分析 [Android 逆向]Android 进程注入工具开发 ( 编译注入工具 | 编译结果文件说明 | 注入过程说明 ...

最新文章

  1. python自定义库文件路径
  2. LINUX内核经典面试题30道及解答
  3. 反思专注力:重视专注;转变认知;避开即时娱乐;控制专注;氛围想不专注都难
  4. MOSS 2007基础:WSS 3.0 中的母版页(Master Pages)和内容页(Content Pages)
  5. python编写计算器输入1或2代表+或x_Python实现两款计算器功能示例
  6. vue路由参数改变,组件数据没重新更新问题
  7. scala List源码
  8. 解决输入框自动填充账号密码的问题
  9. hsqldb和mysql_HSQLDB的研究与性能测试(与Mysql对比)
  10. BackTrack4——利用***测试保证系统安全
  11. Windows10卸载密钥导致win10未激活--解决
  12. 2019年蓝桥杯省赛B组 C++题解(编程题可提交)
  13. python实训目的意义_Python-暑期实训day 1
  14. dellnas存储服务器型号,Dell Storage NX系列NAS存储
  15. 【NISP一级】3.2 防火墙
  16. CAD中角度如何平分、CAD特性匹配的作用是什么?
  17. php mailer altbody,PHP_phpmailer 中文使用说明(简易版),phpmailer v5.1下载 A开头: $AltBody - phpStudy...
  18. 戴尔微型计算机3048,戴尔5460一体机拆解,戴尔3048一体机
  19. 计算机省一级b类模拟试题,江苏省计算机一级模拟试题及答案
  20. Python画各种樱花

热门文章

  1. some language grammars
  2. SugarCRM 主表-自定义字段
  3. C# T 泛型类,泛型方法的约束条件用法
  4. ALV添加文字输入框
  5. And it's over,And it's a new start
  6. 《Algorithm算法》笔记:元素排序(2)——希尔排序
  7. microsoft visual sourcesafe explorer 获取不了文件夹的解决方法
  8. 炎炎夏日需要一个清凉的地 - 自制水冷系统
  9. 郑州5月份的windows phone7小聚
  10. 也跟90后小朋友聊聊