Android 逆向Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )相关的知识,希望对你有一定的参考价值。

前言

在之前的博客

中 , 介绍了 调试进程 远程调用 远程进程 的 libc.so 动态库中的 mmap 函数 , 本博客继续对该远程调用过程进行一些补充 ;





一、x86 架构的返回值获取



远程调用 返回值获取 :

在 x86 架构的 CPU 中 , 使用 EAX 寄存器记录返回值 , 在 ARM 架构的 CPU 中 , 使用 R0 寄存器记录返回值 ;

远程调用结束后 , 获取寄存器数据 , 并读取 EAX 寄存器值 ;

如果远程调用的函数的返回值为 void , 那么 EAX 寄存器存放的就是无意义的值 , 可能是上一个函数的返回值 , 可能是计算过程中的一个中间值 ;





二、ARM 架构远程调用



在 ARM 架构的 CPU 中 , 远程调用时 ,

  • 使用 SP 寄存器存放栈内存首地址 ,
  • 使用 PC 指针指向函数地址 , 下一条指令开始执行函数指令 ;

ARM 架构中 , 栈指针存放在 R4 寄存器中 , 但是远程调用时 , 需要使用 SP 寄存器存放栈指针 , 栈指针指向使用 mmap 分配的内存中 , 该内存中都是函数执行需要的参数 ;

R4 栈指针指向的栈内存有原来函数执行的数据 , 参数或者函数执行过程中的数据 , 这个数据不能动 , 如果修改了该数据 , 调试结束后 , 运行原来的程序 , 会造成不可预知的结果 , 或者崩溃 , 或者运行结果错误 ;

	//  
	// push remained params onto stack  
	//  
	if (i < num_params) {
		regs->ARM_sp -= (num_params - i) * sizeof(long);
		ptrace_writedata(pid, (void*)regs->ARM_sp, (uint8_t*)&params[i], (num_params - i) * sizeof(long));
	}

准备好参数栈后 , 将 PC 寄存器指向函数的地址 ;

要判定是否是 thumb 模式 , 如果在该模式下 , 需要将 PC 指针最低位取反 ;

thumb 模式下 , 不能指向奇数地址 , 如果最低位是 1 , 则将其置位 0 ; 如果最低位为 1 , 执行时会报总线错误 ;

thumb 模式下 , 需要将 CPSR 寄存器打开 , 设置 CPSR_T_MASK 标志位 ;

	regs->ARM_pc = addr;
	if (regs->ARM_pc & 1) {
		/* thumb */
		regs->ARM_pc &= (~1u);
		regs->ARM_cpsr |= CPSR_T_MASK;
	}
	else {
		/* arm */
		regs->ARM_cpsr &= ~CPSR_T_MASK;
	}

返回值设置为 0 ;

设置该返回值的作用是 , 为了使 远程进程崩溃 , 调试程序 可以收回控制权 ;

	regs->ARM_lr = 0;

上述操作的寄存器值是在本地设置的 , 通过 ptrace_setregs 函数 , 才能将寄存器值设置到远程进程中 ;

寄存器设置完毕后 , 调用 ptrace_continue 函数 , 恢复 远程进程的运行 ;

	if (ptrace_setregs(pid, regs) == -1
		|| ptrace_continue(pid) == -1) {
		printf("error\\n");
		return -1;
	}

以上是关于Android 逆向Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 进程注入工具开发 ( 编译注入工具 | 编译结果文件说明 | 注入过程说明 )

Android 逆向Android 进程注入工具开发 ( 远程调用总结 | 远程调用注意事项 )

Android 逆向Android 进程注入工具开发 ( SO 进程注入环境及 root 权限获取 | 进程注入时序分析 )

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

Android 逆向Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )

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