★ 搜索带换行的形式★ 过滤相同的 actionupdated on 2022.05.30★ 搜索在同一行的形式:正则表达式:find . -name AndroidManifest.xml | xargs grep -E -soh "
当前位置:   article > 正文

搜索 AndroidManifest.xml 中的 action_android ${actionname}

android ${actionname}

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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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"/>
  • 1
  • 2

正则表达式:

$ 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"/>
  • 1
  • 2
  • 3

多了一个参数 -z-z 表示一行的结尾是 0 时,才认为是是一行结束了。这样换行符是一行中的一个空白字符。

或者,

$ find . -name AndroidManifest.xml | xargs grep -E -sh "<action\s+$" -A 1
                <action
                    android:name="android.intent.action.SEND_XXXXXXXXXXXXXXXXXX"/>
  • 1
  • 2
  • 3

<action\s+$ 搜索一行中满足这样形式的:
<action 字符串,后面跟 1 个或多个空白字符(包括空格、tab,不包括换行),然后是一行结束,这里是换行符结束;

-A 1grep 的参数,是说把 搜到的当前行的下一行 也算在内,显示到结果中。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
  • 1
  • 2

可能需要在多个目录中执行上面的命令,所以采用 >> 追加的方式,追加到 actions.txt 文件中。
只获取 action 的名字,排序,去除重复:

cat actions.txt | cut -d "\"" -f 2 | sort | uniq
  • 1

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"
  • 1
  • 2
  • 3

执行 $ cat test.txt | cut -d "\"" -f 2 的结果是:

 <action
android.intent.action.SEND_XXXXXXXXXXXXXXXXXX
android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE
  • 1
  • 2
  • 3

如果一行中没有双引号,这一行会原封不动的显示到结果中。需要之后再处理一下,删掉这些信息。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/235828
推荐阅读
相关标签