本文仅限学习交流,请勿用于非法以及商业用途,由于时间和水平有限,文中错漏之处在所难免,敬请各位大佬多多批评指正。
目录:
对旧版产品本感兴趣的可以移步到这里: 旧版产品
App防护提供的SDK安全方案解决以下原生App端的安全问题:
恶意注册、撞库、暴力破解
针对App的大流量CC攻击
短信、验证码接口被刷
薅羊毛、抢红包
恶意秒杀限时限购商品
恶意查票、刷票(例如,机票、酒店等场景)
价值资讯爬取(例如,价格、征信、融资、小说等内容)
机器批量投票
灌水、恶意评论
注册登录,提交配置,获取APPKEY与SDK,APP中集成SDK后可以在后台开启App防护状态开关,并设置App防护策略,流程如图1-2所示:
图1-2
App集成SDK主要用于对通过App客户端发起的请求时对请求体进行签名发送到应用服务器。WAF服务端获得应用服务器收到的请求后,通过解析校验签名串(wToken)进行风险识别、拦截恶意请求,识别App业务中的风险,实现App防护的目的。它整体的框架如图2-1所示:
图2-1
SDK初始化接口定义:
int init(Context context, String appkey, int type);
功能:初始化SDK,执行一次初始化采集。一次初始化采集表示采集一次终端设备信息,您可以根据业务的不同,重新调用init函数进行初始化采集。
初始化采集分为两种模式:采集全量数据、采集除需授权字段外的数据(不采集涉及终端设备用户隐私的字段,包括:imei、imsi、simSerial、wifiMac、wifiList、bluetoothMac)。
接口参数:
:Context类型,传入您应用的上下文。
:String类型,设置为您的SDK认证密钥。
:CollectType类型,设置采集模式。取值:
DEFAULT:表示采集全量数据。
NO_GRANTED:表示采集除需授权字段外的数据。
返回值:int类型,返回初始化结果,0表示成功,-1表示失败。
加载so与定义几个Native方法:
public class TigerTallyAPI {
Native方法说明:
.text:CB138170 F2 F7 16 F8 BL Dec_RiskString_sub_CEE741A0
Native层JNI_OnLoad:
解密字符串,so中字符串都是加密的,全部解密方法如下:
.text:CB129D30 DecString_loc_CEE73D30
注册Native方法:
解密Native方法名
.data.rel.ro:CB215C28 ; "_genericNt"
注册方法
.text:CB1381D8 F1 F7 AA FD BL DecString_loc_CEE73D30 ; com/aliyun/TigerTally/TigerTallyAPI
获取java层传入的sdk appkey
.text:CB131490 getString_sub_CF0FF490
获取到的sdk appkey
E2CAD3C0 73 76 67 46 39 77 6B 42 42 62 36 32 62 7A 70 78 svgF9wkBBb62bzpx
Base64与AES解密appkey
.text:CB18E1C0 DecAppkey_SplitStr_sub_CF15C1C0
解密后得到几个字符串,后续做为密钥:
55b4dc20eaf2a88a|0ea7_7dfd964a-0377-4188-ada7-0758b4f7f63b|ff4b_b5c0d0a4-4763-44e8-baa6-dfca9a66efdb
"com.thirdparty.superuser"
检测magisk
/sbin/.magisk
检测xposed
getSystemClassLoader
检测多开
io.va.exposed64
检测frida
查找内存中特征
检测hook
.text:C70EF776 check_start_loc_C472C776
检测调试
//TracerPid
统一入口,动态调用不同的方法获取设备信息
.text:C70C5350
JNI反射调用forName、getDeclaredMethod获取设备信息
.text:C70F02D8 call_getDeclaredMethod_loc_C4AB92D8
获取完一组信息后单条加密:
.text:C711C232 vm_enc_Deviceinfo_sub_D5C4A232
最终会走到VM_Entrance_loc_CDF4C384中进行加密,90%的功能都是在这里面动态调用不同方法完成的。
.text:C711C384 VM_Entrance_loc_CDF4C384
组合设备信息再次加密:
组合加密后的设备信息
.text:C7112E44 getbody_crc_sub_CDA4AE44 ; CODE XREF: getinfo_sub_CDF805D0+69C↑p
组合后数据(部分)
//组合请求体 计算设备信息crc 第10位起是crc
压缩加密组合后数据
.text:C7117244 vm_enc_body_sub_C8E49244
生成AES密钥
计算 7dfd964a-0377-4188-ada7-0758b4f7f63b 的md5值,该值为sdk appkey解密出来的
计算后的MD5值
C7094F80 CB C5 B0 32 9C 91 1A 82 0D F1 0C 30 6D 81 99 10
AES 加密
//初始化key
加密后(部分)
DE749300 21 90 DA C9 7A 71 49 C4 0C 6F E0 87 66 88 21 9B !...zqI..o....!.
发送服务器请求设备指纹:
反射java层发送网络请求
.text:C70C7244 postnet_sub_C8DF9244
存储服务器返回的设备指纹:
.text:C70C65E0 t4_save_TT_COOKIEID_sd_data_sub_CDB195E0
我是小三,目前从事软件安全相关工作,虽己工作多年,但内心依然有着执着的追求,信奉终身成长,不定义自己,热爱技术但不拘泥于技术,爱好分享,喜欢读书和乐于结交朋友,欢迎加我微信与我交朋友(公众号输入框回复“wx”即可)