本文仅作为个人技术学习与研究的记录,旨在分享逆向分析的思路和方法,不涉及也不鼓励任何形式的商业破解、盗版传播或非法用途。文中所有示例与操作均出于技术探讨目的,且涉及的关键信息已进行脱敏处理,不会影响或泄露实际软件的商业利益。
如有内容存在侵权或不当之处,请联系我,我将第一时间删除或修正。
本位为分享使用frida 绕过某企业办公软件禁止截图的设置 的过程
问题
如图,早上打开办公软件,收到了新设置不让截图的通知

打开app任意界面截图的时候,提示无法截图

分析
安卓提供app设置截图权限的api有
1、setFlags(flags, mask)
该方法属于 Window(通常通过 getWindow() 获取),调用 setFlags(flags, mask) 会先清除 mask 指定的位,然后设置 flags 指定的位。
常用于:设置或清除窗口属性,例如禁止截图、控制状态栏样式、窗口尺寸格式等。通过 getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE) 可彻底开启 不允许截图 功能。
2、addFlags(flags)
Window 的方法,用于向当前已有的窗口标志中“追加”指定的标志,即在原有 flags 基础上通过位或 (|) 增加新的标志。
常用于:使用addFlags(flags)中调用setFlags
当flag设置为0x2000的时候,即为设置了不允许截图

对上述api hook,定位到 设置的位置

根据调用栈推测,应该是 企业设置了 以后,后端会将某个标志数据一起传给app,当app登录该企业账号的时候就会更新设置

跟踪分析可以发现allPermissionData 里面就包含了对 是否允许截图 的设置标志
设置的条件是根据这个json文件中对MOBILE_SCREEN_PROTECT的设置

它是使用android.os.Handler 发送的这个json信息,hook相关发送的api ,定位到写入的地方
sendMessageAtTime(Message msg, long uptimeMillis)

对同步抓包中的数据包识别,根据代码中的"init"、”api"等关键字猜测大概率是这个传入设置

解决方案
绕过很简单,对setflags 的hook修改返回即可
var FLAG_SECURE = 0x2000;
console.log(" >>> Removing FLAG_SECURE so screenshot is allowed
结果:正常截图

目前就是实时的用frida测试了方案,如果需要长期融入日常使用可以转换成xposed脚本,结合lspatch也可以在无root的情况下使用。
对于其他禁止截图的APP本质上采用一样的方法。应该都可以绕过。因为手机截图毕竟都得用android本身的api,那么禁止的手段也是与其相关。