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

[原创]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, &regs);
 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期)

收藏
免费 5
支持
分享
最新回复 (7)
雪    币: 524
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
标记一下
2013-10-24 09:03
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
3
lz 可以试着弄个  android 手机平台的  内核调试器.... ptrace移动平台和 linux 看起来使用差别并不大
2013-10-24 10:16
0
雪    币: 67
活跃值: (53)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
看了古河的LibInject,正在研究这一块。其实我的业务系统没有强烈的需求要注入,但总觉得注入比较酷,想学习一下。在我们的系统中,手机是ROOT了的,ROM是修改过源码的,理论上任何API都可以监控。目前想到的唯一理由是注入好像可以跨版本,适应不同的手机。但其实将监控点合到不同版本的Android工作量不大。支持手机的话有了CM也不是很难。
2013-10-24 14:17
0
雪    币: 259
活跃值: (3623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
   ROM是修改过源码的,那监控就方便多了
2013-10-24 14:37
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark下 以后学习
2013-11-7 13:45
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我的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
2015-1-22 16:46
0
雪    币: 228
活跃值: (75)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
[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位的,怎么破??求高人指导,谢谢
2015-11-26 13:37
0
游客
登录 | 注册 方可回帖
返回
//