zoukankan      html  css  js  c++  java
  • android 限制adb的访问目录

    最近有个特殊的要求,engneer版本既要可以adb访问,且adb有的目录不能访问 如/data/目录。

    用传统的chmod chgrp等无法满足客户需求,只能修改内核文件系统部分。 添加函数,检查路径的合法性

    主要是修改内核函数do_path_lookup (namei.c):

    static  int is_valid_path(char * pathname, char * pname)
    {
         int plength = strlen(pname);
         int pathlength = strlen(pathname);
         int errorno=-1;
         int i=0; 
         char buf[6][50]={"","/","./","../","../../","../../../"};
    
         if (pathlength >  plength)
         {
             printk(" pathlength >  pname
    "); 
             return 0;
         }
         for (i=0;i<6;i++)
         {       
                printk("i is %d 
    ",i);
                strcat(buf[i],pathname);
                char * buftemp=buf[i];
    	    printk("shit buftemp is %s 
    ",buftemp);
                int buftemplength=strlen(buftemp);
    	    if ( buftemplength !=  plength)
               {
                     continue;
               }
                if(!strcmp(buftemp,pname))
                {
                      return  errorno;
                }
         }
         return 0;
    }
    /* Returns 0 and nd will be valid on success; Retuns error, otherwise. */
    static int do_path_lookup(int dfd, const char *name,
    				unsigned int flags, struct nameidata *nd)
    {
    
           int retval = 0;
     
           int errorno=-1;
           	if (strcmp("sh", current->comm)) //当前进程的名字
    	{
    	      goto normal;
    	}
             	if (strcmp("adbd", current->real_parent->comm)) // 进程父亲的名字
    	{
    	     
    	      goto normal;
    	}
    	
           // white list  adb 要支持运行需要这些库的支持,故直接跳过
           if(!strncmp("/system/lib",name,strlen("/system/lib")))
           {
                  goto  normal;
           }     
            // 这里只是限制/data 和 /system 目录,直接返回错误    
             // 应用层则认为找不到这个目录或文件
           if (is_valid_path("data",name))
    	{
    	    return errorno;
    	}
    	if (is_valid_path("system",name))
    	{
    	    return errorno;
    	}
    		      
      normal:
    	retval = path_init(dfd, name, flags, nd);
    	if (!retval)
    		retval = path_walk(name, nd);
    	if (unlikely(!retval && !audit_dummy_context() && nd->path.dentry &&
    				nd->path.dentry->d_inode))
    		audit_inode(name, nd->path.dentry);
    	if (nd->root.mnt) {
    		path_put(&nd->root);
    		nd->root.mnt = NULL;
    	}
    	return retval;
    }
    


  • 相关阅读:
    NTFS的交换数据流ADS应用
    解决binwalk运行提示缺少LZMA模块
    蓝牙扫描工具btscanner修复暴力扫描模式
    iOS 11开发教程(二十)iOS11应用视图美化按钮之设置按钮的状态
    Visual Studio 2017 版本 15.5.5
    iOS 11开发教程(十九)iOS11应用视图美化按钮之设置按钮的外观
    jquery的基本api
    vue知识点总结
    历史记录
    http加密原理
  • 原文地址:https://www.cnblogs.com/pangblog/p/3347824.html
Copyright © 2011-2022 走看看