-
-
[原创]Android 进程系统调用劫持
-
发表于:
2013-10-23 21:21
21635
-
标 题: 【原创】Android 进程系统调用劫持
作 者: 蟑螂一号
时 间: 2013-10-23,21:11:03
android系统是基于linux系统的。在android中也可以像Linux系统那样通过ptrace系统调用,劫持远程进程调用的系统调用,并修改系统调用的调用参数。可以访问博客:http://blog.csdn.net/SilentVoid/article/details/1477439详细了解ptrace,该博客是针对x86平台的ptrace调用介绍。
今天研究了一下android系统上通过ptrace劫持系统调用,将代码分享一下,不足之处,请多多指教。
//ptrace_test.c
#include <sys/ptrace.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/syscall.h>
#include <android/log.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
#define TAG “ptrace”
//调用函数声明
static void help(int arc,char *argv[]);
//监控系统调用
static void monitor_syscall(pid_t pid);
//获取监控进程系统调用编号
long get_syscall_no(int pid, struct pt_regs *regs);
void main(int argc, char *argv[])
{
if(argc != 2) {
help(argc,argv);
return ;
}
pid_t target_pid;
int status;
target_pid= atoi(argv[1]);
if(target_pid<0)
{
__android_log_print(ANDROID_LOG_DEBUG,TAG,”invalid process pid”);
return ;
}
if(0 != ptrace(PTRACE_ATTACH, target_pid, NULL, NULL))
{
__android_log_print(ANDROID_LOG_DEBUG,TAG,”ptrace attach error:%s”,strerror(errono));
return ;
}
__android_log_print(ANDROID_LOG_DEBUG,TAG,”start monitor process:%d”,target_pid);
while(1)
{
wait(&status);
if(WIFEXITED(status))
{
break;
}
monitor_syscall(target_pid);
ptrace(PTRACE_SYSCALL, target_pid, NULL, NULL);
}
ptrace(PTRACE_DETACH, target_pid, NULL, NULL);
__android_log_print(ANDROID_LOG_DEBUG,TAG,”monitor finished”);
}
static long get_syscall_no(int pid, struct pt_regs *regs)
{
long sys_no = 0;
ptrace(PTRACE_GETREGS, pid, NULL, regs);
sys_no= ptrace(PTRACE_PEEKTEXT, pid, (void *)(regs->ARM_pc - 4), NULL);
if(sys_no== 0)
return -1;
if (sys_no== 0xef000000) {
sys_no= regs->ARM_r7;
} else {
if ((sys_no& 0x0ff00000) != 0x0f900000) {
return -1;
}
sys_no&= 0x000fffff;
}
return sys_no;
}
static void monitor_syscall(pid_t pid)
{
long sys_no=0;
struct pt_regs regs;
sys_no= get_syscall_no(pid, ®s);
if(sys_no<=0)
{
__android_log_print(ANDROID_LOG_DEBUG,TAG,”get syscall no error”);
}
else if(sys_no== __NR_ioctl)
{
//处理监控的系统调用
__android_log_print(ANDROID_LOG_DEBUG,TAG,”monitor ioctl syscall”);
}else
{
//其他系统调用劫持
}
//
}
static void help(int arc,char *argv[])
{
__android_log_print(ANDROID_LOG_DEBUG,TAG,”Please use :%s pid ”,argv[0]);
}
//Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := monitor
LOCAL_SHARED_LIBRARIES:=\
liblog\
libcutils
LOCAL_SRC_FILES := $(call all-subdir-c-files)
include $(BUILD_EXECUTABLE)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)