ADB加密实例

news2024/12/22 15:22:50

ADB加密实例

  • 1. adb shell加密访问
  • 2 adb文件传输命令加密访问

通常我们的MIFI USB端口仅枚举rndis和mass端口,为了便于开发人员、工厂维护人员调试和运营商认证,会预留出可通过SCSI指令切口支持ADB端口,该机制可能会被作为切入点破解侵入系统,对于系统安全存在极大风险。因此我们需要对adb访问进行加密控制。
adb的指令在 ADB介绍也进行了列举,有应用管理、文件管理、日志管理、设备管理等,而MIFI产品常用的主要是文件管理和日志管理。因此我们按照Penetration Test要求,对于常用adb操作进行加密处理。

1. adb shell加密访问

最常使用的就是通过adb shell去访问adb设备终端,可以在终端中进行文件访问、应用管理、日志管理等操作,因此对于该指令需进行加密操作。

X12中adb源码位置在sdx12-ap/system/core/adb/,在使用adb shell命令登陆系统时,adb服务(adbd)为我们fork一个子shell作为终端,源码如下:

system\core\adb\services.cpp
#define SHELL_COMMAND "/bin/sh"static int create_subproc_thread(const char *name, const subproc_mode mode)
{switch (mode) {
    case SUBPROC_PTY:
        ret_fd = create_subproc_pty(SHELL_COMMAND, arg0, arg1, &pid);
        break;
    case SUBPROC_RAW:
        ret_fd = create_subproc_raw(SHELL_COMMAND, arg0, arg1, &pid);
        break;
    default:
        fprintf(stderr, "invalid subproc_mode %d\n", mode);
        return -1;
    }
    D("create_subproc ret_fd=%d pid=%d\n", ret_fd, pid);
    stinfo* sti = reinterpret_cast<stinfo*>(malloc(sizeof(stinfo)));
    if(sti == 0) fatal("cannot allocate stinfo");
    sti->func = subproc_waiter_service;
    sti->cookie = (void*) (uintptr_t) pid;
    sti->fd = ret_fd;
    if (adb_thread_create(&t, service_bootstrap_func, sti)) {
        free(sti);
        adb_close(ret_fd);
        fprintf(stderr, "cannot create service thread\n");
        return -1;
    }}

因此我们可以将shell替换成可登陆的shell应用,如/bin/login,该应用便可以实现用户名和密码登录,用户名和密码均来自于sdx12-ap/poky/meta-qti-bsp/recipes-core/base-passwd/base-passwd-3.5.29/add-hash.patch,该patch中包含了用户名、密码、密码加密方式等,最终会生成按照冒号分隔的9段密码规则的字段存储在文件/etc/shadow中,当前linux默认的用户名是root、密码是oelinux123、密码加密方式是MD5。

我们修改#define SHELL_COMMAND "/bin/sh"为#define SHELL_COMMAND “/bin/login”,即可实现adb登录访问,编译验证如下:

C:\platform-tools>adb shell
sdxnightjar login: root
Password:
Last login: Wed Aug  9 11:28:44 UTC 2023 on pts/0
No directory, logging in with HOME=/
~ #

adb shell加密访问是生效的。但每次都需要输入账号密码是比较麻烦的,由于账户名是默认不变的,因此我们将账户名在adb中固定,每次只需要输入密码即可。

system\core\adb\services.cpp
**#define SHELL_COMMAND "/bin/login"**static int create_subproc_thread(const char *name, const subproc_mode mode)
{switch (mode) {
    case SUBPROC_PTY:
        **ret_fd = create_subproc_pty(SHELL_COMMAND, "-p", "root", &pid);**
        break;
    case SUBPROC_RAW:
        **ret_fd = create_subproc_raw(SHELL_COMMAND, "-p", "root", &pid);**
break;
    default:
        fprintf(stderr, "invalid subproc_mode %d\n", mode);
        return -1;
    }
    D("create_subproc ret_fd=%d pid=%d\n", ret_fd, pid);
    stinfo* sti = reinterpret_cast<stinfo*>(malloc(sizeof(stinfo)));
    if(sti == 0) fatal("cannot allocate stinfo");
    sti->func = subproc_waiter_service;
    sti->cookie = (void*) (uintptr_t) pid;
    sti->fd = ret_fd;
    if (adb_thread_create(&t, service_bootstrap_func, sti)) {
        free(sti);
        adb_close(ret_fd);
        fprintf(stderr, "cannot create service thread\n");
        return -1;
    }}

