首页 > 其他分享 >【JS逆向百例】东某航空数美指纹 v4 设备 ID 逆向分析

【JS逆向百例】东某航空数美指纹 v4 设备 ID 逆向分析

时间:2024-12-10 09:46:36浏览次数:4  
标签:逆向 pako 加密 东某 0x1ccff8 JS toString gzip ep

7xrWpJ.png

声明

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K哥爬虫】联系作者立即删除!

逆向目标

目标:东某航空某数指纹 v4 设备 ID 逆向分析

网站:aHR0cHM6Ly93d3cuZG9uZ2hhaWFpci5jb20v

抓包分析

打开网站,找到返回机票信息的机票查询接口 flightSearch,分析发现两个加密参数需要分析:

7AJNrL.png

7AJqdJ.png

  • deviceId:设备 ID, 需要重点分析的参数,特征是,以 "B" 开头;
  • b2c-api-user-token:登录接口返回的,抓包可以发现,登录接口也会有设备 ID,同理。

搜索后发现,"B" 后面的内容,是由 v4 接口返回的,然后拼接上 "B" 得到的 deviceId

7AJwwG.png

7AJySB.png

  • organization:某数产品唯一标识;
  • data:加密参数需要分析;
  • ep:加密参数需要分析;
  • 其他:当前网站固定即可,由 compress encode 可知,其他网站的加密方式可能不同。

点开调用堆栈,都是由 fp.min.js 文件加载出来的,进入后,发现经过 ob 混淆了,不过通过搜索也能轻松定位到。我们直接搜索 compress 或者 encode,注意找与后面数字一致的地方,打下断点,有两处地方,重新刷新,最终定位到的位置如下:

7AJHit.png

ep

该参数由 _0x5223ab 大对象取值生成,搜索发现 _0x5223ab 对象是经过 _0x484fb9 函数进行赋值操作的:

7AJb7b.png

我们搜索 _0x484fb9 函数的赋值操作,即可定位到 ep 参数生成的位置:

7AJgVe.png

  • _0x1dbb2a,由上面的 getUid 函数生成,就是 uuid:

7AJhXP.png

  • _0x3f6bcc['publicKey'],通过全局搜索发现由 api.js 文件返回:

    7AJGmw.png

  • rsaEncrypt,经过测试,这里就是标准的 rsa 加密:

7AJxh6.png

data

_0x1d1d7a 生成,定位就在上面,通过 _0x99c3c2 函数生成,跟进去,返回的 _0x1498fb

7AJ5rO.png

两次赋值 tn,不过赋值在两个不同的对象中,只用分析下面的就行,下面的后面会用到,跟进 _0x28c88b

7AJWwf.png

扣下来即可,里面的 md5 摘要算法,经过测试也是标准的,继续往下走,跟进到 _0x8b10c3['default'] 函数中,传入了两个对象:

7AJcSc.png

通过一些条件进行筛选,满足条件的,取一个对象的值与第二个对象的 key,进行 DES 加密,然后添加到新的对象,不满足条件的直接添加到新的对象中去:

7AJvs3.png

然后进行 gzip 压缩,提示得相当清楚,我们可以直接引库:

// 导入pako库
const pako = require('pako');

function gzip_decrypt(compressedBase64String){
    // 将Base64字符串解码为二进制数据
    compressedData = Buffer.from(compressedBase64String, 'base64');

    // 使用pako库解压缩二进制数据
    decompressedData = pako.ungzip(compressedData, { to: 'string' });

    // 输出解压缩后的字符串
    return decompressedData;
}

function gzip_encrypt(dataToCompress){
    // 将数据转换为Uint8Array
    dataUint8Array = new TextEncoder().encode(dataToCompress);

    // 使用pako库进行gzip压缩
    compressedDataUint8Array = pako.gzip(dataUint8Array);

    // 将压缩后的数据以Base64编码
    compressedBase64String = Buffer.from(compressedDataUint8Array).toString('base64');
    return compressedBase64String;
};

_0x1498fb = gzip_encrypt(JSON.stringify(_0x1498fb));

继续往下走,来到我们返回最后一个 _0x1498fb 值的生成位置,通过 aesEncrypt 函数将上面的压缩数据 _0x1498fbpriId 加密后生成,进入到这个函数中观察一下:

7AJD7j.png

是标准的 AES,CBC 加密,加密内容为 gzip 压缩数据 _0x1498fb,key 是 priId,iv 值固定为 0102030405060708。目前 priId 的生成方式还不知道,发现也是在 _0x5223ab 大对象中,跟我们获取 ep 的逻辑一样,发现就在生成 ep 的位置的上面:

7AJOW5.png

将我们生成 ep 传入的 uuid 类型的参数 _0x1dbb2a 进行截取然后进行标准的 MD5 加密,就得到了 priId 参数值。

最后就是对明文的分析了,由一些浏览器环境、加密参数等信息构成,通过 sent 接收 ,由 _0xa0ac38(_0x4c1ea4['Protocol']) 返回,分析几个加密参数:

7AJSjm.png

  • Protocol,与上面包含 DES key 的大对象关联,保持一致,跟某数滑块一样也是动态的 key

    7AJ1m4.png

  • smid,进入 _0xa0ac38 函数,调用 _0x4962b8 就在下面 smidgetLocalsmid 函数返回:

7AJP8h.png

7AJRt9.png

扣下来即可,MD5_Encrypt 是标准加密:

function _0xf7f244() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'['replace'](/[xy]/g, function(_0x33e3b5) {
        var _0x49279a = 0x10 * Math['random']() | 0x0;
        return ('x' == _0x33e3b5 ? _0x49279a : 0x3 & _0x49279a | 0x8)['toString'](0x10);
    });
};


