需求:
在adb shell登录终端时加入鉴权密码,鉴权开关可配置且密码可修改
问题分析:
见下文Android N:adb及adbd源码分析
解决方案:
思路:pc上终端输入
adb shell
命令后,实际上是adbd守护进程fork出的子进程来执行/bin/sh
,adbd监听usb/tcp输入执行命令,并通过socket将结果回显到pc。
那么我们解决该问题的方法就是在执行/bin/sh
之前加入我们的校验脚本。
1.在/vendor/aw/public/prebuild/bin/tools
下新建ckp.sh:
#!/system/bin/sh
sys_pwd=$(getprop persist.zonecare.adb.pwd)
if [ -z "$sys_pwd" ];then
sys_pwd="admin"
fi
echo "Enter your pwd:"
while :
do
read -r PASSWORD
if [[ $PASSWORD == $sys_pwd ]];then
break
else
echo "please try again:"
fi
done
echo "success!!"
exec /system/bin/sh
2.修改vendor/aw/public/prebuild/bin/tools/Android.mk
3.修改vendor/aw/public/prebuild/bin/tools/tools.mk
*将ckp.sh脚本编译到系统镜像文件,最终会在/system/bin/
下生成ckp.sh
4.给ckp.sh添加权限,修改system/core/rootdir/init.rc
里是开机流程,会自动给ckp.sh文件添加777权限
5.添加配置参数,修改device/softwinner/a40-p1/a40_p1.mk
persist.zonecare.adb.ckp为0时,adb shell校验密码,反之则直接进入终端
persist.zonecare.adb.pwd鉴权密码:默认admin,可修改。
6.修改system/core/adb/shell_service.cpp
效果:
其他平台思路也应该差不多,在/system/bin目录下生成可执行脚本,在shell进终端前执行脚本,校验成功后当前子进程执行/system/bin/sh