freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

从0到1编写一个Xposed Module :Anti Screenshot
lushann 2021-12-25 19:26:09 686075
所属地 山东省

最近开始接触app测试,发现坑有些多,赤手空拳搞不定,决定开始学习xposed module的相关的操作。

毕竟“root==god”,要好好利用 root 来对app进行降维打击!

今天先解决某些app不能截图的问题,实测可bypass 某im的闪图功能、某支付软件的付款码界面、还有某银行app。

1599131155-92175.jpg

代码已开源到GitHub,并且还有现成的Release等你下载!

Github Repo:https://github.com/runtimed/Anti-Screenshot

Release: https://github.com/runtimed/Anti-Screenshot/releases

正文Start

毕竟是从0到1的一篇文章,基本流程还得走走。

一、环境准备

已经配置好xposed环境的测试机一枚

准备好一份XposedBridge API jar:https://forum.xda-developers.com/xposed/xposed-api-changelog-developer-news-t2714067

二、项目初始化

1.Android Studio 新建项目

这里新建一个 Empty Activity的项目

说明:

如果选择No Activity 的话,在studio里边没办法直接安装到测试机上进行测试,因为没有actvity。模块开发结束后,可以把activity删掉,然后生成签名的apk,这样安装后,模块不会在桌面生成图标,完美。

我寻思了一下,我会用到的测试机,Android版本最低也是8.1,所以就把Minimum SDK设置成 8.0 了。

2.编写xposed module 基本信息

在src/main/res/values/strings.xml中添加如下:

<string name="xposed_description">强制截屏 @lushan</string>

在AndroidManifest.xml文件中,<application>标签内部添加以下代码

<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" />

如图:

image.png

3.加载 XposedBridge API 包

将XposedBridgeApi包拷贝到libs下,然后右键 Add As Library:

image.png

在app文件夹下的build.gradle中检查 dependencies块中的内容

image.png

说明:网上的教程大多数写的是用 provided,该关键字已被 compileOnly 取代。

如果本步骤设置不当,xposed框架会打印如下log:

4.新建Xposed module 入口函数

image.png

函数体:

public class HookMain implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
    
    }
}

咱们在这一步呢,先写个空的入口函数,内部逻辑以后再写。

5.指定 Xposed module 入口函数

在src/main下,新建 assets/xposed_init , 文件内容为包名+入口函数名

image.png


到这儿,一个xposed module的雏形就差不多完成了,接下来我们需要完善相关的Hook逻辑,不过我们现在可以执行一下,看一下啥效果

image.png

xposed 框架能够正确识别到这是个 module,并且能够显示之前设置好的 module 基本信息。

1599131749.gif!small

三、分析Android禁止截屏相关函数

总的来说,经过我的细致观察,Android提供的禁止截屏的方法,最终都是给“Display“这个类,增加“FLAG_SECURE”属性

下边是官方文档关于如何设定 “FLAG_SECURE“的方法:

An application creates a window with a secure surface by specifying the WindowManager.LayoutParams#FLAG_SECUREwindow flag. Likewise, an application creates a SurfaceView with a secure surface by calling SurfaceView#setSecure before 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 方法。

接下来好好看一下相关的函数,以备Hook之用。

1. 指定window flag

可以通过以下两个方法实现:

window.setFlag(WindowManager.LayoutParams.FLAG_SECURE)

image.png

文档:https://developer.android.com/reference/android/view/Window#setFlags(int,%20int)

window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)

image.png

https://developer.android.com/reference/android/view/Window#addFlags(int)

2.SurfaceView.setSecure

image.png

https://developer.android.com/reference/android/view/SurfaceView#setSecure(boolean)

综上所述,咱们需要hook三个函数。

四、完成 module 编写

其实逻辑还挺简单的,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);
        }
    };

}

五、测试

保证在Xposed框架中启用这个模块之后,咱们简单测试一下闪图

image.png

image.png

Yes!成功看到了茄子!

此时,在Xposed的 log 界面我们可以看到:

1599132661.png!small

Yes!本文结束,模块相关问题请提issus,告辞

参考:

Xposed模块开发指南 https://yuanfentiank789.github.io/2017/04/01/xposeddev/

DisableFlagSecure https://github.com/veeti/DisableFlagSecure

# xposed # Android应用程序
本文为 lushann 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
TideSec
lushann LV.1
这家伙太懒了,还未填写个人描述!
  • 1 文章数
  • 3 关注者
文章目录