首页
社区
课程
招聘
[原创]Android 进程系统调用劫持
2013-10-23 21:21 21165

[原创]Android 进程系统调用劫持

2013-10-23 21:21
21165
标 题: 【原创】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)

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞2
打赏
分享
最新回复 (7)
雪    币: 524
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cnppk 2013-10-24 09:03
2
0
标记一下
雪    币: 1149
活跃值: (783)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
ycmint 5 2013-10-24 10:16
3
0
lz 可以试着弄个  android 手机平台的  内核调试器.... ptrace移动平台和 linux 看起来使用差别并不大
雪    币: 65
活跃值: (53)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yaojunhap 2013-10-24 14:17
4
0
看了古河的LibInject,正在研究这一块。其实我的业务系统没有强烈的需求要注入,但总觉得注入比较酷,想学习一下。在我们的系统中,手机是ROOT了的,ROM是修改过源码的,理论上任何API都可以监控。目前想到的唯一理由是注入好像可以跨版本,适应不同的手机。但其实将监控点合到不同版本的Android工作量不大。支持手机的话有了CM也不是很难。
雪    币: 257
活跃值: (3623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
蟑螂一号 1 2013-10-24 14:37
5
0
   ROM是修改过源码的,那监控就方便多了
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
duoniduoni 2013-11-7 13:45
6
0
mark下 以后学习
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
keilin 2015-1-22 16:46
7
0
我的ndk环境也灭有问题阿,为什么我编译不了. 提示错误如下:

~/workspace/android_hook/test/jni$ ndk-build
[armeabi] Executable     : monitor
/home/kei/adt-bundle-linux/android-ndk-r10/platforms/android-L/arch-arm/usr/lib/crtbegin_dynamic.o:crtbrand.c:function _start: error: undefined reference to 'main'
collect2: error: ld returned 1 exit status
make: *** [/home/kei/workspace/android_hook/test/obj/local/armeabi/monitor] Error 1
雪    币: 228
活跃值: (50)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Colbert仔 2015-11-26 13:37
8
0
[QUOTE=keilin;1348250]我的ndk环境也灭有问题阿,为什么我编译不了. 提示错误如下:

~/workspace/android_hook/test/jni$ ndk-build
[armeabi] Executable     : monitor
/home/kei/adt-bundle-linux/android-nd...[/QUOTE]

我也遇到了这个问题,用的ubuntu 64位 ,NDK也是64位的,怎么破??求高人指导,谢谢
游客
登录 | 注册 方可回帖
返回