首页
社区
课程
招聘
[原创]某大厂风控引擎SDK设备指纹和环境检测分析
2024-3-13 18:15 15123

[原创]某大厂风控引擎SDK设备指纹和环境检测分析

2024-3-13 18:15
15123

前言:

闲来无事,花了亿点时间将某大厂的风控引擎sdk看了一遍,主要分析对象是sdk里面的libNetHTProtect.so。

通过初步分析,请求网址/v4/c是初始化的步骤,请求网址/v4/a/up就是关键的设备参数的上传。

每次登录的操作都会发送这个请求,看来这个包应该就是数据上传的点了,不过很可惜,数据加密了,先到so里去定位吧。


不过当我进到so里的时候,发现so中的字符串都被加密了,运行时才会解密并且是在栈空间里面储存。

不过好在算法很简单,就是异或或者其他的运算,写个脚本批量解就好了,这里大约有5000多行:

即使如此,还是有部分算法没解出来,不过不要灰心,由于解密之后会放到一个栈空间中,之后这块内存将被回收,hook下free函数,也能打印出不少东西:

这些数据就成为线索了,解密出一部分数据之后,找到上面的/v4/a/up的链接,很快就能分析出对应的请求函数了。

这里它是反射java层的函数去请求的,在请求之前就将数据加密了。

请求的数据在收集完成之后,使用protobuf序列化方便传输,然后就被送进加密函数里加密了,数据在请求前放到sub_2CD2A8中去加密,加密算法简单看了下是AES,并且key是随机生成的

这里就不逆加密算法了,直接上frida,把原始protobuf数据拿到手。由于网络请求基本上都会走这里,所以在hook这个函数的同时,hook他的上一跳函数,把请求的URL也打印出来,代码很简单:

 

  function hook_2CD2A8() {
    var so_name = "libNetHTProtect.so"; // hook的so名称
    var so_base = Module.findBaseAddress(so_name);
    var offset__exit = 0x2CD2A8;
    var true_add = so_base.add(offset__exit);
    var flag_ptr_exit = new NativePointer(true_add);
    Interceptor.attach(flag_ptr_exit, {
      onEnter: function (args) {
        var lenx = Memory.readInt(ptr(args[1]).add(0x8));
        console.log("请求数据:"+ hexdump(Memory.readPointer(ptr(args[1]).add(0x10)), { length: lenx }));
      },
      onLeave: function (retval) {
      },
    });
  }
  function hook_2A846C() {
    var so_name = "libNetHTProtect.so"; // hook的so名称
    var so_base = Module.findBaseAddress(so_name);
    var offset__exit = 0x2A846C;
    var true_add = so_base.add(offset__exit);
    var flag_ptr_exit = new NativePointer(true_add);
    Interceptor.attach(flag_ptr_exit, {
      onEnter: function (args) {
        console.log("访问URL:"+ Memory.readCString(args[0]) + Memory.readCString(args[1])  );
      },
      onLeave: function (retval) {
      },
    });
  }

这样就能把请求的protobuf数据拿到了。

然后再用protoc反序列化一下,差不多收集上传了有350多条数据。


详细的分析过程有点复杂,但可以大致将设备指纹和环境检测的项说明一下,看看大厂是怎么做的,大厂做的也是基本部分,大部分检测原理还是相似的。


由于这里差不多收集了300多项,这里把部分重点的收集项简单说一下.


设备指纹:

SD卡/storage/emulated/0下可用空间大小和总空间大小

基本思路是调用stat函数,去获取/storage/emulated/0目录下的块大小和总数据块数量,还有空闲块的数量。

代码逻辑很明显,通过syscall去调用statfs函数,然后获取stat结构体中的数据,最后算一下:

获取DRM ID

这个是很多大厂很核心的设备指纹,包括某美,某盾的sdk都在收集。

具体是通过dlsym去导入链接上libmediandk.so,然后调用getPropertyByteArray函数去获取:


system prop

