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 测试结果