我正在参加「掘金·启航计划」”
打工人小记安卓内核调试——ADB开关:
秋风明媚,此次定制主板需求逐一完结
天有不测风云
客户发难,遂接一需求,在安卓的设置里面增加功能,开关ADB(默认关闭ADB)\
需求分析
什么是ADB?一种类似于SSH的通信应用层程序,主从架构,用户借助它能调试安卓系统——连接上安卓内核的终端\
adb架构图
adb能帮助app应用开发者,调试(logcat指令,在内核输出应用的具体行为,比如调用了哪个安卓的Service)、安装Or卸载(把编写的应用程序写入到当前的设备)等
什么叫做开关?\
设置-开发者模式
\
就是设置内的选项卡,
解决
需求出现,自然有人解决
精通Linux内核的莫工首先想到的是编译配置
Linux内核是庞大的工程,\
有时候特定的功能,便进行单独配置(如:RT实时操作系统补丁需要开启配置再编译,本质为修改源码根目录的.config文件,里面存放控制编译的变量开关);
有时候特殊的芯片、需要激活原理图(简单的电路图)上对应的线路,需要修改设备树(Linux2.9之后支持)的配置来进行适配。
这里,想让这个电路导通\
去芯片手册查找GND_GPIO对应的芯片\
根据芯片,在设备树上进行配置,给对应的gpio口低电压\
线路就通了
\
内核编译前,通过配置,做你想做的everthing
这个安卓?可以吗
定位、修改makefile,很快莫工定位到控制底层驱动的makefile文件
把图内的adb单词删掉
\
persist.sys.usb.config此配置是用于控制adb,这样,系统默认关闭了adb(这些参数,是安卓自身用于控制服务的开启或关闭,可在安卓终端中使用setprop Or getprop 这对指令来curd这些参数)
(mtp是一种媒体传输协议,也从属于应用层)\
再搭配上系统默认提供的user debug选项卡,算是完成了需求
控制关闭adb调试\
\
但是?真的关闭了adb吗?\
通过串口debug信息来看
adb守护进程被杀死后
又被重新启动了\
\
得出结论,内核存在adb保护措施,并没有彻底关闭\
只是安卓层,控制了adb访问权限,营造出用户以为adb彻底被关闭的假象\
adb,是关不上的一扇窗
不想让光进入房间,只能摘了太阳
通过关闭硬件接口,断绝adb的想法就诞生了
操作硬件?\
在51单片机里面,操作硬件往往是向特定内存地址内写入1\0(汇编、C等能访问到内存地址的语言都可)
而Linux里面,早已经用上了"设备文件"这层抽象,设备文件由设备树所描述\
当Linux运行在嵌入式设备上,你便可以通过shell的管道来操作设备文件,写入1\0(最简单操作硬件的一种方式)
2模式是主机模式(支持adb)
1模式是读卡器模式(不支持adb)\
\
通过查看设备树,便可分析得出两条shell语句可以修改当前usb_otg外设的运转模式
echo 2 > /sys/bus/platform/drivers/usb20_otg/force_usb_mode
Or
echo 1 > /sys/bus/platform/drivers/usb20_otg/force_usb_mode
所以,只需魔改安卓的内置应用(设置本身就是一种安卓应用)便可以以另外一种形式完成需求\
安卓源码根目录结构
\
由此便可定位"设置"应用程序,在/packages/apps/Settings目录下面
需要替代指定的选项卡
\
想要hook掉按钮的事件函数,logcat指令是必不可少(Logcat 是一个命令行工具,用于转储系统消息日志,包括设备抛出错误时的堆栈轨迹,以及从您的应用使用 Log 类写入的消息。)
它能快速定位当用户点击按钮时,触发了哪些安卓层的服务与函数
抓到你了
\
DevelopmentSettingsActivity,应该是一个被触发的活动,触发它的应该是DevelopmentSettings类,我们就叫他小DS吧
DS里面重写了一个事件函数,叫做onSwitchChange,所有开关触发后会执行此回调函数
回调函数内控制范围,只有选项卡的开关又触发了resetDangerousOption函数->onPreferenceTreeClick函数
得出结论,所有的选项卡都会触发onPreferenceTreeClick函数,这里肯定是存在猫腻的\
谷歌你用点心,switch条件分支不可以?\
\
一股浓浓的switch分支写法,所以我判断这里是每一个选项卡内,开关触发的条件分支函数了\
onPreferenceTreeClick函数内关于目标选项卡的分支逻辑
\
随后马不停蹄的hook进去了——在特定的逻辑区域,执行shell操控硬件
hook完的状态
\
除了功能状态需要修改,页面也要保持一致性状态
在DS内,他所配套的页面资源文件是development_prefs.xml
development_prefs.xml中
关于被替代的选项卡的信息
\
android:title属性为选项卡的标题字符串,android:summary属性为选项卡的详细描述字符串,@string/enable_adb 使用enable_adb变量做字符串(支持直接写一个字符串,不采用变量)\
写死字符串即可\
嗯,看上去不错