最近开始接触app测试,发现坑有些多,赤手空拳搞不定,决定开始学习xposed module的相关的操作,
毕竟“root==god”,要好好利用 root 来对app进行降维打击!!!
今天先解决某些app不能截图的问题,实测可bypass 某im的闪图功能、某支付软件的付款码界面、还有某银行app
Github Repo:https://github.com/lushann/Anti-Screenshot
Release:https://github.com/lushann/Anti-Screenshot/releases
毕竟是从0到1的一篇文章,基本流程还得走走。
1.Android Studio 新建项目,这里新建一个 Empty Activity的项目
说明:
2.编写xposed module 基本信息
在src/main/res/values/strings.xml中添加如下:
<string name="xposed_description">强制截屏 @lushan</string>
在AndroidManifest.xml文件中,
<meta-data android:name="xposedmodule" android:value="true" />
<meta-data android:name="xposeddescription" android:value="@string/xposed_description" />
<meta-data android:name="xposedminversion" android:value="54" />
如图:
3.加载 XposedBridge API 包
将XposedBridgeApi包拷贝到libs下,然后右键 Add As Library:
在app文件夹下的build.gradle中检查 dependencies块中的内容
说明:之前的教程写的是用 provided,该关键字已被 compileOnly 取代。
4.新建Xposed module 入口函数
函数体:
public class HookMain implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
}
}
咱们在这一步先写个空的入口函数,内部逻辑以后再写。
5.指定 Xposed module 入口函数
在src/main下,新建 assets/xposed_init , 文件内容为包名+入口函数名
到这儿,一个xposed module的雏形就差不多完成了,接下来我们需要完善相关的Hook逻辑,不过我们现在可以执行一下,看一下啥效果
xposed 框架能够正确识别到这是个 module,并且能够显示之前设置好的 module 基本信息。
总的来说,经过我的细致观察,Android提供的禁止截屏的方法,最终都是给“Display“这个类,增加“FLAG_SECURE”属性
下边是官方文档关于如何设定 “FLAG_SECURE“的方法:
An application creates a window with a secure surface by specifying the WindowManager.LayoutParams#FLAG_SECURE window flag. Likewise, an application creates a SurfaceView with a secure surface by calling SurfaceView#setSecurebefore attaching the secure view to its containing window.
文档:https://developer.android.com/reference/android/view/Display#FLAG_SECURE
很明显,上边这段文档介绍了两种方法来设定 Display.FLAG_SECURE,一个呢是通过指定 window类的flag:WindowManager.LayoutParams#FLAG_SECURE , 另一个就是使用 SurfaceView#setSecure方法。
可以通过以下两个方法实现:
1. window.setFlag(WindowManager.LayoutParams.FLAG_SECURE)
https://developer.android.com/reference/android/view/Window#setFlags(int,%20int)
2. window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
https://developer.android.com/reference/android/view/Window#addFlags(int)
https://developer.android.com/reference/android/view/SurfaceView#setSecure(boolean)
综上所述,咱们需要hook三个函数。
其实逻辑还挺简单的,hook函数调用、改参数,一气呵成
public class HookMain implements IXposedHookLoadPackage {
String packageName = new String();
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
packageName = loadPackageParam.packageName;
// Hook "window.setFlag(WindowManager.LayoutParams.FLAG_SECURE)"
XposedHelpers.findAndHookMethod(Window.class, "setFlags", int.class, int.class,
removeSecureFlagHook);
// Hook "window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)"
XposedHelpers.findAndHookMethod(Window.class, "addFlags", int.class,
removeSecureFlagHook);
// Hook "SurfaceView.setSecure"
XposedHelpers.findAndHookMethod(SurfaceView.class, "setSecure", boolean.class,
removeSetSecureHook);
}
private final XC_MethodHook removeSecureFlagHook = new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if ((Integer) param.args[0] == WindowManager.LayoutParams.FLAG_SECURE){
param.args[0] = 0;
XposedBridge.log("Anti Screenshot : 已阻止" + packageName);
}
}
};
private final XC_MethodHook removeSetSecureHook = new XC_MethodHook() {
@Override
protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
param.args[0] = false;
XposedBridge.log("Anti Screenshot : 已阻止" + packageName);
}
};
}
简单测试一下闪图
Yes!成功看到了茄子!
此时,在Xposed log我们可以看到
Yes!本文结束,后会有期!
参考:
Xposed模块开发指南 https://yuanfentiank789.github.io/2017/04/01/xposeddev/
DisableFlagSecure https://github.com/veeti/DisableFlagSecure
E
N
D
关
于
我
们
Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。
团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室,近三年来在网络安全技术方面开展研发项目60余项,获得各类自主知识产权30余项,省市级科技项目立项20余项,研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。对安全感兴趣的小伙伴可以加入或关注我们。
我知道你在看哟