分析Android的DeviceID生产

前面已经把web端的分析了一些,要想实现其实容易也难,容易是规则很容易,难是时间生成控制很难,我之前大概花了一周时间分析和梳理,然后行为测试,之前我已经讲过canvas中的fp生产,但是怎么生产唯一的canvas base64,这个就要知道webgl了,具体我不阐述。下面我实现后的一些函数结构,大家可以参考

协议

授权协议:只允许研究、学习目的的分享、使用、修改,不允许任何商业用途。转载请注明出处,感谢。

生产出来的函数结构

本文主要讲android端的deviceId生产规则,在一些请求的时候会提交这样的阐述,这是android端,ios端类似,只是加密算法不一致而已,我也分析过了。

在android端实现,大概是通过aes加密,android端aeskey如下

  //aes
  public static aesKey = Buffer.from([
    16,
    -59,
    20,
    -5,
    -54,
    -85,
    110,
    61,
    -51,
    -99,
    70,
    -78,
    11,
    -44,
    3,
    5,
    -120,
    58,
    -14,
    74,
    13,
    -122,
    35,
    120,
    14,
    -60,
    67,
    73,
    -58,
    -90,
    42,
    112,
  ]);

解密算法

如果我们解密aes后其实会得到这样一个对象数据,对象数据拆分,其实就是0500keylenkeylen 大概是这的格式,每次上传deviceId,会有一个时间戳,大概算法如下

  /**
   * 获取客户端时间
   */
  public static getClientTime(): string {
    const date = new Date();
    let v = `${date.getUTCFullYear()} ${(date.getUTCMonth() + 1).toString().padStart(2, '0')} ${date.getUTCDate().toString().padStart(2, '0')} `;
    v += `${date.getUTCHours().toString().padStart(2, '0')}:`;
    v += `${date.getUTCMinutes().toString().padStart(2, '0')}:${date.getUTCSeconds().toString().padStart(2, '0')}.`;
    v += `${date.getUTCMilliseconds()}`;
    return v;
  }

反序列化函数大概长这样

  /**
   * 反序列化参数
   * @param str
   */
  public static deSerializationInfo(str: string): any {
    const map: any = {};
    let v = str.substring(4, str.length - 4); //0500
    const head = v.substring(0, 4); //头部
    const mapLen = parseInt(head, 16);
    v = v.slice(4);
    for (let i = 0; i < mapLen; i++) {
      //key
      let keyHead = v.substring(0, 4); //头部
      v = v.slice(4);
      let len = parseInt(keyHead, 16);
      const key = v.substring(0, len);
      v = v.slice(len);

      //body
      keyHead = v.substring(0, 4); //头部
      v = v.slice(4);
      len = parseInt(keyHead, 16);
      const val = v.substring(0, len);
      v = v.slice(len);
      map[key] = val;
    }
    return map;
  }

如果自己实现算法后,尽量要进行顺向加密和逆向解密,这样保证数据是完全没问题的,文本就点播到这里,后面可能会写android端akamai的生产规则,android端代码分析比较烦,生产规则也比较复杂,涉及到非对称加密,所以验证起来也比较难。目前这个akamai 的bot sdk大概完工了2个部分,一个部分是web端的,一个是android端的,后续我会开源一个球鞋监控系统和公众号,大家可以关注公众号接收最新的球鞋通知,nice app通过手动绑定账号nice帮你抢snkrs鞋,他们真聪明,账号钱也省了,出问题也不管自己的事,对吧,还可以测试一波自己的bot系统是否靠谱,厉害厉害。

博客: https://github.com/zhaojunlike