编译验证:

C:\platform-tools>adb shell
Password:
Last login: Wed Aug  9 11:28:58 UTC 2023 on pts/0
No directory, logging in with HOME=/
~ #

在这里插入图片描述

2 adb文件传输命令加密访问

上述章节仅限制了adb shell功能,adb其他功能是没有受到限制的,如adb push\pull等文件传输命令。为了对常用指令进行加密控制,我们设计了如下机制:

  1. 当/etc/lock_flag 内容为 lock 时,禁用 adb shell 功能。当此文件内容为空或文件不存在时,启用adb shell。
  2. 当/etc/adb_flag文件存在时,启用adb shell。 oem_stop_service_list()函数中通过字符串判断定义了当 adb shell 禁用时具体哪些功能会被禁用。
  3. adb指令下发 ->service_to_fd() ->oem_shell_access()判断是否为adb激活,检测到maigc字符串则赋 g_access_adb = ACCESS_ADB ->oem_security_access_adb()判断lock_flag 和 adb_flag,若配置了lock则oem_stop_service_list()判断当前功能是否在禁用列表中,若配置在禁用列表中则退出。具体代码如下:
 int service_to_fd(const char *name)
{
    int ret = -1;

    D("service_to_fd:%s\n", name);

    //for debug, we send a magic string to access shell
    if(!HOST && !strncmp(name, "shell:", 6))
    {
        //backdoor for this
        **oem_shell_access(name);**
    }

    **int running_flag = oem_security_access_adb();
    if (running_flag == 0)
    {
        int stop_list = oem_stop_service_list(name);
        if (stop_list == 1)
        {
            return -1;
        }**
}}

oem_shell_access()判断是否为adb激活:

int oem_shell_access(const char *name)
{
    initkey();

    //it means "access_0x45000000000000000000000000000023"
    //for debug, we use command "adb shell access_7aa72119ca08fc7809663a4f4f8b10f64c2aaa4e" to access shell
    const char *f_magic = "f04542f6f73a355bf541f44443f5f04cf148f6fc4443424b41fdf7434148f242f6464df140f44743464af445434141f6";
    const char *magic = decrypt(f_magic);

    const char *p = strstr(name, magic);
    if (p != NULL)
    {
        g_access_adb = ACCESS_ADB;
        return 0;
    }

    return -1;
}

oem_security_access_adb()判断lock_flag 和 adb_flag,若配置了lock则oem_stop_service_list()判断当前功能是否在禁用列表中

int oem_security_access_adb(void)
{initkey();
    //we can acess adb when sending a magic string
    if (g_access_adb == ACCESS_ADB)
    {
        return 1;
    }
    //protect the strings for security, it can't get information from decompiling 
    //it is "/etc/lock_flag"
    const char *f_encname = "011c5c18071545524260111203521f18084b5a424154014d0e5c530f3e605b5656";
    const char *file_name = decrypt(f_encname);
    // adb push and adb pull service is still running.
    // we can push a file to overwrite adb_flag, so we can access the shell, this is a backdoor.
    // we need to add a file by git to add this function. 
    // I think it isn't a goog way to read the factory.db at here.
    // read etc/lock_flag
    r = oem_read_txt_file(file_name, buf, sizeof(buf));
    if (r > 0)
    {
        //if we find some info like "lock", we will disable adb shell
        const char *f_key = decrypt("11696f171a");
        const char *findstr = strstr(buf, f_key);   //f_key="lock"
        if (findstr != NULL)
        {
            D("stop adb running for security\n");
            return 0;
        }
    }
    else
    {
        //read failed or empty file, we will start adb shell
        D("adb running for security\n");
        return 1;
    }
    //we start adb by default
    D("adb running by default\n");
    return 1;
}

禁用列表中仅添加了一些常用的指令,若有其他需求,可以增删。

