首页 > 其他分享 >js逆向实战之Bitcoin浏览器交易x-apikey参数加密逻辑

js逆向实战之Bitcoin浏览器交易x-apikey参数加密逻辑

时间:2024-09-22 09:46:10浏览次数:12  
标签:10 apikey return Bitcoin js headers API concat

声明:本篇文章仅用于知识分享

实战网址:https://www.oklink.com/zh-hans/btc/tx-list

分析过程

  1. 访问网址,会触发一条数据包。
    image
    看它的响应内容。
    image
    就是我们想要获取的内容,找到数据了。可以先尝试直接去访问该url,看能否获取数据。
import requests

url = "https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict?offset=0&limit=20&t=1726967064457"

headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                         "Chrome/128.0.0.0 Safari/537.36"}

resp = requests.get(url, headers=headers)
print(resp.text)

回显如下。
image
提示我们API_KEY未找到,说明代码中少了这个参数,再回去看数据包是否有API_KEY
image
有,但是是一串加密后的字符串,接下来就去解析加密逻辑。
2. 全局搜索x-apikey
image
只有一处,双击定位。
image
打断点,刷新页面,发现此处断点没有触发,不知道是什么原因。既然断点触发不了,直接看这行代码,有用的就是getApiKey函数。
3. 全局搜索getApiKey
image
总共有6处,只需关注定义的地方,调用的就不需要看了。
image
把这两处都点进去看一下。
image
image
代码都一样的,随便看一个就可以了。打断点,刷新界面,还是没有触发断点。那就直接看代码吧。

var t = (new Date).getTime(), e = this.encryptApiKey();
return t = this.encryptTime(t),
this.comb(e, t)

这段代码主要涉及4个函数,一个一个看。
(1)getTime()
这个函数看意思就知道获取时间戳的,没什么好讲的。
(2)encryptApiKey()
在当前文件中搜索encryptApiKey,找到定义的地方。
image
涉及三个变量ter
t = this.API_KEY:当前文件搜索API_KEY,是个定值。
image
e = t.split(""):将t进行分割,如果不知道得到的是什么,可以在控制台输出一下。
image
r = e.splice(0, 8):对e进行切片,获取前8个元素。
image
return t = e.concat(r).join(""):将er进行拼接。
image
这个函数最关键的变量就是t,只要t是个定值,该函数返回的就是一个定值。
(3)encryptTime()
在当前文件中搜索encryptTime,找到定义的地方。
image
涉及四个变量erni
e = (1 * t + l).toString().split(""):t是时间戳,只需要知道l的值是什么。在当前函数定义处往上翻几行,就可以看到定义的地方,也是个定值。
image
获取时间戳,看看输出结果,相当于对时间戳做了个运算,将每位数字拆分开来。
image
r = parseInt(10 * h.o.mathRandom(), 10):获取一个随机数,h.o.mathRandom()Math.random()作用一样。
image
所以rni三个变量都是随机数。
return e.concat([r, n, i]).join(""):直接输出看结果,将四个变量进行拼接。
image
(4)comb()
在当前文件中搜索comb,找到定义的地方。
image
涉及变量r和函数window.btoa()
r = "".concat(t, "|").concat(e):输出看结果,就是将两个变量用|拼接。
image
return window.btoa(r):输出看结果。
image
可以看到输出结果与我们在流量包中x-apikey的值格式一致。
4. 编写代码进行数据获取。

function getApiKey(t){
    var e = encryptApiKey();
                    return t = encryptTime(t),
                    comb(e, t)
}

API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab"

function encryptApiKey() {
    var t = API_KEY
          , e = t.split("")
          , n = e.splice(0, 8);
        return t = e.concat(n).join("")
}

s = 1111111111111;

function encryptTime(t) {
    var e = (1 * t + s).toString().split("")
                      , n = parseInt(10 * Math.random(), 10)
                      , r = parseInt(10 * Math.random(), 10)
                      , i = parseInt(10 * Math.random(), 10);
                    return e.concat([n, r, i]).join("")
}

function comb(t, e) {
    var n = "".concat(t, "|").concat(e);
                    return btoa(n)
}

//  console.log(getApiKey());
import requests
import execjs
import time
import json


# 想获取第几页的数据
offset = input("请输入你想获取第几页:")


# 获取时间戳
timestamp = int(time.time()*1000)

url = "https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict?offset={}&limit=20&t={}".format(
    offset, timestamp)

# 生成x-apikey
file_object = open("encrypt.js", mode="r")
exec_code = file_object.read()
exec_js = execjs.compile(exec_code)
x_apikey = exec_js.call("getApiKey", timestamp)

headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                         "Chrome/128.0.0.0 Safari/537.36",
           "x-apikey": x_apikey}

resp = requests.get(url, headers=headers)
print(json.loads(resp.text))

运行结果如下。
image
大功告成,结束。

标签:10,apikey,return,Bitcoin,js,headers,API,concat
From: https://www.cnblogs.com/sbhglqy/p/18424952

相关文章

  • 如何使用 Electronjs 创建跨平台桌面应用程序
    在当今的软件开发环境中,构建跨不同操作系统无缝运行的应用程序比以往任何时候都更加重要。无论您的目标是windows、macos还是linux,electron.js都提供了一个强大的框架,可以使用熟悉的web技术创建桌面应用程序。本文将指导您完成设置electron环境、创建应用程序ui、与node......
  • 在 WordPress 中排队 CSS 和 JS 脚本以获得更好的性能
    wordpress是开源软件–用户可以按照自己的意愿安装、修改和分发它。由于每个人都可以访问源代码,数百万wordpress专家和开发人员可以创建工具和扩展并与公众分享。让我们看看如何将css和js文件加入到你的wordpress项目中。大多数新开发者都喜欢,里面“header.php”<ti......
  • 在当今时代使用 Nextjs:现代 Web 开发框架
    在当今快速发展的数字环境中,Web开发变得比以往更加复杂和动态。开发人员不断寻找能够简化工作流程、提高性能和增强用户体验的工具。在各种可用的框架中,Next.js已成为开发人员的最佳选择,因其易用性、灵活性和强大的功能而广受欢迎。Next.js构建于React之上,通过提供用于构建......
  • 最新毕设-Node.js-游戏网站-031726(免费领项目)可做计算机毕业设计JAVA、PHP、爬虫、APP
    游戏网站的设计摘 要基于网络游戏的蓬勃发展,游戏网站发挥着吸引玩家和提高玩家之间的互动性的重要作用,因而,建设了一个以游戏为中心的游戏官网。 该游戏提供了一个大型的玩家交流互动平台,包括用户管理、游戏社区、游戏信息、分类信息、游戏资讯、论坛分类列表、新闻分类列......
  • note.js与vue.js常用基本命令
    Note.js基本命令1、安装Node.js包npminstall<package-name>2、全局安装包npminstall-g<package-name>3、查看已安装的包npmlist4、初始化项目并创建package.json文件npminit5、更新包到最新版本npmupdate<package-name>6、卸载包npmuninstall<pack......
  • 变化检测从 Angular zonejs) 到 Angular (provideExperimentalZonelessChangeDetectio
    更改检测是angular的一个基本方面,负责识别和更新dom中因数据修改或用户交互而发生更改的部分。此过程可确保ui与底层数据保持一致,从而增强用户体验和应用程序性能。zone.js的作用从历史上看,angular一直依赖zone.js来实现其变更检测机制。zone.js是一个拦截异步......
  • 使用 Nextjs Prisma、TailwindCSS 和 Next Auth 进行旅行预订
    旅行预订应用程序使用next.js14、tailwindcss、typescript和prisma进行中的旅行应用程序。允许用户注册、游览浏览、预订和评论提交。对开发过程中的所有贡献开放。入门克隆存储库:gitclonehttps://github.com/saidmounaim/travel-booking.git安装依赖项:npminstall......
  • 使用 Nextjs TypeScript、Prisma 和 Next-Auth 的休闲服装应用
    休闲服装应用使用next.js14、tailwindcss、typescript和prisma的休闲服装应用。包括用户注册、产品过滤和购物车管理。对开发过程中的所有贡献开放。入门克隆存储库:gitclonehttps://github.com/saidmounaim/casualclothes.git安装依赖项:npminstall在根目录创建一个......
  • 使用 Remotion、Nextjs 和 Tailwind CSS 构建基于 Web 的视频编辑器
    如果您曾经想创建自己的强大的基于网络的视频编辑器(类似于veed.io或descript等流行工具),那么您来对地方了!在本分步指南中,我们将向您展示如何使用remotion、next.js和tailwindcss构建视频编辑器。最后,您将为开发自己的基于浏览器的视频编辑工具奠定坚实的基础。介绍......
  • 使用 Secrets Loader 轻松管理 Laravel 和 JS 项目
    跨各种环境管理api密钥、令牌和凭证等敏感数据可能非常棘手,尤其是在开发和部署应用程序时。确保秘密在需要时安全地存储和获取,而不是将它们硬编码到版本控制中,对于维护安全性至关重要。这就是我创建secretsloader的原因,这是一个bash脚本,可以动态地将awsssm和cloudforma......