安卓软件签名工具主流安卓APP反作弊及反反作弊的⼀些思路和经验汇总
作弊检测
基于设备
1.检测是否存在危险APP包名
主要检测hook框架,模拟点击⼯具,magisk,supersu等root⼯具
2.检测是否存在危险Class
主要检测hook框架的安卓框架层包
3.检测是否存在root权限
⼀般通过是否存在bin、sbin⽬录⾥的su⽂件,kingroot权限管理apk
4.检测是否有调试状态
default.prop⽂件的ro.secure=1、ro.debuggable=1状态,/proc/self/status⽂件的TracerPid值
5.检测是否设备是否出⼚ROM
⼀般通过android.os.Build的各类参数值来判断,如Build.fingerprint
6.⼀些设备常规信息,⽐如电量状态,usb状态,屏幕亮度,地理位置,wifi或者sim卡信息,ip,mac等。
⼀般批量操作或者抹机操作的时候这些值更改难度和成本⽐较⼤,所以这些指标能伪造会⼤⼤降低被风控
基于⾏为
1.Log⽇志搜集
开发时有Log.i Log.e等运⾏⽇志,⼤部分APP⽤这个来调试或者检测APP的运⾏情况,并且release版本⼀般有个boolean值来开关,如果能hook掉这个开关就容易检测APP。
2.Exception栈信息搜集
⼤部分APP的⽇志会搜集Exception,如果栈⾥有hook框架的包路径就会把⾃⼰给杀死,让hook难以长久执⾏,怕APP变成⼀个微型服务器抓包⼯具。
3.统计sdk的信息,如talkingdata、umeng等
⼀般阿⾥系的会⽤umeng来做统计⼯具,⼀般这些sdk都有⾃⼰的唯⼀编号,有些app引⽤这个编号来做⼀个指标去判断app的安装唯⼀性,有的会通过统计数据来判断批量作弊⾏为,因为这些sdk会搜集⼀些设备指纹并且技术和破解还原难度⽐较⼤的。
4.异常上报sdk,⽐如buggly等
异常上报sdk⼀般记录运⾏时所有的异常情况,并且会记录设备指纹,通过这些也能检测到作弊的⼀些设备。
反反作弊⽅法及思路
当前主流APP的反作弊策略
1.搜集设备指纹
如数美易盾或者⼀些⼤的app都会内嵌搜集设备指纹的模块,通过设备指纹来确定设备的唯⼀性,如imei、android_id、mac、其他设备信息结合起来就能变成⼀个唯⼀的标志。
2.搜集IP、MAC地址、蓝⽛MAC、WIFI等⽹络指纹
⼤量的搜集后跟其他搜集的信息结合并且不断地完善代理ip和⿊ip、mac库,就能不断地能识别作弊源头。
3.地理位置、下载渠道、授权登录
地理位置和ip是否对应、信息是否对应、或者设备型号跟下载渠道对应、⼀般⼩⽶⼿机的软件⼤部分应该⼩⽶商城下载的,⽐如授权登录,QQ授权登录等、如果模拟授权登录需要破解其他给权的APP的⼀些协议。
4.参数签名、参数加密
⼀般APP会把get或者post的参数通过某种算法去签名,并且这个签名难还原。⽐如抖⾳的x-gorgon,有的把post或者get参数直接加密,⼀般通过aes、rsa、des等
5.私有⽹络协议、protobuf等协议、私有⽹络证书、反代理抓包
⽬前⽐较流⾏protobuf协议替代json,还有⼀些私有TCP/Socket协议,这些协议不可直接读,需要⼀个解析⼯具或者分析还原。私有⽹络证书需要证书密钥配合代理抓包⼯具才能抓包分析,这种其实难度在于到证书密钥和判断是否⽤了私有证书,⼀般聊天APP的IM协议常⽤。还有反代理抓包,⽐如集成OkHttp框架等的时候⽤Proxy.NO_Proxy来防⽌抓包。
6.dex代码混淆,native层ollvm编译、webview的js混淆
其实dex代码混淆还原或者分析难度⽐较容易,并且各种反编译软件来分析难度不是那么⼤,主要难度在于rxjava等异步框架,接⼝实现类查上。native层的话主要难度是还原基于ollvm的各种混淆的代码,其他还原或者理解难度其实并不⼤,并且⼤部分APP把⼀些加解密和签名等算法⽤native⽅式实现并⽤ollvm混淆,其他的native层的都是⼀些媒体或者⽹络等库。webview⼀般⽤在验证码上,并且⽤js的java层接⼝⼀起使⽤,把滑动或者图⽚顺序识别之类的路径⽇志通过贾母⽅式⽹络提交的,javascript代码⼀般混淆的⽐较厉害,不过AST 反混淆等⽅法或者下载后nginx本地搭建并chrome⾃⾏调试归纳后通过脚本也能还原,如极验、易盾等验证码插件。
7.APP加壳、安全sdk、私有安全插件
加壳其实纸⽼虎,安卓⾥dex⽂件总能运⾏内存中dump出来的,除⾮操作系统从底层设计上更改了,所有hook或者fart等修改的ROM都能搞定。360,腾讯,棒棒等等好多。安全sdk也可以纸⽼虎这么说,不过安全sdk⼀般跟机器学习,⼤数据匹配等相关,越来越有难度去应付,不过⼀般在社交电商类的反虚拟登录时⽤,这些SDK搜集指纹设备,并保存到⾃⼰的服务器,会识别代理IP,打码平台的卡号,风险设备,不过把加解密算法还原后可以伪造设备和其他数据,能绕过。还有⼀些⼤APP有⾃⼰开发的安全相关的模块,这些其实跟安全sdk类似,主要还是设备信息伪造和加解密算法破解后都能绕过。数美、易盾等。
反反作弊⼯具和策略
1.逆向⼯具
java:dex2jar,jadx,jeb,android-killer等等很多
so⽂件:IDA,jeb,Gidra
js:其实nodejs加⾕歌或者⽕狐就能搞定
其他:unicorn,unidibug等基于qemu虚拟机的⼯具
2.抓包⼯具
Charles、Fillder:这两个其实差不多,⽤于http、websocket等应⽤层抓包
WireShark:各种协议都能⽀持,需要更深⼊的⽹络协议技术基础
BurpSuite:可以开发⼀些插件,会开发就各种神操作把。
3.hook框架
xposed:⽤户⽐较多,尤其云控、控、那些化妆品,教育类、保险等销售类的都在⽤,市场规模⼤。
frida:⼀般开发者使⽤的多,快,⽆需重启,会js就会玩吧。
cydia:hook Native层的时候多⼀点,⽼开发者⽤的多。
inlinehook,xhook:这两个类似,inlinehook多⽤于hook b跳转的,xhook多⽤于系统函数。
magisk:安卓8以上xposed或者其他⼀些证书安装等⼯具都基于这个,这个其实未来深⼊研究的东西。
4.模拟点击
uiautomator :很多模拟点击软件基于这个,跟xposed结合开发⽐较合适,理解安卓开发的⼊门⽐较简单。
5.⾏业难度
ollvm混淆:逆向⾏业⽬前应该最头疼的就这个吧,主要原理时if-else改成while(true){switch() case:}了,
但是逆向成本变⾼了,并且各种延申的东西越来越多,需要经验和技术积累才能100%还原或破解。
机器学习风控策略:这个没有多年经验或者没有相当长的时间去摸索或者没跟班⼀个APP的成长的话很难对应,并且⼤部分都是通过养号,养设备等⽅式去对应,还有的是破解协议,并且伪造⼤量的设备信息,通过IP代理池,卡商和打码平台等第三⽅服务来维持。不过随着法律的完善和APP⾃⾝的风控体系健全对应成本越来越⾼,现在很难实现⼤批量账号登录注册。
结尾
总结的⼀些经验,有些没写,有些漏了,后期⼀个个细说。