关注微信公众号:K哥爬虫,持续分享爬虫进阶、JS/安卓逆向等技术干货!

声明

本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

逆向目标

  • 目标:Ether Rock(一种数字货币)空投接口 AES256 加密分析
  • 主页:aHR0cHM6Ly9ldGhlcnJvY2submV0L2FpcmRyb3Av
  • 接口:aHR0cHM6Ly9ldGhlcnJvY2submV0L2FpcmRyb3Atc3VibWl0
  • 逆向参数:Form Data:content: U2FsdGVkX1/XnffSPZONOHb... key: jrwBwX2ll38bu/FFql+bAUYrRG8Ij...

逆向分析

来到空投页面,随便输入一个 ETH 钱包地址,点击提交,可抓包到提交接口,POST 请求,Form Data 里 content 和 key 参数均经过了加密处理,如下图所示:

老方法,尝试直接搜索,结果很多,不利于快速定位,XHR 断点,很容易定位到加密位置,如下图所示:

一步一步分析,首先定义了 content 对象:

var content={address:$(this).find('input[name=address]').val(),ref:$(this).find('input[name=ref]').val(),uuid:uuid,tz:tz,tz_offset:tz_offset,screen:window.screen.width+'x'+window.screen.height+'x'+window.screen.colorDepth,user_agent:navigator.userAgent,cpu:navigator.hardwareConcurrency,lang:navigator.language||navigator.userLanguage,
};

address 是钱包地址,ref、uuid 为空,tz 是时区,tz_offset 是时区偏移量,即当前时区与格林尼治标准时间(GMT)的差,screen 是屏幕相关信息,user_agent 是浏览器信息,cpu 是处理器数量,lang 是语言。这些值除了 address 以外都可以固定。

接下来定义了一个 key:var key=random_string(36);,跟进 random_string() 方法,可以看到是进行了一些取随机值和幂运算,可以直接 copy 下来,如下图所示:

接着将定义的 content 和生成的 key 进行了一个叫做 AES256 的加密:content=AES256.encrypt(JSON.stringify(content),key); 这里 AES256 一般是指的密钥长度为 32 bytes(256 bit / 8)的 AES 加密,但是不要被名称迷惑,我们跟进去看看:

可以看到实际上是调用了 h.AES.encrypt() 方法,往上看这个 h,可以看到是引用了 node-cryptojs-aes,支持 AES 对称密钥加密,这里就比较简单了,我们在本地也直接引入这个库即可,至此,content 的加密方式就找到了。

接下来看 key 值,这个就更简单了,很明显用的是 jsencrypt 库,对原来生成的 36 位字符串的 key 进行了 RSA 加密,同样在本地直接引用库即可。

完整代码

GitHub 关注 K 哥爬虫,持续分享爬虫相关代码!欢迎 star !https://github.com/kgepachong/

以下只演示部分关键代码,不能直接运行! 完整代码仓库地址:https://github.com/kgepachong/crawler/

JavaScript 加密代码

function randomString(N) {if (!parseInt(N, 10)) N = 6;var rs = Math.floor(Math.pow(36, N) * Math.random()).toString(36);return (Math.pow(10, N) + rs).substr(-N);
}var h = require("node-cryptojs-aes").CryptoJS, p = {stringify: function (b) {var e = h.enc.Hex.parse(b.salt.toString()).toString(h.enc.Latin1);b = b.ciphertext.toString(h.enc.Latin1);return h.enc.Latin1.parse("Salted__" + e + b).toString(h.enc.Base64)},parse: function (b) {b = h.enc.Base64.parse(b).toString(h.enc.Latin1);if ("Salted__" !== b.substr(0, 8))throw Error("Error parsing salt");var e = b.substr(8, 8);b = b.substr(16);return h.lib.CipherParams.create({ciphertext: h.enc.Latin1.parse(b),salt: h.enc.Latin1.parse(e)})}
};var e = randomString(36);function getContent(address) {var b = JSON.stringify({"address": address,"ref": "","uuid": "","tz": "Asia/Shanghai","tz_offset": 8,"screen": "1920x1080x24","user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36","cpu": 8,"lang": "zh"})return h.AES.encrypt(b, e, {format: p}).toString()
}function getKey() {JSEncrypt = require("jsencrypt")var crypt = new JSEncrypt();var pub = ['-----BEGIN PUBLIC KEY-----','MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVmYQhCYTnnkTPRMI5Ad3vfad9','lhjzOU92FZ3reUiN/vmqP/wC1DKKExYDsqa+w5xBP0AjGkfDWk3q4PlWu0UsBGZx','62Gvt0ds75u8FnmLv+ufMimF4962/9Lx7uyh9g1H3/ze5ZXscWYy3gtts9d2Ga0R','pl0X49Cz0JhYYicuGwIDAQAB','-----END PUBLIC KEY-----',];crypt.setPublicKey(pub.join('\n'));key = crypt.encrypt(e);return key
}function getContentAndKey(address) {result = {"key": getKey(),"content": getContent(address)}return result
}// 测试样例
// console.log(getContentAndKey("xxxxxxxxxxxxxxxx"))

Python 代码

