• 【移动安全基础篇】——29、Android源码定制添加反反调试机制


    1. Kernel proc
    内核修改
    检测都是通过 proc 进行的,因此我们需要从 proc 入手
    要修改的数据:
    /fs/proc/base.c、/fs/proc/array.c
    要修改对以下文件的写入:
    status, stat
    修改点:

    base line:285
    else{
        if(strstr(svmname, “trace”)){
            return sprint(buffer, “%s”, “sys_epoll_wait”);
        }
        return sprint(buffer, “%s”, symname);
    }
    array line: 134
    static const char * const task_state_array[] = {
        “R (running)”, /* 0*/
        “S (sleeping)”, /* 1*/
        “D (disk sleep)”,  /* 2*/
        “S (sleeping)”, /* 4*/
        “S (sleeping)”, /* 8*/
        “Z (zombie)”, /* 16*/
        “X (dead)”,  /* 32*/
        “x (dead)”,  /* 64*/
    array line 187
    “Gid:	%d	%d	%d	%d
    ”,
        get_task_state(p),
        task_tgid_nr_ns(p, ns),
        pid_nr_ns(pid, ns),
        ppid, /*tpid*/0,
        cred->uid, cred->euid, cred->suid, cred->fsuid
        cred->gid, cred->egid, cred->sgid, cred->fsgid);

    修改完成后,编译内核,刷入系统
    2. Demo 

    导入内核源代码

    定位到/fs/proc/base.c 文件中找到 status 相关的方法

    status 文件中的信息如下图

    task_name 方法

    task_state 方法

    想把status数据中的状态信息进行修改的话就要修改task_status_array内容( 修改点一),这样便绕过了 State

    对 TracePid 进行绕过:TracePid 通常都是对父进程 pid 进行检测,这里将 ppid 改为 0,这样不管是否为调试状态,TracePid 都无法检测出

    定位到 Stat 相关方法

    Stat 文件中存放着用户属性的简短描述符

    跳转到 do_task_start 方法

    定位到写数据的相关代码

    找到 state 的位置

    跳转到 state 被赋值的地方

    get_task_state 方法

    修改相应的 state 数据就会绕过检测

    对 wchan 文件的修改

    whan 文件如果是在调试过程中会变成 Trace 数据

    结果验证

    总会有不期而遇的温暖. 和生生不息的希望。
  • 相关阅读:
    22.json&pickle&shelve
    22.BASE_DIR,os,sys
    21.time和random
    21.模块的执行以及__name__
    21.python的模块(Module)和包(Package)
    21. 对文件进行查询修改等操作
    20.装饰器和函数闭包
    19.python基础试题(三)
    19.生产者消费者模型
    19.yield和send的区别
  • 原文地址:https://www.cnblogs.com/devi1/p/13486417.html
Copyright © 2020-2023  润新知