5.分析snkrs的Android的DeviceID生产规则的更多相关文章

  1. Android内存机制分析1——了解Android堆和栈

    //----------------------------------------------------------------------------------- Android内存机制分析1 ...

  2. Android:日常学习笔记(2)——分析第一个Android应用程序

    Android:日常学习笔记(2)——分析第一个Android应用程序 Android项目结构 整体目录结构分析 说明: 除了APP目录外,其他目录都是自动生成的.APP目录的下的内容才是我们的工作重 ...

  3. arm上的参数列表传递的分析(以android为例)

    1. Linux中可变列表实现的源码分析 查看Linux0.11的内核源代码,对va_list, va_start, va_arg 的实现如下: va_list的实现没有差别,chartypedef ...

  4. Android 核心分析之十三Android GWES之Android窗口管理

    Android GWES之Android窗口管理1基本构架原理 Android的窗口管理是C/S模式的.Android中的Window是表示Top Level等顶级窗口的概念.DecorView是Wi ...

  5. Android核心分析 之十一Android GWES之消息系统

        Android GWES之Android消息系统                                                                        ...

  6. 【转】Android内存机制分析1——了解Android堆和栈

    昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题.以前也出现过这个问题,那时候并没有深究.这次打算好好分析一下Android的内存机制. 因为我以前是做VC+ ...

  7. 安卓MonkeyRunner源码分析之与Android设备通讯方式

    如前文<谁动了我的截图?--Monkeyrunner takeSnapshot方法源码跟踪分析>所述,本文主要会尝试描述android的自动化测试框架MonkeyRunner究竟是如何和目 ...

  8. Ztorg木马分析: 从Android root木马演变到短信吸血鬼

    本月第二次,Google 从官方应用商店 Google Play 中移除了伪装成合法程序的恶意应用.被移除的应用都属于名叫 Ztorg 的 Android 恶意程序家族.目前为止,发现的几十个新的Zt ...

  9. Android 程序分析环境搭建-Android 9 -代码下载编译

    Android 9 -代码下载编译 一,翻墙下载: 1.背景: 背景: 现在Android framework 开发的同学,整体在公司里面解一些无关痛痒的bug,对于Android framework ...

随机推荐

  1. Linux 中文打字软件 gtypist 光标错位解决

    在windows 下有 金山打字和其他的跟打软件,在Linux下找到了 gtypist 为练习中文打字,该软件分为练习模式的速度测试模式,在gtypist-2.9.5版中会出现以下几个问题: 一是在练 ...

  2. 从原理到场景 系统讲解 PHP 缓存技术(全)

    概述 缓存已经成了项目中是必不可少的一部分,它是提高性能最好的方式,例如减少网络I/O.减少磁盘I/O 等,使项目加载速度变的更快. 缓存可以是CPU缓存.内存缓存.硬盘缓存,不同的缓存查询速度也不一 ...

  3. (java实现)单向循环链表

    什么是单向循环链表 单向循环链表基本与单向链表相同,唯一的区别就是单向循环链表的尾节点指向的不是null,而是头节点(注意:不是头指针). 因此,单向循环链表的任何节点的下一部分都不存在NULL值. ...

  4. 读《深入理解Elasticsearch》点滴-改正用户拼写错误

    1.使用“建议”的方法:在query body的json结构体中,增加suggest节点:或者使用特殊的REST端点 2.es自带有多个不同的suggest实现,用来纠正用户的拼写错误及创建自动补全等 ...

  5. Angular 开发NPM第三方包

    步骤: 创建第三方包 > 开发第三方包 > 测试第三方包 > 发布第三方包 > 使用第三方包 实例: 第一步:创建第三方包;; (创建项目,项目下创建第三方库) 1. 新建项目 ...

  6. 【福利】离散&C++&硬件一笔记合集

    离散 C++ 硬件

  7. 关于Python json解析过程遇到的TypeError: expected string or buffer

    关于Python json解析过程遇到的问题:(爬取天气json数据所遇到的问题http://tianqi.2345.com/) part.1 url——http://tianqi.2345.com/ ...

  8. Java 学习笔记之 线程Yield

    线程Yield: yield()方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间,但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片. public class Yie ...

  9. Eclipse的Debug(一)

    本文链接:https://blog.csdn.net/u011781521/article/details/55000066    http://blog.csdn.net/u010075335/ar ...

  10. SpringBootSecurity学习(19)前后端分离版之OAuth2.0 token的存储和管理

    内存中存储token 我们来继续授权服务代码的下一个优化.现在授权服务中,token的存储是存储在内存中的,我们使用的是 InMemoryTokenStore : 图中的tokenStore方法支持很 ...