首页 > Python资料 博客日记
js逆向实战之Bitcoin浏览器交易x-apikey参数加密逻辑
2024-09-22 10:00:03Python资料围观41次
声明:本篇文章仅用于知识分享
实战网址:https://www.oklink.com/zh-hans/btc/tx-list
分析过程
- 访问网址,会触发一条数据包。
看它的响应内容。
就是我们想要获取的内容,找到数据了。可以先尝试直接去访问该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)
回显如下。
提示我们API_KEY
未找到,说明代码中少了这个参数,再回去看数据包是否有API_KEY
。
有,但是是一串加密后的字符串,接下来就去解析加密逻辑。
2. 全局搜索x-apikey
。
只有一处,双击定位。
打断点,刷新页面,发现此处断点没有触发,不知道是什么原因。既然断点触发不了,直接看这行代码,有用的就是getApiKey
函数。
3. 全局搜索getApiKey
。
总共有6处,只需关注定义的地方,调用的就不需要看了。
把这两处都点进去看一下。
代码都一样的,随便看一个就可以了。打断点,刷新界面,还是没有触发断点。那就直接看代码吧。
var t = (new Date).getTime(), e = this.encryptApiKey();
return t = this.encryptTime(t),
this.comb(e, t)
这段代码主要涉及4个函数,一个一个看。
(1)getTime()
这个函数看意思就知道获取时间戳的,没什么好讲的。
(2)encryptApiKey()
在当前文件中搜索encryptApiKey
,找到定义的地方。
涉及三个变量t
、e
、r
。
t = this.API_KEY
:当前文件搜索API_KEY
,是个定值。
e = t.split("")
:将t
进行分割,如果不知道得到的是什么,可以在控制台输出一下。
r = e.splice(0, 8)
:对e
进行切片,获取前8个元素。
return t = e.concat(r).join("")
:将e
和r
进行拼接。
这个函数最关键的变量就是t
,只要t
是个定值,该函数返回的就是一个定值。
(3)encryptTime()
在当前文件中搜索encryptTime
,找到定义的地方。
涉及四个变量e
、r
、n
、i
。
e = (1 * t + l).toString().split("")
:t是时间戳,只需要知道l
的值是什么。在当前函数定义处往上翻几行,就可以看到定义的地方,也是个定值。
获取时间戳,看看输出结果,相当于对时间戳做了个运算,将每位数字拆分开来。
r = parseInt(10 * h.o.mathRandom(), 10)
:获取一个随机数,h.o.mathRandom()
和Math.random()
作用一样。
所以r
、n
、i
三个变量都是随机数。
return e.concat([r, n, i]).join("")
:直接输出看结果,将四个变量进行拼接。
(4)comb()
在当前文件中搜索comb
,找到定义的地方。
涉及变量r
和函数window.btoa()
。
r = "".concat(t, "|").concat(e)
:输出看结果,就是将两个变量用|
拼接。
return window.btoa(r)
:输出看结果。
可以看到输出结果与我们在流量包中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))
运行结果如下。
大功告成,结束。
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj