搜索 AndroidManifest.xml 中的 action

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 有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值