1.为什么要抓取app日志

在移动应用渗透测试中敏感信息安全风险检测需要对应用日志进行分析,日志内容如果包含敏感信息,可能会造成数据泄漏的风险。

在app应用程序发生异常出现Crash崩溃、ANR阻塞时通常说明应用程序存在一定的问题,这时候需要收集应用日志定位错误位置帮助开发调试修复程序。

2.Logcat收集app日志相关工具配置

Android日志系统提供了记录和查看系统调试信息的功能。日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过logcat命令来查看和使用。logcat本身是android的shell的一个命令,可以通过adb shell进入shell后执行logcat命令,也可以通过adb logcat直接运行。

2.1 ADB的安装与基础使用

adb全称是Android Debug Bridge,它是一个命令行工具,通过它可以与Android设备进行交互,可以进行常见的安装/卸载app、打开app、查看app的日志等操作。

这里简单列出几条ADB常用命令为下文中我们测试使用:

# 1.查看
adb --help #查看帮助手册
adb devices #检查连接到电脑的安卓设备,常用的检查命令
adb shell dumpsys activity | find "mFocusedActivity" #Android 7.0及以下查看前台应用包名
adb shell dumpsys activity | find "mResumedActivity" #Android 8.0及以上用此命令查看包名
adb logcat #打印log信息
adb logcat -v time #log信息显示时间戳
adb logcat -v time > d:\logcat.txt #把日志信息重定向至d:/logcat.txt

# 2.连接与交互
adb connect ip:port #通过WiFi进行远程连接手机进行调试,手机和电脑需在同一个局域网上,计算机内部通信地址127.0.0.1,夜神模拟器默认的端口号是62001
adb disconnect ip:port #断开一个(ip:port)连接
adb shell #登录设备shell(安卓的底层是Linux)

# 3.文件传输
adb pull <手机文件路径> <本机路径> #从手机拉取文件到本地电脑
adb push <本地电脑路径> <手机路径> #从本地推送文件到手机

# 4.安装与卸载
adb install *.apk #为了快速获取apk的安装包路径,可以直接把apk直接拖到cmd的窗口,安装成功会返回success
adb uninstall  #卸载需要输入应用包名

ADB的安装:

实际上adb是一个免安装工具,使用adb时只需要adb工具被命令行调用到就可以了。

1.首先根据系统的版本下载adb

2.解压下载的Platform-tools zip包,将Platform-tools路径添加到系统环境变量中。随后在命令行执行adb version查看adb版本,未出现报错安装配置成功。

3.mac os中可直接使用brew进行安装

brew install android-platform-tools

安装完成后在根目录.bash_profile添加环境变量,使用open .bash_profile打开编辑,在下方插入如下代码

export ANDROID_HOME=/Users/用户名/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools

保存后source .bash_profile更新变量,查看adb

2.2Logcat语法命令

语法格式:

[adb] logcat [
] … [] …
选项:
-b:加载可供查看的备用日志缓冲区,例如event或radio。默认使用 main和system缓冲区集。请参阅查看备用日志缓冲区

-c, –clear:清除所选的缓冲区并退出,默认缓冲区集为main和system。要清除所有缓冲区,请使用-b all -c。

-e, –regex=:只输出日志消息与匹配的行,其中是一个正则表达式

-m, –max-count=:输出行后退出。这样是为了与–regex配对,但可以独立运行

-print:与–regex和–max-count配对,使内容绕过正则表达式过滤器,但仍能够在获得适当数量的匹配时停止

-d:将日志转储到屏幕并退出

-f:将日志消息输出写入

-g, –buffer-size:输出指定日志缓冲区的大小并退出

-n:设置轮替日志的数量上限,默认值为4,需要使用 -r 选项

-r:每输出时轮替日志文件,默认值为16。需要使用-f选项

-s:相当于过滤器表达式‘*:S’;它将所有标记的优先级设为“静默”,并用于放在可添加内容的过滤器表达式列表之前

-v:设置日志消息的输出格式。默认格式为threadtime。

-D, –dividers:输出各个日志缓冲区之间的分隔线

-c:清空(清除)整个日志并退出

-t:仅输出最新的行数。此选项包括-d功能

2.3Logcat缓冲区

android log输出量巨大,特别是通信系统的log,因此,android把log输出到不同的缓冲区中,目前定义了四个log缓冲区:

1)Radio:输出通信系统的log

2)System:输出系统组件的log

3)Event:输出event模块的log

4)Main:所有java层的log,遗迹不属于上面3层的log

缓冲区主要给系统组件使用,一般的应用不需要关心,应用的log都输出到main缓冲区中。默认log输出(不指定缓冲区的情况下)是输出System和Main缓冲区的log。

实例:

adb logcat –b radio

adb logcat –b system

adb logcat –b events

adb logcat –b main

//将缓冲区的log打印到屏幕并退出
adb logcat -d 
//清除缓冲区log(testCase运行前可以先清除一下)
adb logcat -c
//打印缓冲区大小并退出
adb logcat -g
//输出log
adb logcat -f /data/local/tmp/log.txt -n 10 -r 1

3.日志收集过程

连接设备

先将设备通过usb数据线连接到电脑,设备开启USB调试。

通过adb devices命令查看是否连接成功:

molengsu@mlsdeMacBook-Pro / % adb devices
List of devices attached
FJH5T19114009780 device

查看设备log输出

我们直接通过adb logcat查看的输出是所有应用的

adb logcat -d  ##所有应用logcat输出

为了精准分析我们可以通过应用pid来查看我们想要分析的应用日志。首先列出设备已安装的应用查看应用包名

adb shell pm list package

然后获取应用的pid,在获取时现在手机上打开要获取的应用,因为pid是分给进程的,应用运行起来才会分配pid。需要注意的是,pid是分配给进程的,如果app关闭了再重新打开,就会分配一个新的进程,同一个包名对应的pid就会变。

adb shell dumpsys meminfo com.xxxx.xxxx  ##com.xxxx.xxxx是包名

拿到pid后就接着可以输出应用日志了

adb logcat -d --pid=30923

为了方便查找也可以将日志导出到文件中,导出时要注意新建一个文本向里写入文本设置好可写的权限。

adb logcat -d --pid=30923 > logcat_test.txt