浅谈ARM上的PTRACE(2)

本文是关于ARM平台使用PTRACE实现非syscall函数hook的续篇,介绍了如何通过Ptrace Attach找到目标函数代码,修改相应指令以改变函数行为,从而达到hook目的。在测试中成功实现了不打印'Sub call'并直接返回2的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

0x0 前言

接上篇<浅谈ARM上的Ptrace>http://blog.youkuaiyun.com/py_panyu/article/details/45397253.

上次实现了hooksyscall调用,这次实现一把非syscall函数的hook,原理请参考上篇.直接分析代码过程

 

0x1 实现原理

 

//target.c
#include <stdio.h>
         
int flag = 1;
int sub()
{
    printf("Sub call.\n");
    return 1;
}
         
int main(int argc,char* argv[])
{   
    while(flag)
    {
        printf("Sub return:%d\n", sub());
        sleep(3);
    }
    return 0;
}

 

 

我们现在要做的就是修改sub函数,不打印Sub call,直接返回2.思路就是用Ptrace Attach后,找到函数代码,修改相应的代码.现在用IDA看看编译出来的target.解析后因为thumb和arm指令无法区分,所以出现了解析问题,手动修正后如下:

 

 

 

我们只要把0x8532后的代码修改成如下代码就能完成hook~

 

MOVS R0,#2
POP {R3,PC}

 

 

那么如何将汇编代码转换成opcode呢?

 

 

 

//trace.c
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/syscall.h>

int long_size = sizeof(long);

void putdata(pid_t pid,long addr,char* str,int len)
{
	char* laddr;
	int i = 0;
	int j = 0;
	union u
	{
		long val;
		char chars[long_size];
	}data;
	j = len / long_size;
	laddr = str;
	while(i < j)
	{
		memcpy(data.chars,laddr,long_size);
		ptrace(PTRACE_POKEDATA,pid,addr+i*4,data.val);
		++i;
		laddr += long_size;
	}
	j = len % long_size;
	if( j != 0)
	{
		memcpy(data.chars,laddr,j);
		ptrace(PTRACE_POKEDATA,pid,addr+i*4,data.val);
	}
	
}

void tracePro(int pid)
{
	int len = 4;
	char opcode[] = "\x02\x20\x08\xBD";
	putdata(pid,0x8532,opcode,len);
}


int main(int argc,char* argv[])
{
	pid_t trace_process;
	int status;
	trace_process = atoi(argv[1]);
	if(ptrace(PTRACE_ATTACH,trace_process,NULL,NULL) != 0)
	{
		printf("trace process failed:%d\n",errno);
		return 1;
	}
	tracePro(trace_process);
	ptrace(PTRACE_DETACH,trace_process,NULL,NULL);
	return 0;
}

 

 

0x2 测试结果


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值