int oem_stop_service_list(const char *name) 
{     
	//it means "adb shell" "adb shell xxxx" "exec" "backup" "restore" was disabled     
	//thoes service will be closed     
	if(!strncmp(name, "tcp:", 4))     
	{
	         D("service tcp can't access\n");
	         return 1;     
	}     
	if(!HOST && !strncmp(name, "shell:", 6))if(!HOST && !strncmp(name, "exec:", 5))if(!strncmp(name, "backup:", 7))if(!strncmp(name, "restore:", 8))if(!strncmp("dev:", name, 4))if(!strncmp(name, "sync:", 5))if(!strncmp(name, "remount:", 8))if(!strncmp(name, "unroot:", 7))if(!strncmp(name, "root:", 5))if(!strncmp(name, "tcpip:", 6))if(!strncmp(name, "usb:", 4))if(!strncmp(name, "reverse:", 8))if(!strncmp(name, "disable-verity:", 15))if(!strncmp(name, "enable-verity:", 15))if(!strncmp(name, "push:", 5))if(!strncmp(name, "pull:", 5))return 0; 
}

全部功能代码patch如下:ADB加密实例patch

编译验证:

  1. Lock前,可以随意使用adb访问shell终端和传输文件等:
    在这里插入图片描述
    创建标志位,lock adb
    在这里插入图片描述
  2. lock后,adb shell、push、pull等在禁用列表中的指令均无法访问
    在这里插入图片描述
  3. 使用magic指令解锁,然后可以访问禁用列表中的指令如adb shell、push\pull等
    在这里插入图片描述

adb加密功能完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1139552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OA管理系统源码

OA管理系统源码 功能介绍 1、个人办公 a、内部邮件&#xff08;写邮件&#xff0c;收邮件&#xff0c;草稿箱&#xff0c;已删除&#xff0c;已发送&#xff09; b、Internet邮件&#xff08;写邮件&#xff0c;收邮件&#xff0c;草稿箱&#xff0c;已发送&#xff0c;已删…

Java实现人脸识别和指纹认证

我们在开发中经常会有人脸识别的需求&#xff0c;今天就实现一个简单的人脸识别&#xff0c;调用的第三方SDK服务 0.先去注册服务 登录网址 虹软视觉开放平台—以免费人脸识别技术为核心的人脸识别算法开放平台 点击进行注册 进入之后新增我的服务 成功之后点击首页人脸识别…

《SpringBoot项目实战》第一篇—接口参数的一些弯弯绕绕

系列文章导航 第一篇—接口参数的一些弯弯绕绕 第二篇—接口用户上下文的设计与实现 第三篇—留下用户调用接口的痕迹 第四篇—接口的权限控制 第五篇—接口发生异常如何统一处理 本文参考项目源码地址&#xff1a;summo-springboot-interface-demo 前言 大家好&#xff01;…

MessageQueue 深入理解Android卷2 学习笔记

MessageQueue类封装了与消息队列有关的操作&#xff0c;一个以消息驱动的系统中&#xff0c;最重要部分就是消息队列和消息处理循环。 MessageQueue的核心代码在native层&#xff0c;可以处理java和native的事件 1.1MessageQueue创建 构造方法&#xff0c;调用nativeInit fra…

外网访问|SD-WAN跨境网络专线助力企业摆脱网络困境

在如今国际市场的大趋势下&#xff0c;跨境访问和沟通对于外贸企业来说至关重要&#xff0c;国际市场的竞争越来越激烈&#xff0c;外贸企业需要与全球各地的合作伙伴、客户和供应商保持紧密的跨境访问和沟通。而在解决跨境网络困境方面&#xff0c;MPLS、VPN和SD-WAN是常见的选…

CVE漏洞复现-CVE-2023-38831 WinRAR代码执行漏洞

CVE-2023-38831 WinRAR代码执行漏洞 WinRAR介绍 WinRAR 是一款功能强大的压缩包管理器&#xff0c;它是档案工具RAR在 Windows环境下的图形界面。 该软件可用于备份数据&#xff0c;缩减电子邮件附件的大小&#xff0c;解压缩从 Internet 上下载的RAR、ZIP及其它类型文件&…

装了固态硬盘Win10开机很慢的解决方法

在Win10电脑中&#xff0c;用户反映自己装了固态硬盘后&#xff0c;电脑开机变得很慢&#xff0c;想知道解决此问题的方法。接下来小编给大家详细介绍关于解决装了固态硬盘Win10电脑开机很慢的问题&#xff0c;解决后Win10电脑开机速度就能变得更快。 装了固态硬盘Win10开机很慢…

【速看】如何通过合理的封装,让你的自动化脚本更上一层楼!

