//weibo: @少仲
0x0 前言
接上篇<淺談ARM上的Ptrace>http://blog.csdn.net/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;
}