adbkey相关知识,以及利用它进行权限控制

前言


用adb调试android设备的时候,第一次连接的时候会出现一个授权提示:

error: device unauthorized. Please check the confirmation dialog on your device.

这时候在android设备上会出现一个提示框,让用户确认是否允许PC进行调试
那么这个过程中发生了什么呢? 往下看

工作原理


当我们在PC上启动adb进程的时候,adb进程会在本地生成一对秘钥 adbkey 和 adbkey.pub
根据弹框提示 The computer’s RSA key fingerprint is:xxx ,可以看出是一对RSA算法的秘钥,其中公钥是来发送给android设备的.

当你执行 adb shell 的时候,adb进程会将PC上的adbkey.pub发送给android设备;这个时候如果android上已经保存了这台PC的adbkey.pub ,则连接成功,如果没有保存则会出现弹框,当你点击允许之后android设备就会保存PC的 adbkey.pub

adbkey存放位置


  • android设备 : /data/misc/adb/adb_keys // 将PC的adbkey.pub 拷贝并且重命名而来
  • windows: C:\Users\Administrator\.android\adbkey
  • Linux: ~/.android/adbkey

用adbkey进行权限控制

在android设备里面内置一组 adb_keys ,这样用于该adb_keys的PC才能进行调试
需要修改源码:

  1. frameworks/base/services/usb/java/com/android/server/usb/UsbDebuggingManager.java
                case MESSAGE_ADB_CONFIRM: {
                    if ("trigger_restart_min_framework".equals(
                            SystemProperties.get("vold.decrypt"))) {
                        Slog.d(TAG, "Deferring adb confirmation until after vold decrypt");
                        if (mThread != null) {
                            mThread.sendResponse("NO");
                        }
                        break;
                    }
                    // add start
				    if (1 == SystemProperties.getLong("ro.feat.adb_auth_by_key_only", 0)) {
					Slog.e(TAG, "MESSAGE_ADB_CONFIRM:DENY, adbkey error");
					break;		/*下面的代码不进去直接 break*/
					//add end
		    }

                    String key = (String)msg.obj;
                    String fingerprints = getFingerprints(key);
                    if ("".equals(fingerprints)) {
                        if (mThread != null) {
                            mThread.sendResponse("NO");
                        }
                        break;
                    }
                    mFingerprints = fingerprints;
                    startConfirmation(key, mFingerprints);
                    break;
                }
  1. 在device/xxxx/product/system.prop里添加

    ro.feat.adb_auth_by_key_only=1

  2. 在系统跑起来的时候将内置在系统中的adbkey.pub 拷贝为 /data/misc/adb/adb_keys

  3. 注意权限问题,下面为一个示例
    misc_task.sh

# preset adb_keys
if [ -f /system/vendor/res/adb_keys ]; then
       if [ ! -d /data/misc/adb ]; then
               mkdir   /data/misc/adb
               chown   system.shell /data/misc/adb
               busybox chmod 750    /data/misc/adb
               busybox chmod g+s    /data/misc/adb
       fi
       cp -f /system/vendor/res/adb_keys  /data/misc/adb/
       chown  system.shell /data/misc/adb/*
       chmod  640          /data/misc/adb/*
fi

init.project.rc

##run shell scripts in android
service misc_tasks  /system/bin/misc_tasks.sh
	class main
	user root
	group root
	oneshot
	seclabel u:r:misc_tasks:s0
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值