在日常的app测试过程中,除了常规的功能验证外,app端还需要验证隐私与权限合规测试,因为如果app在随意获取用户隐私和权限的话,软件很容易被工商局给强制下线,所以我们测试,在测试过程中还需要注意测试隐私权限方面的内容,下面文章将从剪切板的权限获取测试来切入,深入的了解一下我们如何开发一个用于隐私测试的工具;
某天产品提出一个需求叫帮忙测试,规则如下: app一进入后会获取用户剪切板的数据,识别剪辑版文字来跳转到对应的页面(比如拼多多的助力链接一样); 这里存在一个问题,首次安装app进入后,会有一个用户协议,需要用户点击同意后,软件才能去获取剪切板的权限,不同意的话,软件是不能去获取,不然会违反工信部的规定; 之前的app是用户未点击同意的时候,软件也会获取剪切板的信息,这次改动后,需要点击同意后才能去获取。 针对此次改动,我们常用的测试方法已经无法实现测试验证;这时需要我们去hook开发的代码才能验证这个功能。
文章大致主要采用的技术: java语言
开发工具: Android Studio
准备环境: 安卓开发环境,电脑端安卓模拟器(夜神模拟器,已root), xposed
成型工具: xposed 模块(不了解的同学可以百度一下,就是安卓的一些插件,如微信抢红包之类的)
检测实现原理:利用模块中的hook钩子来监测app在运行过程中,调用的方法和类; 通过识别固定的类名称和方法名来判断app是否调用了权限获取。
一:创建安卓项目
点击New Project 新建一个安卓项目
默认选中Empty Activity,点击Next
设置名称,点击创建
将项目设置为 project 模式,便于后期讲解
二: 开发Xposed模块
开发Xposed模块,流程可以参照下图:
下面,我们来一一实现
1. 让手机知道,这个apk是xposed的一个模块
打开 项目名称/app/src/main/AndroidMainifest.xml 文件, 加入下面代码
<meta-data
android:name="xposedmodule"
android:value="true"/>
<meta-data
android:name="xposeddescription"
android:value="这是一个xposed程序的用途" />
<meta-data
android:name="xposedminversion"
android:value="53" />
2. 加入带有xposed API的第三方jar包到程序中
这边提供的有82版本的api jar包; 链接:https://pan.baidu.com/s/1QI7nU7wu–X1fkXARao0UA
提取码:5ue0
将jar包放入 app/libs 文件夹中
点击Add As libray 将jar包加入项目中
3.编写hook程序,监测目标app
在 com.example.myapp文件夹下创建一个java类
叫做HookTest 类型选Class
HookTest .class 编写代码:
1.导入xposed API的包
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
2.编写Hook函数
public class HookTest implements IXposedHookLoadPackage {
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable{
// 如果没有发现应用信息就返回,不进行后续的判断处理
if (loadPackageParam == null) {
return;
}
// 打日志
XposedBridge.log("开始进入Hook程序------------->");
// 模板 使用其他方法的话也这样写
//hook获取剪切板信息方法
XposedHelpers.findAndHookMethod(
android.content.ClipboardManager.class.getName(), // 写获取剪切版权限的方法的类名
loadPackageParam.classLoader, // 固定写法
"getPrimaryClip", // 对应的方法名
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
XposedBridge.log("getPrimaryClip()获取了当前的剪切板内容");
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// 打印调用类信息
// XposedBridge.log(getMethodStack());
super.afterHookedMethod(param);
}
}
);
}
}
4.让程序知道,那个文件是放hook模块方法的
首先在main文件夹下 创建一个 Assets Folder文件
创建一个文件 ,名称为:xposed_init
在该文件中写入hook测试类的路径
至此:所以代码层都已编写完成,可以将代码打包为apk,安装到模拟器中了, 点击顶部的播放按钮,安装软件到手机中,注意需要连接上手机或者模拟器
构建完成后,能看到已经安装上了
打开Xposed模块,能够看到,已经可以识别刚刚安装上的程序了;这时,我们点击勾选,重启模拟器
三: 测试 获取剪切版权限
1.首先启动刚刚安装的app.再打开xposed日志,清空之前的日志
2. 打开被测试app,调用获取剪切板权限的功能
3.再次打开日志文件,能够看到,我们已经监测到了app调用了这个方法
总结:
使用上面的方法,我们可以实现对,app获取剪切板权限的测试; 只需要在软件刚进入后,用户不点击同意协议前,监测软件,查看一下日志,即可知道开发是否调用了剪切板权限的方法; 向其他方法,如获取mac地址,GPS定位等功能,也是在模块中填写对应的方法名和类名称即可进行监测; 如果不知道对应权限的类名和方法名的话可以百度或者咨询一下开发;