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

打印 上一主题 下一主题

主题 903|帖子 903|积分 2709

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

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


  • 访问网址,会触发一条数据包。

    看它的响应内容。

    就是我们想要获取的内容,找到数据了。可以先实验直接去访问该url,看能否获取数据。
  1. import requests
  2. url = "https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict?offset=0&limit=20&t=1726967064457"
  3. headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
  4.                          "Chrome/128.0.0.0 Safari/537.36"}
  5. resp = requests.get(url, headers=headers)
  6. print(resp.text)
复制代码
回显如下。

提示我们API_KEY未找到,阐明代码中少了这个参数,再归去看数据包是否有API_KEY。

有,但是是一串加密后的字符串,接下来就去解析加密逻辑。
2. 全局搜索x-apikey。

只有一处,双击定位。

打断点,刷新页面,发现此处断点没有触发,不知道是什么缘故原由。既然断点触发不了,直接看这行代码,有用的就是getApiKey函数。
3. 全局搜索getApiKey。

总共有6处,只需关注定义的地方,调用的就不必要看了。

把这两处都点进去看一下。


代码都一样的,随便看一个就可以了。打断点,刷新界面,照旧没有触发断点。那就直接看代码吧。
  1. var t = (new Date).getTime(), e = this.encryptApiKey();
  2. return t = this.encryptTime(t),
  3. 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. 编写代码进行数据获取。
  1. function getApiKey(t){
  2.     var e = encryptApiKey();
  3.                     return t = encryptTime(t),
  4.                     comb(e, t)
  5. }
  6. API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab"
  7. function encryptApiKey() {
  8.     var t = API_KEY
  9.           , e = t.split("")
  10.           , n = e.splice(0, 8);
  11.         return t = e.concat(n).join("")
  12. }
  13. s = 1111111111111;
  14. function encryptTime(t) {
  15.     var e = (1 * t + s).toString().split("")
  16.                       , n = parseInt(10 * Math.random(), 10)
  17.                       , r = parseInt(10 * Math.random(), 10)
  18.                       , i = parseInt(10 * Math.random(), 10);
  19.                     return e.concat([n, r, i]).join("")
  20. }
  21. function comb(t, e) {
  22.     var n = "".concat(t, "|").concat(e);
  23.                     return btoa(n)
  24. }
  25. //  console.log(getApiKey());
复制代码
  1. import requests
  2. import execjs
  3. import time
  4. import json
  5. # 想获取第几页的数据
  6. offset = input("请输入你想获取第几页:")
  7. # 获取时间戳
  8. timestamp = int(time.time()*1000)
  9. url = "https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict?offset={}&limit=20&t={}".format(
  10.     offset, timestamp)
  11. # 生成x-apikey
  12. file_object = open("encrypt.js", mode="r")
  13. exec_code = file_object.read()
  14. exec_js = execjs.compile(exec_code)
  15. x_apikey = exec_js.call("getApiKey", timestamp)
  16. headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
  17.                          "Chrome/128.0.0.0 Safari/537.36",
  18.            "x-apikey": x_apikey}
  19. resp = requests.get(url, headers=headers)
  20. print(json.loads(resp.text))
复制代码
运行效果如下。

大功告成,结束。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表