function getLocalsmid() {
    var _0xa5b93 = (_0x1ccff8 = new Date(),
    _0x5a4c0d = _0x1ccff8['getFullYear']()['toString'](),
    _0x5b0ca1 = (_0x1ccff8['getMonth']() + 0x1)['toString'](),
    _0x229546 = _0x1ccff8['getDate']()['toString'](),
    _0x539a5b = _0x1ccff8['getHours']()['toString'](),
    _0x29336d = _0x1ccff8['getMinutes']()['toString'](),
    _0x548117 = _0x1ccff8['getSeconds']()['toString'](),
    _0x317aff = _0x5a4c0d + (_0x5b0ca1 = _0x5b0ca1 <= 0x9 ? '0' + _0x5b0ca1 : _0x5b0ca1) + (_0x229546 = _0x229546 <= 0x9 ? '0' + _0x229546 : _0x229546) + (_0x539a5b = _0x539a5b <= 0x9 ? '0' + _0x539a5b : _0x539a5b) + (_0x29336d = _0x29336d <= 0x9 ? '0' + _0x29336d : _0x29336d) + (_0x548117 = _0x548117 <= 0x9 ? '0' + _0x548117 : _0x548117),
    _0x163575 = _0xf7f244(),
    _0x4fa2e9 = _0x317aff + MD5_Encrypt(_0x163575) + '00',
    _0xd556d6 = MD5_Encrypt('smsk_web_' + _0x4fa2e9)['substr'](0x0, 0xe),
    _0x4fa2e9 + _0xd556d6 + 0x0), _0x317aff, _0x163575, _0x4fa2e9, _0xd556d6, _0x1ccff8, _0x5a4c0d, _0x5b0ca1, _0x229546, _0x539a5b, _0x29336d, _0x548117;
    return _0xa5b93;
};
  • box,通过跟值,与 ep 同理,或者通过搜索就可以发现,就是上一个 v4 接口返回的 deviceId

7AJYeY.png

7AJtyH.png

最后,风控部分就需要自己去探索了,跑多了,如果遇到 'status': '-2',就是触发了数某的验证码,携带验证成功的 rid 就可以正常采集到数据了。

结果验证

7AJzSZ.png

标签:逆向,pako,加密,东某,0x1ccff8,JS,toString,gzip,ep
From: https://www.cnblogs.com/ikdl/p/18596626

相关文章

  • js中的数字在电脑内存储为多少Byte?
    在JavaScript中,所有的数字都以64位双精度浮点数的形式存储,符合IEEE754标准。这意味着它们占用8个字节(8bytes*8bits/byte=64bits)的内存。需要注意的是,即使是整数,在JavaScript内部也以这种浮点数格式存储。没有独立的整数类型。这与一些其他语言(如C或Ja......
  • 摊位管理系统|Java|SSM|JSP| 前后端分离
    【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频(收费)                     【其它服务】【一】可以提供远程部署安装,包扩环境【二】提供软件相关的安装包【三】如果需要提供java入门资料可咨询 ......
  • 请说说JS中的索引数组、关联数组和静态数组、动态数组的定义与区别
    在JavaScript中,数组的概念比较灵活,不像一些强类型语言那样区分得那么严格。JS中的数组实际上是一种特殊的对象,既可以像索引数组一样通过数字索引访问元素,也可以像关联数组一样通过字符串键访问元素。所以,严格意义上来说,JS只有动态数组,它兼具了索引数组和关联数组的特性。而静......
  • (免费源码)计算机毕业设计必学必看 万套实战教程 java、python、php、node.js、c#、APP
    摘 要随着社会经济的快速发展,我国机动车保有量大幅增加,城市交通问题日益严重。为缓解用户'停车难'问题,本文设计并实现了APP停车位共享系统'.该系统通过错峰停车达到车位利用率最大化.基于现状分析,本文结合实际停车问题,从系统应用流程,系统软硬件设计和系统实现三方面......
  • 使用js如何创建一个private方法?
    在JavaScript中,没有真正的私有方法的关键字(像Java或C#中的private)。但是,有几种方法可以实现类似私有方法的行为,提供不同程度的封装和安全性。1.使用Symbol作为属性名:这种方法利用Symbol的唯一性来创建“私有”属性,从而间接地创建“私有”方法。虽然技术上仍然可以访问,但这种方......
  • 升级易优EyouCms到1.6.9版本后,发表内容时没有弹窗,JS无法加载,是什么原因?
    在升级易优EyouCms到1.6.9版本后,如果遇到发表内容时没有弹窗且JS无法加载的问题,通常是由于网站启用了SSL(HTTPS)而内部资源引用仍然使用HTTP协议导致的。这种情况下,浏览器会阻止混合内容(即HTTPS页面中加载HTTP资源),从而导致JS文件无法正确加载。以下是详细的解决步骤和注意事项:解决......
  • 前端 js + html + css 特效 001
    <!DOCTYPEhtml><htmllang="en"><head><title>CodeTheWorld-Electricstrings</title><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><sc......
  • node.js毕设城科毕业生就业管理系统app程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于毕业生就业管理系统的研究,现有研究主要以就业信息平台或就业指导网站等为主,专门针对城科毕业生就业管理系统app的研究较少。在国内外就业形势日益复......
  • node.js毕设城市出行行程智能推荐系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于城市出行行程智能推荐系统的研究,现有研究主要以单一出行方式的优化或通用的路径规划为主,专门针对整合多种出行方式并依据用户个性化需求来智能推荐......
  • node.js毕设城市房屋租赁出售系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于城市房屋租赁出售系统的研究,现有研究多集中于房地产市场的宏观分析或传统交易模式的局部优化。专门针对整合城市房屋租赁与出售业务于一体,借助信息......