动态监测APP

一、hook的使用

hook是一种消息处理机制,也是处理消息的程序段,通过系统调用将此程序段载入系统,每当有特定消息发出时,在没有到达目标地址前,hook程序就已经得到该消息,获得了程序的控制权,可以对消息进行相应处理,可概括为在事件传送到终点前截获井监控事件的传输。

Binder进程间通信机制是由C/C++代码实现的,Android系统在应用程序框架层中提供Binder进程间通信机制的Java接口,所以应用程序Java层的代码可以通过JNI机制来调用Binder的C/C++接口,实现进程间的通讯。部分恶意应用程序直接通过与Binder的C/C++接口通讯来获取系统服务,绕过Java层对应用程序框架层敏感API检测。无论是来自Java层还是Native层对系统服务的调用,归根结底是需要调用ioctl函数,所以本文选取了“libbinder.so”中的ioctl函数进行hook,既可以实时监测到通过应用程序架构层API获取系统服务的行为,也可以监测到通过native代码获取系统服务的行为。

常用Hook方案:

 Xposed

通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。

原理:因为Android为每个进程都提供一个虚拟空间,并且每个进程都只能在该虚拟空间上运行,而在Android系统中,应用程序进程都是由Zygote进程孵化出来的,Zygote进程是由Init进程启动的。Zygote进程在启动时就会创建一个Dalvik虚拟机实例,每当它孵化一个新的应用程序进程时,都会将这个Dalvik虚拟机实例复制到新的应用程序进程里面去,从而使得每一个应用程序进程都有一个独立的Dalvik虚拟机实例。因此Xposed选择替换app_process来控制zygote进程。

举例:一个简单的登入程序,登录时输入用户名与密码,hook之后就可以在DDMS中查看hook到的数据,或者在Xposed日志中查看日志。

 

 

 

二、Android Studio Profiler

1、分析CPU活动

功能:实时检查应用的CPU使用率和线程活动,还可以检查记录的方法跟踪数据、函数跟踪数据、系统跟踪数据的详情。

记录配置:

 System Trace:捕获精细的详细信息,以便您检查应用与系统资源的交互情况。

 Method and function traces:对于应用进程中的每个线程,可以了解一段时间内执行了哪些方法 (Java) 或函数 (C/C++),以及每个方法或函数在其执行期间消耗的 CPU 资源。还可以使用方法和函数跟踪数据来识别调用方和被调用方。使用这些信息来确定哪些方法或函数过于频繁地被调用导致消耗大量资源。

主要部分:

(1)事件时间轴:显示应用中的 Activity 在其生命周期内不断转换经历各种不同状态的过程,并指示用户与设备的交互,包括从键盘的输入。

(2)CPU 时间轴:显示应用的实时 CPU 使用率以及应用当前使用的线程总数。可以通过沿时间轴的横轴方向移动鼠标来检查历史 CPU 使用率数据。

(3)线程活动时间轴:列出属于应用进程的每个线程,并使用下面列出的颜色在时间轴上指示它们的活动。记录跟踪数据后,您可以从此时间轴上选择一个线程,以在跟踪数据窗格中检查其数据。

绿色:表示线程处于活动状态或准备使用 CPU。也就是说,线程处于正在运行或可运行状态。

黄色:表示线程处于活动状态,但它正在等待一项 I/O 操作,然后才能完成它的工作。

灰色:表示线程正在休眠且没有消耗任何 CPU 时间。 当线程需要访问尚不可用的资源时,就会出现这种情况。在这种情况下,要么线程主动进入休眠状态,要么内核将线程置于休眠状态,直到所需的资源可用。

 

 

 

记录跟踪数据:与应用开始交互前,点击Record开始记录,完成后点击Stop停止,然后显示出其跟踪信息。

 Interaction:沿着时间轴显示用户互动和应用生命周期事件。

 Flame Chart:一个倒置的调用图表,方法或函数由下往上进行调用

比如,如图表示A调用D和B,D调用B1B2B3和C2,B调用C,B1B2B3调用C1C3

 

 

 

 Top Down:一个调用列表,显示某方法或函数调用的方法或函数

 Bottom Up:一个调用列表,显示调用某方法或函数的方法或函数

其中,Self表示方法或函数调用在执行自己的代码(而非被调用方的代码)上所花的时间。Children表示方法或函数调用在执行它的被调用方(而非自己的代码)上所花的时间。Total表示方法的 Self 时间和 Children 时间的总和。这表示应用在执行调用时所用的总时间。

 Events:该表格列出了当前所选线程中的所有调用。通过选择表格中的某一行就可以在时间轴上导航到所选调用的开始时间和结束时间。这样,就可以在时间轴上准确定位事件。

 

 

 

 

 

导出或导入跟踪数据

通过应用插桩生成跟踪日志,

使用Debug类进行插桩,可以更加精确的控制设备何时开始或停止记录跟踪信息。在Activity的onCreate(Bundle)中调用startMethodTracing();在onDestory()中调用stopMethodTracing()。

Debug.startMethodTracing("sample");  //自定义跟踪文件为sample.trace

...

Debug.stopMethodTracing();

在每次调用startMethodTracing()时动态地对跟踪日志进行重命名,以防新的跟踪日志覆盖旧的,达到保存多个日志的效果。假设在A类中进行插桩与日志的重命名。

A a = new A("dd_MM_yyyy_hh_mm_ss",Locale.getDefault());

String logDate = a.format(new Date());

Debug.startMethodTracing("sample-" + logDate);

可以通过Device File Explorer访问设备上的跟踪日志,然后导航至应用的软件包特定目录找到 .trace 文件,使用adb pull path-on-device/sample.trace xxx/命令将名为sample.trace的跟踪日志文件复制到xxx目录,最后可以在CPU Profiler中导入跟踪文件。

2、分析内存使用情况

 

 

 

 

 

 

 

3、分析网络活动

分析应用的网络Activity意义:当应用向网络发送请求时,设备必须使用高功耗的移动或WLAN无线装置来收发数据包。无线装置不仅要消耗电力来传输数据,而且还要消耗额外的电力来开启并且不锁定屏幕。

使用网络性能剖析器,可以查找频繁出现的短时网络活动峰值,这些峰值意味着,某些应用要求经常开启无线装置,或要求无线装置长时间不锁定屏幕以处理集中出现的大量短时请求。

主要功能:

 1的区域可以进行拖动选择时间轴的一部分来检查网络流量

 2中Connection View:列出了在时间轴上选定时段内从应用的所有 CPU 线程发送或接收的文件。对于每个请求,您可以检查大小、类型、状态和传输时长以及每个文件的发送或接收时间。

 

 

 

 Thread View:显示您应用的每个 CPU 线程的网络活动。 可以在此视图中检查各网络请求由应用的哪些线程负责。

 

 

 从 Connection View 或 Thread View 中点击请求名称,可检查有关已发送或已接收数据的详细信息。点击各个标签页可查看响应标头和正文、请求标头和正文或调用堆栈。

在 Response 和 Request 标签页中,点击 View Parsed 链接可显示格式化文本,点击 View Source 链接可显示原始文本。

 

 

posted @ 2021-10-20 09:41  Sunshine_y  阅读(349)  评论(0编辑  收藏  举报