Andriod
前言:
最近在解决wifi的bug,基于高通平台的andriod R,遇到了点问题。
问题现象:
进入wifi setting 后,开启wifi 按钮开关,扫描不到周围的ap,也就导致无法进行连接wifi。
简单的问题排查,梳理流程
1:首先我先看了wifi 模块有没有被编译到,确认编译出ko后,在设备下也是找到了:
kona:/vendor/lib/modules # ls
audio_mbhc.ko audio_wcd938x_slave.ko qca_cld3_qca6390.ko
audio_native.ko audio_wcd9xxx.ko qca_cld3_qca6490.ko
我这里只是列出了部分的ko文件,我需要的是qca_cld3_qca6390.ko这个,说明已经编译出来。
2:随后可能是ko没有进行加载,我这边就进行了主动加载:insmod命令用于载入模块。
/vendor/lib/modules # insmod qca_cld3_qca6390.ko
insmod: failed to load qca_cld3_qca6390.ko: Required key not available
说所需密钥不可用,或者不匹配,这就涉及到了签名
注意:如果在执行的时候出现了如下的信息:
kona:/vendor/lib/modules # insmod qca_cld3_qca6390.ko
insmod: failed to load qca_cld3_qca6390.ko: File exists
说明已经加载上了模块驱动,如果已经加载上了,还是扫描不到ap,那就要找一下其他的问题了。
3:解决wifi扫描的问题
1)绕过wifi的签名检测,让这个功能临时可用:
直接屏蔽模块的签名检测:
#CONFIG_MODULE_SIG=y
#CONFIG_MODULE_SIG_FORCE=y
解释一下:
内核配置项
CONFIG_MODULE_SIG=y
表示开启了签名机制,但是这时候模块签名或不签名都可以使用。
CONFIG_MODULE_SIG_FORCE=y
如果上述配置项使能,则模块必须有正确的签名才能正常使用。
当然了还有的配置文件有这个:
CONFIG_MODULE_SIG_ALL=y
内核在编译的时候,并不会主动去给模块签名,除非你把上述配置项打开。
反正我的这哥配置文件没有,这是我在网上才查到的。
经过编译,上机验证,wifi可以扫描到ap了。
2)更改签名使得签名一致,解决问题
把设备里的模块ko pull出来,直接用命令看:
optiplex-7070:~$ adb pull /vendor/lib/modules/qca_cld3_qca6390.ko ~/桌面/
/vendor/lib/modules/qca_cld3_qca6390.ko: 1 file pulled. 23.6 MB/s (15031278 bytes in 0.607s)
首先我们先看一下正常有签名与无签名的差别:
ko的签名信息:Module signature appended。由图可知,qca_cld3_qca6390.ko是没有看到有签名信息。
注意:如果查看签名时已经有签名也没事,也可以在他有签名的基础上再次给他签名!
直接添加手动签名:
既然已经pull出来了ko,在签名不一致的基础上,同时我们为了与kenel的签名保持一致,我们分别要把代码中这两个路径下的工具和秘钥及数字证书也要拿出来(也可以不拿出来,我这里只是方便操作):
/kernel/ship_prebuilt/primary_kernel/scripts下的工具:sign-file
/kernel/ship_prebuilt/primary_kernel/certs下的密钥和数字签名:signing_key.pem与signing_key.x509
有的同学又要问了,我的代码中的密钥和数字签名跟我的不匹配,可能是:我看到网上的用的是signing_key.priv 和signing_key.x509,所以,你可以将signing_key.priv看作是我的signing_key.pem。
东西准备齐了,直接改签名:
我先看下pull 出来的ko的签名情况:
使用命令:
$:hexdump -C qca_cld3_qca6390.ko |tail
显示如下:
00e55e40 4d 43 c7 47 39 ba 0a b7 c9 12 b2 d8 cd 3e 45 7c |MC.G9........>E||
00e55e50 aa 07 c0 c5 09 68 ce 5e 3f b2 c0 83 77 0c 97 2e |.....h.^?...w...|
00e55e60 6e 99 78 be 45 1b 6f 9a b4 05 df f4 e5 17 1e 10 |n.x.E.o.........|
00e55e70 5e ed 05 93 46 c1 22 2d 9d 06 fc 22 25 8e c4 20 |^...F."-..."%.. |
00e55e80 87 1f 4b 2d 8b ca 9e 3a 1a 63 1f ab 75 b2 12 2f |..K-...:.c..u../|
00e55e90 e2 45 53 dc c5 3b 89 81 31 37 eb 9e 9b b5 47 46 |.ES..;..17....GF|
00e55ea0 cb 11 00 00 02 00 00 00 00 00 00 00 02 a9 7e 4d |..............~M|
00e55eb0 6f 64 75 6c 65 20 73 69 67 6e 61 74 75 72 65 20 |odule signature |
00e55ec0 61 70 70 65 6e 64 65 64 7e 0a |appended~.|
00e55eca
说明签名已经有了,但是不对,是其他版本的签名,于是我给他再次签名:
使用命令:
$ ./sign-file sha512 signing_key.pem signing_key.x509 ../qca_cld3_qca6390.ko
再次查看签名情况:
$ hexdump -C qca_cld3_qca6390.ko |tail
内容:
00e55e30 a6 7c cf 04 d4 0c 34 50 e5 16 2c 23 4b 67 23 0e |.|....4P..,#Kg#.|
00e55e40 5b e2 d7 a0 ff 03 b0 98 5c 0f c3 6c 5f 64 d7 c1 |[.......\..l_d..|
00e55e50 46 67 b6 11 53 99 01 6a 40 41 33 bb c9 e6 92 a5 |Fg..S..j@A3.....|
00e55e60 de 51 02 ae 63 15 4e a8 48 ea d7 4c 59 b6 e9 63 |.Q..c.N.H..LY..c|
00e55e70 c0 83 b4 6d b3 2f 42 90 d1 26 a9 a4 da ba 9d 8c |...m./B..&......|
00e55e80 a8 72 94 5f 7d fe 84 3f 3f 3c 08 b2 50 3e 5d bb |.r._}..??<..P>].|
00e55e90 cb f8 cf a2 d8 09 6f 00 00 02 00 00 00 00 00 00 |......o.........|
00e55ea0 00 02 a9 7e 4d 6f 64 75 6c 65 20 73 69 67 6e 61 |...~Module signa|
00e55eb0 74 75 72 65 20 61 70 70 65 6e 64 65 64 7e 0a |ture appended~.|
00e55ebf
签名后我们将设备下的ko删除,因为签名问题,驱动是加载不上的,也就没有必要卸载驱动。
经过一系列的adb后,可以更改设备内容后,我们push进去我们更改后的ko:
$ adb push qca_cld3_qca6390.ko /vendor/lib/modules
qca_cld3_qca6390.ko: 1 file pushed. 26.2 MB/s (15031999 bytes in 0.547s)
进入设备,查看我们是否push进去了,如果ok,我们可以主动加载驱动:
kona:/vendor/lib/modules # insmod qca_cld3_qca6390.ko
没有错误,ok,再次打开wifi,wifi扫描的到ap了,问题解决。
简单总结:如果你单刷boot.img,就使用你代码的工具进行签名,也就是kernel下的,这才是核心,谁编译出来的ko不重要,就是你的ko要跟你的boot.img匹配。
错误情况描述:(走过的坑,别模仿)
因为不是特别清楚代码框架,对于签名的问题,我就显得很机械,刚开始我使用的是(注意,是out目录):
- 数字签名与密钥:/out/target/product/kona/obj/kernel/msm-4.19/certs$下的,signing_key.pem与signing_key.x509
/out/target/product/kona/obj/kernel/msm-4.19/certs$ ls
built-in.a signing_key.pem system_keyring.o
modules.builtin signing_key.x509 x509_certificate_list
modules.order system_certificates.o x509.genkey
- 使用的签名工具 :/out/target/product/kona/obj/kernel/msm-4.19/scripts$下的sign-file
/out/target/product/kona/obj/kernel/msm-4.19/scripts$ ls
asn1_compiler conmakehash genksyms mod recordmcount sortextable
basic dtc kallsyms modules.order selinux unifdef
bin2c extract-cert kconfig pnmtologo sign-file
多次尝试后,一直是失败的,机器直接绿屏(crash)!一看就是签名不对!我在全局搜了下上面的的工具及秘钥,结果在kernel下找到了类似的文件,也就是上面的问题解决方法。
没有加载驱动,app层的现实情况:
Andriod
前言:
最近在解决wifi的bug,基于高通平台的andriod R,遇到了点问题。
问题现象:
进入wifi setting 后,开启wifi 按钮开关,扫描不到周围的ap,也就导致无法进行连接wifi。
简单的问题排查,梳理流程
1:首先我先看了wifi 模块有没有被编译到,确认编译出ko后,在设备下也是找到了:
kona:/vendor/lib/modules # ls
audio_mbhc.ko audio_wcd938x_slave.ko qca_cld3_qca6390.ko
audio_native.ko audio_wcd9xxx.ko qca_cld3_qca6490.ko
我这里只是列出了部分的ko文件,我需要的是qca_cld3_qca6390.ko这个,说明已经编译出来。
2:随后可能是ko没有进行加载,我这边就进行了主动加载:insmod命令用于载入模块。
/vendor/lib/modules # insmod qca_cld3_qca6390.ko
insmod: failed to load qca_cld3_qca6390.ko: Required key not available
说所需密钥不可用,或者不匹配,这就涉及到了签名
注意:如果在执行的时候出现了如下的信息:
kona:/vendor/lib/modules # insmod qca_cld3_qca6390.ko
insmod: failed to load qca_cld3_qca6390.ko: File exists
说明已经加载上了模块驱动,如果已经加载上了,还是扫描不到ap,那就要找一下其他的问题了。
3:解决wifi扫描的问题
1)绕过wifi的签名检测,让这个功能临时可用:
直接屏蔽模块的签名检测:
#CONFIG_MODULE_SIG=y
#CONFIG_MODULE_SIG_FORCE=y
解释一下:
内核配置项
CONFIG_MODULE_SIG=y
表示开启了签名机制,但是这时候模块签名或不签名都可以使用。
CONFIG_MODULE_SIG_FORCE=y
如果上述配置项使能,则模块必须有正确的签名才能正常使用。
当然了还有的配置文件有这个:
CONFIG_MODULE_SIG_ALL=y
内核在编译的时候,并不会主动去给模块签名,除非你把上述配置项打开。
反正我的这哥配置文件没有,这是我在网上才查到的。
经过编译,上机验证,wifi可以扫描到ap了。
2)更改签名使得签名一致,解决问题
把设备里的模块ko pull出来,直接用命令看:
optiplex-7070:~$ adb pull /vendor/lib/modules/qca_cld3_qca6390.ko ~/桌面/
/vendor/lib/modules/qca_cld3_qca6390.ko: 1 file pulled. 23.6 MB/s (15031278 bytes in 0.607s)
首先我们先看一下正常有签名与无签名的差别:
ko的签名信息:Module signature appended。由图可知,qca_cld3_qca6390.ko是没有看到有签名信息。
注意:如果查看签名时已经有签名也没事,也可以在他有签名的基础上再次给他签名!
直接添加手动签名:
既然已经pull出来了ko,在签名不一致的基础上,同时我们为了与kenel的签名保持一致,我们分别要把代码中这两个路径下的工具和秘钥及数字证书也要拿出来(也可以不拿出来,我这里只是方便操作):
/kernel/ship_prebuilt/primary_kernel/scripts下的工具:sign-file
/kernel/ship_prebuilt/primary_kernel/certs下的密钥和数字签名:signing_key.pem与signing_key.x509
有的同学又要问了,我的代码中的密钥和数字签名跟我的不匹配,可能是:我看到网上的用的是signing_key.priv 和signing_key.x509,所以,你可以将signing_key.priv看作是我的signing_key.pem。
东西准备齐了,直接改签名:
我先看下pull 出来的ko的签名情况:
使用命令:
$:hexdump -C qca_cld3_qca6390.ko |tail
显示如下:
00e55e40 4d 43 c7 47 39 ba 0a b7 c9 12 b2 d8 cd 3e 45 7c |MC.G9........>E||
00e55e50 aa 07 c0 c5 09 68 ce 5e 3f b2 c0 83 77 0c 97 2e |.....h.^?...w...|
00e55e60 6e 99 78 be 45 1b 6f 9a b4 05 df f4 e5 17 1e 10 |n.x.E.o.........|
00e55e70 5e ed 05 93 46 c1 22 2d 9d 06 fc 22 25 8e c4 20 |^...F."-..."%.. |
00e55e80 87 1f 4b 2d 8b ca 9e 3a 1a 63 1f ab 75 b2 12 2f |..K-...:.c..u../|
00e55e90 e2 45 53 dc c5 3b 89 81 31 37 eb 9e 9b b5 47 46 |.ES..;..17....GF|
00e55ea0 cb 11 00 00 02 00 00 00 00 00 00 00 02 a9 7e 4d |..............~M|
00e55eb0 6f 64 75 6c 65 20 73 69 67 6e 61 74 75 72 65 20 |odule signature |
00e55ec0 61 70 70 65 6e 64 65 64 7e 0a |appended~.|
00e55eca
说明签名已经有了,但是不对,是其他版本的签名,于是我给他再次签名:
使用命令:
$ ./sign-file sha512 signing_key.pem signing_key.x509 ../qca_cld3_qca6390.ko
再次查看签名情况:
$ hexdump -C qca_cld3_qca6390.ko |tail
内容:
00e55e30 a6 7c cf 04 d4 0c 34 50 e5 16 2c 23 4b 67 23 0e |.|....4P..,#Kg#.|
00e55e40 5b e2 d7 a0 ff 03 b0 98 5c 0f c3 6c 5f 64 d7 c1 |[.......\..l_d..|
00e55e50 46 67 b6 11 53 99 01 6a 40 41 33 bb c9 e6 92 a5 |Fg..S..j@A3.....|
00e55e60 de 51 02 ae 63 15 4e a8 48 ea d7 4c 59 b6 e9 63 |.Q..c.N.H..LY..c|
00e55e70 c0 83 b4 6d b3 2f 42 90 d1 26 a9 a4 da ba 9d 8c |...m./B..&......|
00e55e80 a8 72 94 5f 7d fe 84 3f 3f 3c 08 b2 50 3e 5d bb |.r._}..??<..P>].|
00e55e90 cb f8 cf a2 d8 09 6f 00 00 02 00 00 00 00 00 00 |......o.........|
00e55ea0 00 02 a9 7e 4d 6f 64 75 6c 65 20 73 69 67 6e 61 |...~Module signa|
00e55eb0 74 75 72 65 20 61 70 70 65 6e 64 65 64 7e 0a |ture appended~.|
00e55ebf
签名后我们将设备下的ko删除,因为签名问题,驱动是加载不上的,也就没有必要卸载驱动。
经过一系列的adb后,可以更改设备内容后,我们push进去我们更改后的ko:
$ adb push qca_cld3_qca6390.ko /vendor/lib/modules
qca_cld3_qca6390.ko: 1 file pushed. 26.2 MB/s (15031999 bytes in 0.547s)
进入设备,查看我们是否push进去了,如果ok,我们可以主动加载驱动:
kona:/vendor/lib/modules # insmod qca_cld3_qca6390.ko
没有错误,ok,再次打开wifi,wifi扫描的到ap了,问题解决。
简单总结:如果你单刷boot.img,就使用你代码的工具进行签名,也就是kernel下的,这才是核心,谁编译出来的ko不重要,就是你的ko要跟你的boot.img匹配。
错误情况描述:(走过的坑,别模仿)
因为不是特别清楚代码框架,对于签名的问题,我就显得很机械,刚开始我使用的是(注意,是out目录):
- 数字签名与密钥:/out/target/product/kona/obj/kernel/msm-4.19/certs$下的,signing_key.pem与signing_key.x509
/out/target/product/kona/obj/kernel/msm-4.19/certs$ ls
built-in.a signing_key.pem system_keyring.o
modules.builtin signing_key.x509 x509_certificate_list
modules.order system_certificates.o x509.genkey
- 使用的签名工具 :/out/target/product/kona/obj/kernel/msm-4.19/scripts$下的sign-file
/out/target/product/kona/obj/kernel/msm-4.19/scripts$ ls
asn1_compiler conmakehash genksyms mod recordmcount sortextable
basic dtc kallsyms modules.order selinux unifdef
bin2c extract-cert kconfig pnmtologo sign-file
多次尝试后,一直是失败的,机器直接绿屏(crash)!一看就是签名不对!我在全局搜了下上面的的工具及秘钥,结果在kernel下找到了类似的文件,也就是上面的问题解决方法。
没有加载驱动,app层的现实情况: