淺談ARM上的PTRACE(2)

//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;
}


0x2 測試結果



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章