1. 前言 上一篇推文利用一个在图片范围内实现随机坐标点击的例子&#xff0c;去教会大家如何将自己想要的效果实现出来&#xff0c;受到大家的热情反响&#xff0c;在我们官方讨论群中&#xff0c;还有大佬对我们的示例代码进行优化改进&#xff0c;做了很多合理的函数封装&…

B链圆桌派 — 创新的去中心化存储网络 BNB GREENFIELD 主网上线

B链圆桌派 主題: BNB GREENFIELD主网上线 - 创新的去中心化资料储存网路 日期: 10/19, 8 pm utc8 頻道&#xff1a; BNB Chain 华语电报群 ○ AMA环节 ○ BNB GREENFIELD主网上线 一、回复主持人问题 嘉宾回答主持人提出的问题。本环节请大家保持安静&#xff0c;专注嘉宾…

Flink CDC 2.0 主要是借鉴 DBLog 算法

DBLog 算法原理 DBLog 这个算法的原理分成两个部分&#xff0c;第一部分是分 chunk&#xff0c;第二部分是读 chunk。分 chunk 就是把一张表分为多个 chunk&#xff08;桶/片&#xff09;。我可以把这些 chunk 分发给不同的并发的 task 去做。例如&#xff1a;有 reader1 和 re…

Windows详细安装和彻底删除RabbitMQ图文流程

RabbiitMQ简介 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff1a;Advanced Message Queue Protocol&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而聚类和故障转移是构建在开放…

Redis -- 基础知识3 数据类型及指令

FLUSHALL:清空所有键值对操作(最好别搞,删库要被绳之以法的) 1.string类型 1.介绍 1.redis的字符串,直接按照二进制进行存储,所以可以存储任何数据,取出时不需要转码 2.redis的string类型,限制大小最大为512M,因为为单线程模型为了操作短平快 2.操作 1.set与get set key value …

财务数字化转型是什么?_光点科技

财务数字化转型是当今企业发展中的一项关键策略&#xff0c;旨在借助先进的数字技术&#xff0c;重新塑造和优化财务管理体系&#xff0c;以适应迅速变化的商业环境。这一转型不仅仅是技术的升级&#xff0c;更是对企业财务理念和流程的全面升级和改革。 财务数字化转型的核心在…

【Java】Java开发环境搭建

Java开发环境搭建 文章目录 Java开发环境搭建1. Java开发环境搭建1.1 什么是JDK、JRE1.2 JDK的下载1.3 JDK的安装1.4 配置path环境变量1.4.1 理解path环境变量1.4.2 JDK8配置&#xff1a;配置JAVA_HOMEpath1.4.3 JDK17配置方案&#xff1a;自动配置 1. Java开发环境搭建 1.1 什…

掌握CSS Flexbox,打造完美响应式布局,适配各种设备!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 基…

磁盘监控:告警时发送邮件

1.配置邮箱 1.编辑邮箱配置文件 vim /etc/mail.rc2.在末尾输入自己的邮箱配置&#xff0c;以163邮箱为例 #开启ssl set ssl-verifyignore #证书目录&#xff0c;下方为centos系统证书默认位置&#xff0c;也自行生成证书并指定 set nss-config-dir/etc/pki/nssdb # 配置的第…

Windows 11 如何同步文件到OneDrive ?

Windows 11 中的 OneDrive OneDrive 默认内置于 Windows 11系统中。Windows 11从设置中删除了原来的两种备份方法并添加了OneDrive。更重要的是&#xff0c;微软在设置中添加了OneDrive Sync&#xff0c;以取代设置中的备份功能。 您可以使用 OneDrive 在计算机和云之间同步文…

【Leetcode】200. 岛屿数量

给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网格的四条边…

【信创】 银河麒麟 软件目录及 常见问题汇总(持续更新)

1. 官方问题列举常见问题 常见问题国产操作系统、银河麒麟、中标麒麟、开放麒麟、星光麒麟——麒麟软件官方网站 2. 官方资源池目录 Index of /kylin/KYLIN-ALL/pool/ 如 gcc 的安装依赖 deb包目录&#xff1a; 3. 麒麟系统各版本 软件源使用方法

70 搜索插入位置

搜索插入位置 题解1 二分查找防越界写法 题解2 STL大法两行 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c; 并返回其索引。如果目标值不存在于数组中&#xff0c; 返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O ( l o g n ) O(log n…