某APP设备风控分析及绕过 原文标题:[原创]某APP设备风控分析及绕过
内容概要总结
本文分析某 APP 的设备风控并尝试绕过。作者发现该 APP 使用 OKHttp,在专门的 intercept 中额外注入 Header:v-mode 表示是否使用 VPN(使用 VPN 注册会被拦截),KEY1 疑似设备 id、KEY2 疑似风控数据。随后定位到 native 函数 siua(偏移 0x8da04),其返回值经 do_compress_and_encrypt 处理,base64 编码前的数据以 78da 开头,即 zlib 压缩后的环境数据,解压后含风险项,据此判断拦截发生在环境检测环节。
核心结论:作者用 frida 绕过实时环境检测后仍被封号,说明设备已被标记或存在其他上报口径;风控 SDK 还通过 detect 函数(偏移 0x8d904)上报设备 id 与 Magisk 检测结果,并借助 /proc/self/attr/prev(正常进程 prev 为 init,Magisk 接管后为 zygote)和 /proc/self/mountinfo 检测 Magisk。
原文内容(原文即中文)
38111
[[原创]某APP设备风控分析及绕过](https://bbs.kanxue.com/thread-288034.htm)
本文章内容仅用于逆向学习,请勿用于黑产行为,如有侵权,请联系本人删除,未经本人允许,不可转载。

搜索 google_login,查看到了疑似google登录的协议:

交叉引用,发送协议的参数貌似只有google登录用的token:

既然使用的是 OKHttp框架,那么一定会在 intercept 里加上额外的Header 。
通过hook 设置Header的函数,输出会额外设置哪些可疑的字段:
v-mode 表示有没有使用VPN,如果有使用VPN ,注册时会被拦截
KEY1 保密 像是一个设备id,KEY2 保密 像是一个风控数据。
果然,这些字段都是在专门的intercept中被添加的:


siua函数是一个native层函数。先找到native层地址,位于 0x8da04 :
[RegisterNatives] java_class: 手动混淆包名 name: siua sig: (Landroid/content/Context;)Ljava/lang/String; fnPtr: 0x71a56e3a04 module_name: 保密.so9K6b7g2)9J5c8W2)9J5c8X3I4A6j5X3I4A6N6r3g2&6k6g2)9J5k6i4y4G2i4K6u0r3) module_base: 0x71a5656000 offset: 0x8da04
native层函数返回时,调用了 env→NewStringUtf8,即地址 [SP,#0x1C0+var_1A8] 存放了最终加密后的字符串。
前面没有看到对 SP,#0x1C0+var_1A8 地址的直接赋值或者传递,但是看到了对 SP,#0x1C0+var_1B8 地址的传递:
clang 或者 gcc 编译成的 c++代码中,string 对象一般占用 24个字节,字符串的实际地址,保存在string 对象的 +0x10处。
我们继续看 do_compress_and_encrypt 函数内部:
同样的最终在进行 base64_encode 后,将字符串地址保存到了参数1传入的string对象中。通过分析发现在 base64_encode 前调用了加密函数,我们不关系用了什么加密,直接输出加密前的数据:
78da1dc74112c............................................................................
二进制 0x78da,表示这是一个zlib压缩后的数据。继续解压得到了一串数据:
一串环境数据 --->. 风险项1-风险项2(详细数据自己分析)
从这里可以明显看出, 环境包里有风险项(具体是什么自己去分析)。所以应该是这里被拦截了。
我们通过一个简单的frida 脚本绕发过这里的风控拦截:


实时的环境检测绕过了还是被封号,要么设备被标记了,或者还存在别的环境上报口径。
风控SDK还提供了一个设备id接口:X-XXXX,如果设备被标记,或者设备存在环境问题,比如绕过设备ID。

这个设备id像是json串中的一个字段,应该是某个协议返回。

确实是协议返回,协议数据通过detect函数返回,也是安全SDK的一个native函数,地址位于 0x8d904。
[RegisterNatives] java_class: 手动混淆类名 name: detect sig: (Landroid/content/Context;)Ljava/lang/String; fnPtr: 0x71a56e3904 module_name: 保密.so module_base: 0x71a5656000 offset: 0x8d904。
上报内容有点多,包含了设备ID和 magisk 检测等设备风控数据,需要一一绕过。
通过检测进程 /proc/self/attr/prev属性信息,正常app是通过 zygote直接fork而来,因此 prev标记为 init,而 magisk 中间接管了一层,因此 app的 prev 是 zygote。
由于magisk默认没有开启 magiskhide(开启hide后无法注入lsposed插件),因此app通过检测挂载信息可以检测到magisk :fopen: /proc/self/mountinfo。
很明显,函数 sub_4A618 通过打开 /proc/self/attr/prev 获取到文件句柄,然后读取文件内容,来检测magisk。因此前面是对 /proc/self/attr/prev 这个字符串的解密还原。
最后于 2025-10-20 16:46
被CCTV果冻爽编辑
,原因:
赞赏
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
我不是卷王
6666
能力值:
( LV2,RANK:10 )
在线值:
能力值:
( LV2,RANK:10 )
在线值:
能力值:
( LV7,RANK:100 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV2,RANK:10 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV2,RANK:10 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV2,RANK:10 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV1,RANK:0 )
在线值:
能力值:
( LV2,RANK:10 )
在线值:
能力值:
( LV2,RANK:10 )
在线值:
能力值:
( LV2,RANK:10 )
在线值:
- [[原创]通过抢茅台学习 IOS 逆向分析](https://bbs.kanxue.com/thread-289881.htm)
26860
- [[原创]某SDK搜集设备信息的快速逆向分析](https://bbs.kanxue.com/thread-289356.htm)
13468
- [原创]某APP设备风控分析及绕过
38107
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
赞赏



我已同意
《看雪服务条款》
《看雪课程免责声明》


首次使用微信验证码登录,请绑定已有帐号。绑定后可一键登录,无需手机号和密码。


首次使用微信验证码登录,请绑定已有帐号。绑定后可一键登录,无需手机号和密码。
求助问答申诉
举报此帖
申请推荐此帖
游客下载提示
文中图片(共 7 张)






