这个很常见,一般主要有:
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 idcat命令读取/proc/sys/kernel/random/boot_id,这个也是大厂必用的一个关键的设备指纹字段。
apk路径读取设备上的应用安装列表以及apk路径,然后选择部分包名的路径作为设备指纹。
比如微信的随机路径 ,作为核心的唯一设备指纹,只要你不卸载重装微信,这个随机的路径就不会有变化
输入法列表有些SDK会收集设备上安装的输入法列表,一般来说国内的HMOV手机预装的是定制搜狗输入法,谷歌pixel是谷歌原生输入法。
获取输入法列表的方法:
- 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());
- }
复制代码