目录:
1.1、风控概述
几乎所有的APP运营人员都会接触到渠道推广。这些渠道推广可能是付费渠道,可能是免费渠道,无论是哪一种渠道推广,都是需要我们付出成本的。在与渠道打交道的过程中,有时候涉及到跟渠道分成或者跟渠道合作,我们需要统计从渠道获取的用户的数量;有时候涉及到渠道付费,我们需要鉴别渠道用户的质量的好坏,控制并提高渠道的效果。
可能存在渠道都投放了,点击量也特别高,但激活量只有个位数。也有可能点击激活数量都很高,但是留存率很低。费用都花光了,但是效果没有出来。
有流量的地方就有作弊,渠道可以通过批量机器或模拟器模拟下载,以及通过人工或者技术手段修改设备信息、破解反作弊SDK方式发送虚拟信息、模拟下载激活APP等等
目前主流的反作弊方式为企业自研或使用第三方反作弊服务,APP端集成SDK,通过用户上网设备的硬件、网络、环境等设备特征信息生成设备指纹, 生成可抗黑产破解的设备唯一标识。作为纵深防御风控体系下的重要工具,可实现对终端设备上的风险环境识别、风险检测及行为风险分析。
1.2、工作流程
设备反作弊服务时的调用过程如图1-1所示:
图1-1
业务客户端需要集成反作弊客户端SDK,包括安卓,iOS,H5,小程序等;通过反作弊SDK采集的设备信息可以生成设备指纹与判断设备是否安全。
反作弊SDK通过采集设备的硬件、网络、环境等特征信息生成设备的唯一标识,可以侦测模拟器、刷机改机、root越狱、劫持注入等风险,配合风控策略,可以对抗设备伪造改机、自动注册、渠道作弊行为。整体框架如图2-1所示:
图2-1
3.1、init接口
init:初始化SDK
getToken:调用getToken接口获取token,每次调用返回不同的token值。一般由用户操作(提交等)来触发getToken,一个token只能使用一次,如果在同一个页面中,允许用户多次操作,请多次调用getToken接口以获取不同的token;提交token:将token作为请求参数提交到业务方后端。
3.2、静态与动态
采集设备信息分为静态与动态分别上报。
private a c(String arg7) {
private int a() {
3.3、注册native方法
so层字符串xor加密
.text:000000775DC53154 0C 7D C9 9B UMULH X12, X8, X9
反调试检测TracerPid:
RegisterNatives 注册native方法
.text:000000775DC551D4 68 02 40 F9 LDR X8, [X19]
4.1、设备采集
获取MAC
重要的设备信息通过SVC 0 方式与system_property获取:
wifi.interface
其它设备信息主要通过反射获取。
.text:0000006C1469FDA4 FF 43 02 D1 SUB SP, SP, #0x90
4.2、环境风险检测
检测xposed,查找进程模块。
.text:0000006C134C64A8 E8 1F 40 F9 LDR X8, [SP,#0x2D0+var_298]
检测magisk,读取/proc/mounts判断是否有特征
.text:0000006C134FCDE4 88 06 40 F9 LDR X8, [X20,#8]
检测模拟器特征
name=51-3||1@/./init.android_x86.rc||1@/system/./lib/libhoudini.so||1@/data/./data/com.anddoes.launcher||1@/data/./data/com.bluestacks.settings name=Ludashi||1@/init.ludashi.rc||1@/system/bin/ludashi-prop||1@/system/lib/arm/libhoudini.so name=TencentAo1||1@/init.vbox86.rc||1@/dev/socket/genyd||2@ro.product.brand: tencent||1@/system/lib/libhoudini_408p.so name=lgshouyou||1@/system/lib/libc_malloc_debug_qemu.so||1@/system/lib/libldutils.so||1@/init.android_x86.rc||2@init.svc.ldinit: name=TencentAo2||1@/init.vbox.rc||1@/dev/socket/genyd||2@ro.product.brand: tencent||1@/system/lib/libhoudini_408p.so name=Netease1||1@/init.x86.rc||2@nemud.vt.status: ||2@nemud.device.id: ||1@/sys/kernel/debug/x86||1@/sys/module/nemusf name=LeiDian4||2@init.svc.ldinit: ||1@/system/lib/libldutils.so||1@/system/lib/arm/libhoudini.so name=Leyou||1@/init.vbox2345_x86.rc||1@/system/bin/lybox_sf||1@/system/lib/liblybox_prop.so||1@/data/data/com.emulator.app.market name=TianTian2||1@/fstab.ttVM_x86||1@/system/bin/ttVM-vbox-sf||3@com.tiantian.ime name=Netease2||1@/init.cancro.rc||2@nemud.vt.status: ||2@nemud.device.id: ||1@/sys/kernel/debug/x86||1@/sys/module/nemusf name=LeiDian5||1@/init.android_x86.rc||2@init.svc.ldinit: ||2@ro.hardware.gps: ld||5@/system/lib/arm/libhoudini.so name=TencentAo3||5@libhoudini_415c.so name=LeiDian6||2@init.svc.ldinit: ||2@ro.hardware.gps: ld||5@/system/lib/arm/libhoudini.so name=Peak||1@/init.androidVM_x86.rc||2@init.svc.pkVM_x86-setup: ||1@/data/data/com.pk.peak.launcher3 name=NOX6079||1@/system/./bin/nox||1@/system/./lib/libnoxd.so||1@/system/./lib/libhoudini.so name=xDroid||2@init.svc.xdroidd: ||2@ro.product.name: xdroid||2@ro.xdroid: ||5@/system/lib/libhoudini.so name=Sina||1@/system/lib/libc_malloc_debug_qemu.so||1@/init.x86.rc||1@/x86.prop||1@/data/data/org.adwfreak.launcher name=BlueStacks255||1@/./init.x86.rc||1@/data/./data/com.bluestacks.appmart||1@/data/./data/com.bluestacks.settings name=XiaoYao5119||1@/init.intel.rc||1@/data/data/com.microvirt.launcher||1@/data/data/com.microvirt.market name=TianTian1||1@/system/bin/ttVM-prop||1@/init.ttVM_x86.rc||2@init.svc.ttVM_x86-setup: ||1@/data/data/com.tiantian.ime name=LeiDian1||1@/system/lib/libc_malloc_debug_qemu.so||1@/system/lib/libldutils.so||1@/init.android_x86.rc||2@init.svc.ldinit: ||3@com.android.flysilkworm name=ChangWan||1@/system/bin/androVM-prop||1@/dev/socket/genyd||1@/init.vbox86p.rc||2@init.svc.vbox86-setup: ||1@/data/data/cn.itools.vm.launcher name=YZZ||1@/init.x86.rc||1@/x86.prop||1@/data/data/cn.yzz.app.launcher name=QingTing||1@/init.x86.rc||1@/x86.prop||1@/data/data/com.pop.store name=DuoWan||1@/init.x86.rc||1@/x86.prop||1@/data/data/com.duowan.coreserver name=9981||1@/system/lib/libdroidbox-ril.so||1@/system/bin/droidbox-prop||1@/init.droidbox.rc||2@ro.kernel.droidbox: ||1@/data/data/com.droidbox.market name=StartLight||1@/system/bin/droid4x-prop||1@/system/lib/libdroid4x.so||1@/init.vbox86.rc||2@init.svc.droid4x: ||1@/data/data/com.starlight.helper.task name=KaopuBlueStacks||1@/system/lib/libKaopuSdk.so||1@/init.x86.rc||1@/x86.prop||1@/data/data/com.kapou.launcher name=KaopuTianTian||1@/system/bin/ttVM-prop||1@/init.ttVM_x86.rc||1@/system/lib/libKaopuSdk.so||2@init.svc.ttVM_x86-setup: ||1@/data/data/com.kapou.launcher name=51||1@/x86.prop||1@/init.x86.rc||2@ro.product.oem: 51mnq||1@/data/data/com.anddoes.launcher name=Nox||2@init.svc.noxd: name=XiaoYao||1@/system/bin/microvirt-prop||1@/system/lib/libmicrovirt.so||2@init.svc.vbox86-setup: ||2@init.svc.microvirtd: ||1@/data/data/com.microvirt.launcher name=Netease3||1@/system/bin/nemuVM-prop||1@/x86.prop||2@init.svc.nemu-service: ||1@/data/data/com.netease.nemu_android_launcher.nemu name=TencentAo4||1@/init.vbox86.rc||1@/dev/socket/genyd||3@com.tencent.tinput name=DDZS||1@/system/lib/libc_malloc_debug_qemu.so-arm||1@/init.x86.rc||1@/x86.prop||1@/data/data/com.kapou.launcher||1@/data/data/com.ddzs.mkt name=Droid4X||1@/system/bin/droid4x-prop||1@/system/lib/libdroid4x.so||2@init.svc.droid4x: ||1@/data/data/me.haima.androidassist name=Phoenix9||1@/init.android_x86_64.rc||1@/system/lib/libhoudini.so||1@/data/data/com.chaozhuo.filemanager.phoenixos
4.3、采集后设备信息
{
5.1、生成随机AES KEY
.text:0000006C14667914 FF 43 02 D1 SUB SP, SP, #0x90
5.2、加密AES KEY
RSA公钥加密AES KEY
.text:0000006C1466A300 FF 43 03 D1 SUB SP, SP, #0xD0
5.3、bae64加密RSA加密后AES KEY
.text:0000006C1466A60C F8 5F BC A9 STP X24, X23, [SP,#-0x10+var_30]!
6.1、AES还原
标准AES算法
/**
6.2、RSA公钥转换
从内存中提取出来的RSA公钥是pkcs#1格式需要转换成pkcs#8格式方便java使用。
public static byte[] formatPublicKeyPKCS1ToPKCS8(byte[] pkcs1PublicKeyByte) {
6.3、RSA加加密AES AEY
/**
6.4、加密采集的设备数据
AES加密后base64加加密
//AES加密设备信息数据
6.5、发送服务器返回设备指纹
将加密后的设备信息组合发送给服务器,服务器返回设备指纹。
public static String doPost(String serurl, byte[] body) throws MalformedURLException, HttpException {
通过还原的协议模拟,服务器成功返回
{"code":200,"msg":"ok","result":{"timestamp":1675833206592,"tid":"jBqlPTfZupNAUUUUUBOAeE37P0ZsamVQ","dt":"Zl/zPvkXgopBAEBEAReROVmuK0Y8PmQV","ni":"JyR+on5ZMtDZRV1lDWN+BiDWM3/osPKRJ4ZhDIMMuzbXVliI40BIsN7x0aETYmEZQU8\u003d"}}
移动端反作弊其中最重要的是能够唯一标识一台设备,是否够精确定位一个设备才能与其它设备数据、行为数据进行关联,从而判断一个设备的风险,设备指纹作为风控对抗的基础,判断其是否优质最重要指标是唯一性和稳定性。亿盾指纹从安卓11以后指纹稳定性相对较差,主要原因是几个关键的指纹生成特征未能获取到。
其中一些关键的信息采集svc 0方式获取,能防止常见的改机工具,但是深度ROM定制与更底层的改机很难防止。
样本获取方式,关注公众号,公众号输入框回复“xp” 获取下载链接。