# ==================================
# --*-- coding: utf-8 --*--
# @Time    : 2021-11-24
# @Author  : 微信公众号:K哥爬虫
# @FileName: airdrop_submit.py
# @Software: PyCharm
# ==================================import execjs
import requestsdef get_content_and_key(address):with open("get_content_and_key.js", encoding="utf-8") as f:ether_rock_js = f.read()content_and_key_dict = execjs.compile(ether_rock_js).call('getContentAndKey', address)return content_and_key_dictdef airdrop_submit(content_and_key_dict):submit_url = "脱敏处理,完整代码关注 GitHub:https://github.com/kgepachong/crawler"headers = {"Accept": "text/html, */*; q=0.01","Accept-Language": "zh,zh-CN;q=0.9,en-US;q=0.8,en;q=0.7","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36","X-Requested-With": "XMLHttpRequest","Host": "脱敏处理,完整代码关注 GitHub:https://github.com/kgepachong/crawler","Origin": "脱敏处理,完整代码关注 GitHub:https://github.com/kgepachong/crawler",}data = {"content": content_and_key_dict["content"],"key": content_and_key_dict["key"]}response = requests.post(url=submit_url, data=data, headers=headers)print(response.text)def main():address = input("请输入ETH钱包地址领取空投: ")content_and_key_dict = get_content_and_key(address)airdrop_submit(content_and_key_dict)if __name__ == '__main__':main()

【JS 逆向百例】Ether Rock 空投接口 AES256 加密分析相关推荐

  1. 【JS 逆向百例】cnki 学术翻译 AES 加密分析

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...

  2. 【JS 逆向百例】百度翻译接口参数逆向

    文章目录 逆向目标 逆向过程 抓包分析 获取 token 获取 sign 完整代码 baidu_encrypt.js baidufanyi.py 逆向目标 目标:百度翻译接口参数 主页:https:/ ...

  3. 【JS 逆向百例】webpack 改写实战,G 某游戏 RSA 加密

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...

  4. 【JS逆向百例】某音乐网分离式 webpack 非 IIFE 改写实战

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 文章目录 声明 逆向目标 逆向过程 抓包分析 参数逆向 webpack 改写 IIFE 传数组 ...

  5. 【JS 逆向百例】有道翻译接口参数逆向

    文章目录 逆向目标 逆向过程 抓包分析 参数逆向 完整代码 youdao_encrypt.js youdaofanyi.py 逆向目标 目标:有道翻译接口参数 主页:https://fanyi.you ...

  6. 【JS 逆向百例】反混淆入门,某鹏教育 JS 混淆还原

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...

  7. 【JS 逆向百例】某易支付密码 MD5+AES 加密分析

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...

  8. 【JS 逆向百例】Fiddler 插件 Hook 实战,某创帮登录逆向

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...

  9. 【JS 逆向百例】转变思路,少走弯路,X米加密分析

    文章目录 声明 逆向目标 逆向过程 抓包分析 参数逆向 基本参数 hash 总结 完整代码 Python 登录关键代码 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理, ...

最新文章

  1. 数据科学家所需的大脑训练
  2. 2021年春季学期-信号与系统-第八次作业参考答案-第八小题
  3. 简单而又不平凡的杨辉三角形
  4. LeetCode 2079. 给植物浇水(前缀和)
  5. Java加密与解密的艺术~思维导图
  6. 接口传值后不起作用_前端工程师吐后端工程师(第八讲)——接口的开发
  7. 面面俱到的Java接口自动化测试实战
  8. WinForm 的定时器使用
  9. 深度学习数学基础一--最小二乘法
  10. 四个好看的table表格样式
  11. 启动计算机实现5秒开机,win10提高开机速度的设置教程 电脑五秒开机优化步骤...
  12. Java ee和Java se的区别
  13. 【接口测试】Jmeter+ant安装及简单使用教程(集成)
  14. java nio书籍_《Java NIO》这本书
  15. php+redis+保存多个值,php向redis list一次性lPush多个值
  16. python常见函数抽样_Python中从列表中随机抽样函数的语法
  17. 计算机安装固态硬盘后启动不稳定,完美解决win7系统安装固态硬盘后开机慢的解决方法...
  18. 办公小技巧:excel纸张大小设置
  19. Metasploit入侵win7系统
  20. 用 python 快速「卡通化」人物头像

热门文章

  1. IIS 7.0探索用于 Windows Vista 的 Web 服务器和更多内容
  2. [密码学][困难问题][常见规约]密码学问题常见困难问题
  3. 计算机配置对电子竞技的影响,配置高并不是唯一优点 看看电竞硬件还要啥?...
  4. java list 从0开始_Java从零开始学二十一(集合List接口)
  5. ubuntu12 04下django安装略谈
  6. 空间留言软件_电脑硬盘空间提示不足,原来还可以这么做,真是学到老活到老...
  7. 1506G. Maximize the Remaining String
  8. C#中宏定义#define、预处理#if #else #endif的使用
  9. 计算机组成原理题库带答案详解,计算机组成原理试试题库(含答案解析) -.doc
  10. Redis windows学习(一)——redis安装和基础使用