DeviceCheck 防护方案探讨

0x01 大厂用来判断新增

  • 别的大厂app是这么做的,只要来一次DeviceCheckInfo,你标识一次,下次这个指纹来,在你的app上是新注册的,但dchck已经标识过了,就可以说明被改了

0x02 我想用来判断3日活跃7日活跃

  • 因为我们的app需要投放广告到各个渠道让别人打开我们的app.有些渠道会通过改机去拉起我的app(白白损失广告费).
  • 所以想通过这个来存储下(3日活跃7日活跃这两个状态)到时候和设备指纹去比较.如果设备指纹显示3日没有拉活,但是DeviceCheckInfo却显示有拉活就直接风控这个设备,此次拉起不做记数据
  • 0x03 还可以通过DeviceCheckInfo的上次修改时间来做一些和设备指纹上次打开app的时间来做下风控判断

0x03 想问下0x02的方案大家绕过成本高不高.或者有别的防刷量方案也可以指点下

0x04 大概看了下token生成逻辑.因为群里很多大佬都说他们可以批量生产DeviceCheck的token.所以肯定还是能绕过

生成token的函数 _encryptData:serverSyncedDate:error:大致流程

1. 初始化和日志记录

函数开始时,获取并保留参数a3a4,并记录日志消息“Encrypting data…”。

2. 获取客户端App ID并进行编码

函数通过-[DCContext clientAppID]获取客户端应用ID,并使用sel_dataUsingEncoding_进行编码,获取其字节长度和字节内容。

3. 准备数据缓冲区

函数分配内存以容纳需要加密的数据,包括客户端App ID的字节长度和内容。

4. 使用AES-GCM进行加密准备

函数通过调用ccaes_gcm_encrypt_mode()来获取AES-GCM模式,并准备必要的缓冲区和变量。

5. 创建密钥引用

函数使用aks_ref_key_create创建一个密钥引用,并获取公钥。如果公钥长度不符合预期,则记录错误日志并返回。

6. 打印公钥和计算ECDH共享密钥

函数打印随机生成的公钥,然后通过调用aks_ref_key_compute_key计算ECDH共享密钥,并将其打印出来。

7. 使用HKDF派生密钥和初始化向量

函数使用cchkdf函数,通过HKDF从共享密钥中派生出加密密钥和初始化向量(IV),并分别打印出来。

8. 使用AES-GCM进行加密

函数调用ccgcm_one_shot使用AES-GCM模式对数据进行加密,并打印生成的标签(tag)。

9. 处理加密结果并释放资源

函数处理加密结果,创建NSData对象保存加密数据,并记录二进制日志。最后,释放所有分配的资源并返回结果。通过以上分析来看.函数内部没有唯一标识符.所以关键点在于证书.继续分析下证书有没有被伪造的可能

使用的加密算法

  1. AES-GCM:高级加密标准(AES)的一种运行模式,结合了计数器模式和伽罗华域认证,提供高效的加密和数据认证。
  2. ECDH:基于椭圆曲线的Diffie-Hellman密钥交换协议,用于安全地交换密钥。
  3. HKDF:基于HMAC的密钥提取和扩展函数,用于从原始密钥材料中派生高质量的密钥。
2 个赞

数字布丁。。。。。。。。。

绕不过去的

1 个赞

好,那我就放心了

狠活啊

1 个赞

继续研究这个函数的第二个参数也就是证书的生成逻辑!同时也想问下.如果证书确实能够伪造.该如何防御

不可能伪造, 除非rsa2048被破解

来私发我微信我加你我拉你进群和已经批量伪造的大佬们探讨下

证书的生成与刷机时的激活流程有关,应该是不能伪造的。不知道你说的大佬是用什么方法,如果是类似中间人的方式拿token,那这个批量伪造可就没啥意思

改机激活获取证书

1 个赞