这个也不说了,也是必收集的字段,通过system_property_get函数去获取,包括以下字段,其中既有与设备指纹相关的,比如说buildid和fingerprint等等,也有可以用于风控的(sys.usb.state,ro.setupwizard.mode这些

先看下通用的:

ro.build.version.release
ro.product.model
ro.product.brand
ro.boot.bootloader
ro.build.version.securitypatch
ro.build.version.incremental
gsm.version.baseband
gsm.version.ril-impl
ro.build.fingerprint
ro.build.description
ro.build.product
ro.boot.vbmeta.digest
ro.hardware
ro.product.name
ro.product.board
ro.recovery_id
ro.expect.recovery_id
ro.board.platform
ro.product.manufacturer
ro.product.device
sys.usb.state
ro.setupwizard.mode
ro.build.id
ro.build.tags
ro.build.type
ro.debuggable

然后还有一些不常见的,可能是其他厂商的设备中才会有的字段:

persist.sys.meid
vendor.serialno
sys.serialno
persist.sys.wififactorymac
ro.boot.deviceid
ro.rpmb.board
ro.vold.serialno
persist.oppo.wlan.macaddress
persist.sys.oppo.serialno
ril.serialnumber
ro.boot.ap_serial
ro.boot.uniqueno
persist.sys.oppo.opmuuid
persist.sys.oppo.nlp.id
persist.sys.oplus.nlp.id
persist.sys.dcs.hash
ro.ril.oem.sno
ro.ril.oem.psno
persist.vendor.sys.fp.uid
ro.ril.miui.imei0
ro.ril.miui.imei1
ro.ril.oem.imei
ro.ril.oem.meid
persist.radio.imei
persist.radio.imei1
persist.radio.imei2
persist.sys.lite.uid
persist.radio.serialno
vendor.boot.serialno
persist.sys.oneplus.serialno
ro.meizu.hardware.imei1
ro.meizu.hardware.imei2
ro.meizu.hardware.meid
ro.meizu.hardware.psn
ro.meizu.hardware.sn
persist.radio.factory_phone_sn
persist.radio.factory_sn
ro.meizu.serialno
ro.boot.psn
ro.boot.meid
ro.boot.imei1
ro.boot.imei2
ro.wifimac
ro.wifimac_2
ro.vendor.deviceid
ro.isn
ro.vendor.isn
persist.radio.device.imei
persist.radio.device.imei2
persist.radio.device.meid
persist.radio.device.meid2
persist.asus.serialno
sys.wifimac
sys.bt.address
persist.btpw.bredr
persist.radio.imei
persist.radio.imei2
persist.radio.meid
persist.radio.meid2
ro.boot.fpd.uid
ro.vendor.boot.serialno
ro.boot.wifimacaddr
persist.sys.wifi.mac
persist.sys.wifi_mac
sys.prop.writeimei
ril.gm.imei
ril.cdma.meid
ro.boot.em.did
ro.qchip.serialno
ro.ril.oem.btmac
ro.ril.oem.ifimac

还有一部分用于设备识别和风控的,我会在后面放出来。


设备标识

这个就很多了,比如说IMEI、androidID都可以作为设备标识,这里还是把它收集的设备标识列出来。

大概就是这些:

uuid
ad_aaid
ReaperAssignedDeviceId
IMEI
mdm_uuid
ps_imei
op_security_uuid
ai_stored_imei
device_serial
通过stat获取文件的最近访问时间、最近修改时间、最近改变时间,Innode编号

这个也有很多大厂用了,主要针对以下一些文件和文件目录,读取文件结构体,然后上传修改时间等信息。

/sdcard/Android/data/.nomedia
/sdcard/Android/data/com.google.android.gms
/sdcard/
/storage/emulated/0

硬件相关

这个很常见,一般主要有:
cpu核心数以及最大频率

CPU型号

内存(RAM)可用空间和总空间

cpu支持的系统架构

屏幕亮度、屏幕尺寸和屏幕超时时间

传感器生产厂家和类型(重要)

显示设备厂商名称(GL_VENDOR)和渲染器名称(GL_RENDERER)(重要)

内部存储(EMMC或UFS闪存)的序列号:/sys/block/mmcblk0/device/serial  (核心)

显示设备序列号:/sys/devices/soc0/serial_number  (核心)

内部存储SD卡的CID:/sys/block/mmcblk0/device/cid(核心)

电池相关,例如电压、电池容量、电池温度、电池健康百分比、充电状态等

input设备相关,读取/proc/bus/input/devices,获取注册的input设备信息,比如Name和Sysfs。


网络相关

比较常见的就是局域网接口ip、mac、子网掩码、dns服务器列表了,这个就不说了,基本上就是SVC获取网卡的信息。


文件哈希

由于部分文件从系统安装后基本上不会有变化,因此很多大厂用了某些路径下的文件,通过一定的策略,比如说stat选择谋个目录下修改时间最早的(一般是1970年几月几日),然后将这个文件算个hash,或者直接调用getdents64函数,去获取某一目录下的文件和文件夹,按照修改时间从小到大排列起来,然后将排列起来的文件名算个hash,亦或者获取文件名+文件inode号(st_ino)+文件结构体长度(d_reclen),然后计算哈希。

总之策略有很多种,效果如何需要运营验证。

一般来说有几个重要的文件目录,大厂的处理方法具有相似性。

1、/data/system

2、/vendor/firmware

3、/system/bin

4、/vendor/lib

5、/system/framework

6、/system/fonts


boot id

cat命令读取/proc/sys/kernel/random/boot_id,这个也是大厂必用的一个关键的设备指纹字段。


apk路径

读取设备上的应用安装列表以及apk路径,然后选择部分包名的路径作为设备指纹。

比如微信的随机路径 ,作为核心的唯一设备指纹,只要你不卸载重装微信,这个随机的路径就不会有变化

例如:


输入法列表

有些SDK会收集设备上安装的输入法列表,一般来说国内的HMOV手机预装的是定制搜狗输入法,谷歌pixel是谷歌原生输入法。

举个栗子,这是SDK上传的输入法信息

获取输入法列表的方法:

ArrayList arrayList = new ArrayList();
InputMethodManager inputMethodManager = (InputMethodManager)context.getSystemService("input_method");            
List list = inputMethodManager.getInputMethodList();
Iterator iterator = list.iterator();
while(true) {
    if(!iterator.hasNext()) {
        return arrayList;
    }
Object object = iterator.next();
arrayList.add(((InputMethodInfo)object).toString());
}


环境检测:

、HOOK环境

在libNetHTProtect.so中主要检测了crc校验,还有frida和Xposed的一些特征:

1、检测frida的特征:

进程/proc/self/fd/目录,寻找是否存在关键字 linjector

/data/local/tmp/下是否存在re.frida.server

2、检测Xposed特征:

方法1:检测下列文件或文件路径是否存在:

/sbin/.magisk/modules/riru_lsposed
/data/adb/lspd
/sbin/.magisk/modules/zygisk_lsposed
/sbin/.magisk/modules/riru_edxposed
/data/misc/riru/modules/edxp
/data/adb/riru/modules/edxp.prop
/sbin/.magisk/modules/taichi
/data/misc/taichi
/sbin/.magisk/modules/dreamland
/data/misc/riru/modules/dreamland
/data/adb/riru/modules/dreamland
/system/bin/app_process.orig
/system/xposed.prop
/system/framework/XposedBridge.jar
/system/lib/
libxposed_art.so
/system/lib/
libxposed_art.so
.no_orig
/system/lib64/
libxposed_art.so
/system/lib64/
libxposed_art.so
.no_orig
/system/bin/app_process_zposed
/system/framework/ZposedBridge.jar
/system/lib/
libzposed_art.so

方法2:Hook loadClass加载类,检查程序加载的Class中是否包含名为de.robv.android.xposed.XposedBridge的类名路径。

方法3:遍历/data/data/目录,寻找有无以下包名:

de.robv.android.xposed.installer #Xposed框架
org.meowcat.edxposed.manager #EdXposed框架
com.tsng.hidemyapplist #隐藏应用列表
com.tsng.hidemyroot #隐藏Root
org.lsposed.manager #LSPosed框架
me.weishu.exp #VirtualXposed 太极
top.canyie.dreamland.manager #VirtualXposed 夢境
io.va.exposed #VirtualXposed 夢境
io.va.exposed64 #VirtualXposed 夢境
io.virtualapp #VirtualApp
io.virtualapp.sandvxposed64 #VirtualApp


3、libc的CRC校验

拿到proc/self/maps中libc.so的基地址,并计算ELF文件中.text+.rodata+.eh_frame+.eh_frame_hdr 段的CRC校验值。


二、机型和系统判定

1、检测是否是lineageOS系统,这个sdk主要的检测方法是:

1、查找是否存在特征文件:
/system/framework/org.lineageos.platform.jar
/system/framework/org.lineageos.hardware.jar
2、检测systemprop中是否存在:ro.lineage.build.version

2、检测是否是OpenHarmony系统,检测方法是:

检测systemprop中是否存在:ro.build.ohos.devicetype

3、检测品牌机系统和设备能否对应,检测方法是:

遍历/system/framework/下所有以.jar结尾的文件名称,与机型字符串进行比较(strcasestr比较,不区分大小写)

例如在vivo手机内,/system/framework/下存在以下文件,文件名中包含vivo:

、Bootloader解锁状态

检测bootloader是否已解锁。

方法1:检测props,主要检测项:

1、检测ro.boot.verifiedbootstate的值是否是orange
2、检测ro.secureboot.lockstate的值是否是unlocked
3、检测vendor.boot.vbmeta.device_state的值是否是unlocked
4、检测vendor.boot.verifiedbootstate的值是否是orange
5、检测ro.boot.vbmeta.device_state的值是否是unlocked
6、检测ro.boot.flash.locked的值是否是unlocked

方法2:获取sys.oem_unlock_allowed的值


、SIM卡

这个可以检测SIM卡是否存在,获取SIM卡的网络类型,SIM卡的ICCID等。

1.检测SIM卡是否存在,这个一般是读取props,获取gsm.sim.state这个的属性

2.获取SIM卡的网络运营商,通过系统服务TELEPHONY_SERVICE,然后调用getSubscriberId获取IMSIString,然后判断前5位:

中国地区的运营商以及对应的号段见下表:

中国移动 :46000,46002,46004,46007,46008
中国联通 :46001,46006,46009,46010
中国电信 :46003,46005,46011,46012
中国广电 :46015
港澳地区:
中国移动(香港) :45412,45413,45430
中国电信(香港) :45407
中国电信(澳门) :45502,45507


、截图工具和模拟点击工具

1.检测运行的服务中是否存在minicap、minitouch、stfservice、minitouchagent、stfagent、testminicap关键字。

2.检查/data/local/tmp/有无以下文件或文件目录:

minicap.so
minicap
minitouch
mini
mini/minicap
oat/arm64/scrcpy-server.odex
vysor.pwd
mobile_info.properties
tc/mobileagent
tc/input3.sh
tc/mainputjar7
com.cyjh.mobileanjian.id
com.cyjh.mobileanjianen.id
juejinAzykb/
minicap.so
juejinAzykb/TouchService.jar
mqc-scrcpy.jar
uiautomator-stub.jar
cloudtestig/cloudscreen
cloudtesting/touchserver
txysvr.apk
yijianwanservice.apk
screen-shread10x64.so
screen-shread5x32.so
maxpresent.jar
libtxysvr.so

3.检查应用安装列表

检查有没有安装下列模拟点击的应用:

com.cygery.repetitouch.pro
com.cyjh.mobileanjian
com.touchsprite.android
com.cjzs123.zhushou
com.touchspriteent.android
com.zidongdianji
org.autojs.autojspro
org.autojs.autojs
com.zdanjian.zdanjian
com.zdnewproject
com.ifengwoo.zyjdkj
com.angel.nrzs
com.cyjh.mobileanjian.vip
com.shumai.shudaxia
fun.tooling.clicker.cn
com.dianjiqi
com.miaodong.autoactionssss
com.mxz.wxautojiafujinderen
com.touchelf.app
com.stardust.scriptdroid
com.adinall.autoclick
com.i_cool.auto_clicker
com.kongshan.aidianji
com.xptech.catclicker
com.tingniu.autoclick
com.yicu.yichujifa
com.smallyin.autoclick
com.ksxkq.autoclick
com.x2.clicker
com.scott.autoclickhelper
com.auyou.auyouwzs

 检查有没有安装下列截图应用:

com.github.uiautomator
com.github.uiautomator2
com.sigma_rt.totalcontrol
com.genymobile.scrcpy


、模拟器

扫描常见的模拟器特征,主要检测的方法是:

1、是否存在以下文件目录:

/system/bin/ldinit
/system/bin/ldmountsf
/system/lib/libldutils.so
/system/bin/microvirt-prop
/system/lib/libdroid4x.so
/system/bin/windroyed
/system/lib/libnemuVMprop.so
/system/bin/microvirtd
/system/bin/nox-prop
/system/lib/libnoxspeedup.so
/data/property/persist.nox.simulator_version
/data/misc/profiles/ref/com.bignox.google.installer
/data/misc/profiles/ref/com.bignox.app.store.hd
/system/bin/ttVM-prop
/system/bin/droid4x-prop
/system/bin/duosconfig
/system/etc/xxzs_prop.sh
/system/etc/mumu-configs/device-prop-configs/mumu.config
/boot/bstsetup.env
/boot/bstmods
/system/xbin/bstk
/data/bluestacks.prop
/data/data/com.anrovmconfig
/data/data/com.bluestacks.appmart
/data/data/com.bluestacks.home
/data/data/com.microvirt.market
/dev/nemuguest
/data/data/com.microvirt.toolst
/data/data/com.mumu.launcher
/data/data/com.mumu.store
/data/data/com.netease.mumu.cloner
/system/bin/bstshutdown
/sys/module/bstinput
/sys/class/misc/bstXqpb
/system/phoenixos
/xbin/phoenix_compat
/init.dundi.rc
/system/etc/init.dundi.sh
/data/data/com.ddmnq.dundidevhelper
/init.andy.cloud.rc
/system/bin/xiaopiVM-prop
/system/bin/XCPlayer-prop
/system/lib/liblybox_prop.so
/system/bin/tencent_virtual_input
/vendor/bin/init.tencent.sh
/data/youwave_id
/dev/vboxguest
/dev/vboxuser
/sys/bus/pci/drivers/vboxguest
/sys/class/bdi/vboxsf-c
/sys/class/misc/vboxguest
/sys/class/misc/vboxuser
/sys/devices/virtual/bdi/vboxsf-c
/sys/devices/virtual/misc/vboxguest
/sys/devices/virtual/misc/vboxuser
/sys/module/vboxguest
/sys/module/vboxsf
/sys/module/vboxvideo
/system/bin/androVM-vbox-sf
/system/bin/androVM_setprop
/system/bin/get_androVM_host
/system/bin/mount.vboxsf
/system/etc/init.androVM.sh
/system/etc/init.buildroid.sh
/system/lib/vboxguest.ko
/system/lib/vboxsf.ko
/system/lib/vboxvideo.ko
/system/xbin/mount.vboxsf
/dev/goldfish_pipe
/sys/devices/virtual/misc/goldfish_pipe
/sys/module/goldfish_audio
/sys/module/goldfish_battery
/sys/module/kvm_intel/
/sys/module/kvm_amd/
/init.android_x86_64.rc
/init.android_x86.rc
/init.androidVM_x86.rc
/init.intel.rc
/init.vbox2345_x86.rc

2、system.prop下是否存在以下字段特征:

init.svc.microvirtd
bst.version
ro.phoenix.version.code
ro.phoenix.version.codename
init.svc.droid4x
microvirt.memu_version
microvirt.imsi
microvirt.simserial
ro.px.version.build
ro.phoenix.os.branch
init.svc.su_kpbs_daemon
init.svc.noxd
init.svc.ttVM_x86-setup
init.svc.xxkmsg
ro.bild.remixos.version
microvirt.mut
init.svc.ldinit
sys.tencent.os_version
sys.tencent.android_id
ro.genymotion.version
init.svc.pkVM_x86-setup
ro.andy.version
ro.build.version.release
ro.product.model
ro.product.brand
ro.boot.bootloader
ro.build.version.securitypatch
ro.build.version.incremental
gsm.version.baseband
gsm.version.ril-impl
ro.build.fingerprint
ro.build.description
ro.build.product
ro.boot.vbmeta.digest
ro.hardware
ro.product.name
ro.product.board
ro.recovery_id
ro.expect.recovery_id
ro.board.platform
ro.product.manufacturer
ro.product.device
sys.usb.state
ro.setupwizard.mode
ro.build.id
ro.build.tags
ro.build.type
ro.debuggable

3.检查挂载点,是否存在以下目录:

/mnt/shared/Sharefolder
/tiantian.conf
/data/share1
/hardware_device.conf
/mnt/shared/products
/mumu_hardware.conf
/Andy.conf
/mnt/windows/BstSharedFolder
/bst.conf
/mnt/shared/Applications
/ld.conf

检查挂载点,检查/proc/mounts中是否存在vboxsf字段.


4.检查是否安装了虚拟机软件:

1.VMOS虚拟机
方法1:运行服务查找:tomq_MANAGER_SERVICE
方法2:ROOT_DIR查找VMOS_SYS_NUM
方法3:/proc/self/root/data/data/查找包名:“com.vmos.app”、“com.vmos.pro”、“com.vmos.ggp”
方法4:props查找:vmprop.androidid、vmprop.dev_ashmem、vmprop.ip、ro.vmos.simplest.rom
2.X8沙箱
方法1:props查找:ro.x8.version、ro.x8.uuid
方法2:查找文件目录:/x8/config/root.pkg.blacklist、/x8/config/full_vm是否存在
3.51虚拟机
/proc/self/root/data/data/查找包名:“com.f1player”、“com.f1player.play”
4.虚拟精灵和虚拟大师
/proc/self/root/data/data/查找包名:com.pspace.vandroid、com.yiqiang.xmaster


、改机软件

1.检测是否安装了改机软件:

检查包名是否存在:
com.yztc.studio.plugin
com.soft.apk008v
com.uwish.app
zpp.wjy.xxsq
com.bigsing.changer
zap.fh.wipe
com.sollyu.xposed.hook.model
com.soft.apk008Tool
com.doubee.ig
com.variable.apkhook
com.addeasy.fastest
com.xenice.mask
com.shyl.artifact
com.android1500.androidfaker

2.检查/dev/wgzs目录下的内容是否存在,若存在则获取值:

wg.cust.config.phone.id
wg.cust.s_android_id
wg.cust.sys.prop.filter
wg.cust.config.phone.imeimackey
wg.cust.config.phone.imei
wg.cust.config.pkg.name
wg.cust.destUids


、Root和Root工具

1.包名检测,遍历/data/data/目录,寻找有无以下包名:

com.topjohnwu.magisk
eu.chainfire.supersu
com.noshufou.android.su
com.noshufou.android.su.elite
com.koushikdutta.superuser
com.thirdparty.superuser
com.yellowes.su
com.fox2code.mmm
io.github.vvb2060.magisk
com.kingroot.kinguser
com.kingo.root
com.smedialink.oneclickroot
com.zhiqupk.root.global
com.alephzain.framaroot
io.github.huskydg.magisk
me.weishu.kernelsu

2.检查su文件是否存在

/su/bin/su
/sbin/su
/data/local/xbin/su
/data/local/bin/su
/data/local/su
/system/xbin/su
/system/bin/su
/system/sd/xbin/su
/system/bin/failsafe/su
/system/bin/.ext/.su
/system/etc/.installed_su_daemon
/system/etc/.has_su_daemon
/system/xbin/sugote
/system/xbin/sugote-mksh
/system/xbin/supolicy
/system/etc/init.d/99SuperSUDaemon
/system/.supersu
/product/bin/su
/apex/com.android.runtime/bin/su
/apex/com.android.art/bin/su
/system_ext/bin/su
/system/xbin/bstk/su
/system/app/SuperUser/SuperUser.apk
/system/app/Superuser.apk
/system/xbin/mu_bak
/odm/bin/su
/vendor/bin/su
/vendor/xbin/su
/system/bin/.ext/su
/system/usr/we-need-root/su
/cache/su
/data/su
/dev/su
/system/bin/cph_su
/dev/com.koushikdutta.superuser.daemon
/system/xbin/daemonsu
/sbin/.mianju
/sbin/nvsu
/system/bin/.hid/su
/system/addon.d/99-magisk.sh

3.检查magisk相关文件是否存在

/cache/.disable_magisk
/dev/magisk/img
/sbin/.magisk
/cache/magisk.log
/data/adb/magisk
/system/etc/init/magisk
/system/etc/init/magisk.rc
/data/magisk.apk

4.检测Android PATH环境变量检测path路径下是否存在“/su”

5.检测 /proc/self/maps中的内容

1、检测 /proc/self/maps 是否存在名为“/memfd:/jit-cache”的段(加载zygisk模块时(也就是liblspd.so)的时候会讲其名称设置为jit-cache,这样的话so的内存段在maps中就是/memfd:/jit-cache)
2、通过检测map表是否存在匿名的并且具有可执行属性的内存判断是否存在lsposed
3、检测栈空间[stack]的权限是否为“rw-p”

6.检测ro.build.tags的值读取 /system/build.prop并检测ro.build.tags的值是否为“test-keys”

7.检测seLinux安全上下文cat /proc/%d/attr/prev检测app进程的selinux安全上下文是否为“u:r:zygote:s0”

8.检查/data/local/tmp/有无以下文件

shizuku
shizuku_starter



、ebpf检测

1、系统调用 prctl(PR_GET_SECCOMP)用来获取seccomp的状态,返回值为0时代表进程没有被施加seccomp,否则代表进程被施加seccomp。
2、系统调用 prctl(PR_GET_NO_NEW_PRIVS)获取线程的no_new_prives属性,值为0表示常规,值为1代表在特权中操作。


其他的都是比较常规的环境检测,比如VPN和代理USB调试和开发者状态是否开启了无障碍服务以及调试TracerPid等太多了就不一一列举了


除了上面比较普通的环境检测之外该大厂还引入了AI 检测模拟点击接口函数的原型是这样的:

看了下代码,我觉得原理就是adb shell -> getevent,当在手机屏幕点击某个指定的X,Y坐标位置后在命令行窗口可见监听到很多event类似以下内容

然后它将event的 [type] [code] [value] 全部上传了去做后端的AI检测

一种可能的判断策略猜测:

作弊和工作站的批量模拟点击,其获取的X,Y坐标位置等数据每次都相同,而真人使用设备的滑动点击操作,一定是随机的屏幕轨迹,不可能每次都是同样的X,Y坐标值。

这个SDK的AI模拟点击检测,可能就是将某一场景的触发屏幕操作的数据,上传到后台,后台通过上述策略完成判断这样就可以检测工作室的批量模拟点击了。




[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞34
打赏
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  mb_waaorftj   +1.00 2024/04/08 精品文章~
最新回复 (44)
雪    币: 651
活跃值: (3456)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Lnju 1 2024-3-13 18:36
2
0
感谢分享 先赞后看
雪    币: 7811
活跃值: (21271)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
随风而行aa 10 2024-3-13 18:41
3
0
感谢分享 先赞后看
雪    币: 29
活跃值: (5115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2024-3-13 19:07
4
1
你这个叫bpf检测,不叫ebpf检测
雪    币: 1898
活跃值: (1755)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
莫灰灰 9 2024-3-13 19:24
5
0
学习了
雪    币: 3663
活跃值: (3843)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 2024-3-13 19:36
6
0
感谢分享
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_ldbucrik 2024-3-14 07:15
7
0
感谢分享
雪    币: 1
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
李啊啊 2024-3-14 09:22
8
0
厉害了。。。
雪    币: 352
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_gbtepwge 2024-3-14 09:31
9
0

这不是**的嘛

最后于 2024-3-14 10:35 被kanxue编辑 ,原因:
雪    币: 19299
活跃值: (28938)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2024-3-14 09:38
10
1
感谢分享
雪    币: 814
活跃值: (623)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Aimees 2024-3-14 09:38
11
0
不吃早饭 你这个叫bpf检测,不叫ebpf检测
感谢指出,具体的原理我再研究研究,不过这个肯定是检测seccomp过滤模式的
雪    币: 814
活跃值: (623)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Aimees 2024-3-14 09:39
12
0
mb_gbtepwge 这不是网易的嘛

***风控引擎

最后于 2024-3-14 10:36 被kanxue编辑 ,原因:
雪    币: 216
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
lyzazzex 2024-3-14 10:05
13
0
牛,学到了
雪    币: 35
活跃值: (999)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dreameriii 2024-3-14 10:08
14
0
感谢分享!
雪    币: 164
活跃值: (1790)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
科学上网 2024-3-14 10:17
15
0
感谢分享 先看后赞
雪    币: 540
活跃值: (580)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_fidppcok 2024-3-14 14:16
16
0
像某个系统 路径,如果 没有给APP读取权限 ,或者只给了某些路径读取的话,那APP 还能读到吗?
雪    币: 5159
活跃值: (1741)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fishod 2024-3-14 14:38
17
0
感谢分享,前来捧场
雪    币: 22
活跃值: (3619)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
New对象处 2024-3-14 15:26
18
0
他们的检测可以直接拉闸的吧
雪    币: 3797
活跃值: (5570)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huangjw 2024-3-14 15:27
19
0
精的文章
雪    币: 243
活跃值: (505)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PoisonGZ 2024-3-14 16:56
20
0
感谢我这就去把这些痕迹检测全部加上
雪    币: 2676
活跃值: (3451)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
luoyesiqiu 3 2024-3-15 10:28
21
0
app安装路径,应用更新就会发生改变
雪    币: 1046
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_plkucays 2024-3-16 04:07
22
0
大神能帮忙解决风控的问题吗
雪    币: 224
活跃值: (962)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
樊辉 2024-3-18 16:43
23
0
感谢。上传这么多内容真吓人
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_gwbhfehq 2024-3-23 19:48
24
0
怎么联系?
游客
登录 | 注册 方可回帖
返回