资讯详情

记一次简单的js逆向分析

背景

朋友请帮忙爬一点数据,用于数据分析,网站如下:

aHR0cHM6Ly93d3cub2tsaW5rLmNvbS96aC1jbi9idGMvdHgtbGlzdD9saW1pdD0yMCZwYWdlTnVtPTE=

分析该网站

1. 抓包

在接口下请求头部 `x-apiKey` 参数是我们需要破解的参数。看起来像base64加密,废话不多说,去吧在线加密解密结果如下:

确实是一个base64通过两个参数加密 `|` 连接,下一步是分析这两个参数的生成逻辑。

2. 定位js代码

然后,重新刷新网页,发现断点生效,并定位到关键代码

3. 解密参数产生逻辑

3.1 单步调试js代码,发现以下代码

3.2 分析js代码

3.2.1 getApiKey函数

变量t是为了获得当前时间,变量e是为了调用encryptApiKey实现函数;

返回值t将变量t传递给参数encryptTime函数得到的值t1;

最后把t1和e作为参数传递给comb获得最终函数x-apiKey。

3.2.2encryptTime函数

t为了传进来的时间戳,经过 `(1 * t 1111111111111).toString().split("")` 处理后得到e;

r, n, o 为[0-10]的随机整数,经过 `e.concat([r, n, o]).join("")` 处理生成新值。

3.3.3encryptApiKey函数

this.API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab",为固定值;

该函数在API_KEY基此基础上进行基本字符串操作,获得新的值。

3.3.4comb函数

对参数t和e通过 `|` 合并进行btoa操作。

4. 复写js代码

global.Buffer = global.Buffer || require('buffer').Buffer;  if (typeof btoa === 'undefined') {     global.btoa = function (str) {         return new Buffer.from(str).toString('base64');     }; }  if (typeof atob === 'undefined') {     global.atob = function (b64Encoded) {         return new Buffer.from(b64Encoded, 'base64').toString();     }; } var self = global  window = {}  function encryptTime(t){     var e = (1 * t   1111111111111).toString().split(""),         r = parseInt(10 * Math.random(), 10),         n = parseInt(10 * Math.random(), 10),         o = parseInt(10 * Math.random(), 10);     return e.concat([r, n, o]).join("") }  function encryptApiKey(){     //this.API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab"     var t = "a2c903cc-b31e-4547-9299-b6d07b7631ab",         e = t.split(""),         r = e.splice(0, 8);     console.log(e.concat(r).join(""))     return e.concat(r).join("") }  function comb(e, t){     /*     * var r = "".concat(t, "|").concat(e) 时     * 结果如下:Mjc2ODExNzExOTg2MTg4OXwtYjMxZS00NTQ3LTkyOTktYjZkMDdiNzYzMWFiYTJjOTAzY2M=     * 经过base64解密结果为:276817198188|-b31e-4547-9299-b6d07b7631aba2c903cc     *     * 浏览器最终生成x-apiKey的值为:LWIzMWUtNDU0Ny05Mjk5LWI2ZDA3Yjc2MzFhYmEyYzkwM2NjfDI3NjgxMTM1Nzc3MzE4ODk=     * 解密后的值为:-b31e-4547-9299-b6d07b7631aba2c903cc|2768113577731889     *     * 两次解密的结果不同,区别就是 `|` 前后顺序不一致     *     * 因此,t和e颠倒位置     * 即:当 r = "".concat(e, "|").concat(t) 能得到正确的x-apiKey     */     var r = "".concat(e, "|").concat(t);     return self.btoa(r) }  function getApiKey(){     var t = (new Date).getTime(),         e = encryptApiKey();     return t = encryptTime(t), comb(e, t) }  res = getApiKey() console.log(res) 

5. python代码实现

# _*_ coding: utf-8 _*_ # @Time:  6:29 下午 # @File: demo.py # @Author: liyf  import requests import execjs  def get_apikey():     with open('demo.js', 'r') as f:         js_str = f.readlines()     ctx = execjs.compile(''.join(js_str))     return ctx.call('getApiKey')   def get_json_data():     url = 'aHR0cHM6Ly93d3cub2tsaW5rLmNvbS96aC1jbi9idGMvdHgtbGlzdD9saW1pdD0yMCZwYWdlTnVtPTE='     headers = {         'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',         'x-apiKey': get_apikey()     }     response = requests.et(url, headers=headers)
    return response.json()


def parse():
    result = get_json_data()
    data_list = result['data']['hits']
    for data in data_list:
        print(f'交易哈希: {data["hash"]}\n所在区块: {data["blockHeight"]}\n输入: {data["inputsCount"]}\n输出: {data["outputsCount"]}\n数量(BTC): {data["realTransferValue"]}')
        print('***'*30)


if __name__ == '__main__':
    parse()

6. 运行结果展示

标签: 35100d07no光电传感器35100d07pc光电传感器2565d07nc光电传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台