updated on 2022.05.30
★ 搜索在同一行的形式:<action android:name=“action_name”/>
正则表达式:
find . -name AndroidManifest.xml | xargs grep -E -soh "<action {1,}android:name=\"[0-9a-zA-Z\._-]*\""
<action android:name="android.intent.action.MAIN"
<action android:name="android.intent.action.PACKAGE_ADDED"
<action android:name="android.intent.action.PACKAGE_CHANGED"
<action android:name="android.intent.action.PACKAGE_REMOVED"
<action android:name="android.intent.action.MAIN"
<action android:name="android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE"
<action android:name="android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE"
<action android:name="android.intent.action.PACKAGE_ADDED"
find . -name AndroidManifest.xml
: 搜索当前目录下的 AndroidManifest.xml
文件
| xargs grep
: 将文件内容传给 grep
命令
grep -E -soh
: -E
采用正则表达式匹配;-soh
, -s
忽略错误的输出,-o
只保留匹配的字符串,不是匹配的字符串所在的行;-h
不显示文件名。
"<action {1,}android:name=\"[0-9a-zA-Z\._-]*\""
: 要搜索的字符串,以 <action
开头(这个 action 不用在一行的开头),可以有 1 个或多个空格( {1,}
这里有空格),然后是 android:name="
。
[0-9a-zA-Z\._-]*
是要匹配的 action 的名字,action 名字可以由大小写字母、数字、下划线、横线和点组成。
\"
以双引号结尾。
★ 搜索带换行的形式
要搜索的形式:
<action
android:name="android.intent.action.SEND_XXXXXXXXXXXXXXXXXX"/>
正则表达式:
$ find . -name AndroidManifest.xml | xargs grep -E -z -sho "<action\s{3,}android:name=\"[0-9a-zA-Z\._-]*\""
<action
android:name="android.intent.action.SEND_XXXXXXXXXXXXXXXXXX"/>
多了一个参数 -z
,-z
表示一行的结尾是 0 时,才认为是是一行结束了。这样换行符是一行中的一个空白字符。
或者,
$ find . -name AndroidManifest.xml | xargs grep -E -sh "<action\s+$" -A 1
<action
android:name="android.intent.action.SEND_XXXXXXXXXXXXXXXXXX"/>
<action\s+$
搜索一行中满足这样形式的:
<action
字符串,后面跟 1 个或多个空白字符(包括空格、tab,不包括换行),然后是一行结束,这里是换行符结束;
-A 1
是 grep 的参数,是说把 搜到的当前行的下一行 也算在内,显示到结果中。A 表示的是 after,A 1 是之后的 1 行。
★ 过滤相同的 action
将获取到的 action 保存到文件:
find . -name AndroidManifest.xml | xargs grep -E -soh "<action {1,}android:name=\"[0-9a-zA-Z\._-]*\"" >> actions.txt
find . -name AndroidManifest.xml | xargs grep -E -sh "<action\s+$" -A 1 >> actions.txt
可能需要在多个目录中执行上面的命令,所以采用 >>
追加的方式,追加到 actions.txt 文件中。
只获取 action 的名字,排序,去除重复:
cat actions.txt | cut -d "\"" -f 2 | sort | uniq
cut -d "\"" -f 2
: 是以双引号 "
为分隔符,切割 actions.txt 中每一行的字符串;
-f 2
表示需要每一行中的第 2 个字段,例如:
actions.txt 中的内容为:
<action
android:name="android.intent.action.SEND_XXXXXXXXXXXXXXXXXX"/>
<action android:name="android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE"
执行 $ cat test.txt | cut -d "\"" -f 2
的结果是:
<action
android.intent.action.SEND_XXXXXXXXXXXXXXXXXX
android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE
如果一行中没有双引号,这一行会原封不动的显示到结果中。需要之后再处理一下,删掉这些信息。
| sort | uniq
: sort
对上面的结果进行排序,按照字典序。这样相同的 action 会排在一起,即多行显示相同的 action。
uniq
:将多行显示相同的 action 剔除,只保留唯一的一行(unique line)。
★ 找到 action 有什么用?
我做了一个 app,可以搜索 Android 系统中某个 action 是否是受保护的,即是否是 protected-broadcast
,方便确认某个 app 声明的 action 是否真正受到了保护。例如,可以尽快找到类似下面的安全问题。
2021 年 5 月 6 日 Blackhat 上报告过 protected broadcast 的问题:
Android 8.0 , 9.0 上 system/app 目录中的系统 app,声明的 protected-broadcast
失效了。只有 system/priv-app
目录中的系统 app 声明的 protected-broadcast
有效。