关注微信公众号:K哥爬虫,继续分享爬虫进阶、JS/安卓逆向等技术干货!
申明
本文章中所有内容仅供学习交换,抓包内容、敏感网址、数据接口均已做脱敏解决,严禁用于商业用途和非法用处,否则由此产生的所有结果均与作者无关,若有侵权,请分割我立刻删除!
逆向指标
- 指标:网洛者反反爬虫练习平台第三题:AAEncode 加密
- 链接:http://spider.wangluozhe.com/...
- 简介:本题依然是要求采集100页的全副数字,并计算所有数据加和,须要抠出源码进行计算,次要应用了 AAEncode 加密
AAEncode 简介
AAEncode 和 JJEncode 都是同一个作者:日本的 Yosuke HASEGAWA ,AAEncode 能够将任何 JavaScript 代码编码为日式表情符号,在线体验地址:https://utf-8.jp/public/aaenc... 。
失常的一段 JS 代码:
alert("Hello, JavaScript" )
通过 AAEncode 混同之后的代码:
゚゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚゚) =(゚ー゚)-(゚ー゚); (゚゚) =(゚゚)= (o^_^o)/ (o^_^o);(゚゚)={゚゚: '_' ,゚゚ノ : ((゚゚ノ==3) +'_') [゚゚] ,゚ー゚ノ :(゚゚ノ+ '_')[o^_^o -(゚゚)] ,゚゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚゚) [゚゚] =((゚゚ノ==3) +'_') [c^_^o];(゚゚) ['c'] = ((゚゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚゚) ];(゚゚) ['o'] = ((゚゚)+'_') [゚゚];(゚o゚)=(゚゚) ['c']+(゚゚) ['o']+(゚゚ノ +'_')[゚゚]+ ((゚゚ノ==3) +'_') [゚ー゚] + ((゚゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚゚)]+(゚゚) ['c']+((゚゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚゚) ['o']+((゚ー゚==3) +'_') [゚゚];(゚゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚゚)=((゚ー゚==3) +'_') [゚゚]+ (゚゚) .゚゚ノ+((゚゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚゚]+((゚ー゚==3) +'_') [゚゚]+ (゚゚ノ +'_') [゚゚]; (゚ー゚)+=(゚゚); (゚゚)[゚゚]='\\'; (゚゚).゚゚ノ=(゚゚+ ゚ー゚)[o^_^o -(゚゚)];(o゚ー゚o)=(゚゚ノ +'_')[c^_^o];(゚゚) [゚o゚]='\"';(゚゚) ['_'] ( (゚゚) ['_'] (゚゚+(゚゚)[゚o゚]+ (゚゚)[゚゚]+(゚゚)+ (゚ー゚)+ (゚゚)+ (゚゚)[゚゚]+(゚゚)+ ((゚ー゚) + (゚゚))+ (゚ー゚)+ (゚゚)[゚゚]+(゚゚)+ (゚ー゚)+ ((゚ー゚) + (゚゚))+ (゚゚)[゚゚]+(゚゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚゚))+ (゚゚)[゚゚]+(゚゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚゚)[゚゚]+((゚ー゚) + (゚゚))+ (c^_^o)+ (゚゚)[゚゚]+(゚ー゚)+ ((o^_^o) - (゚゚))+ (゚゚)[゚゚]+(゚゚)+ (゚゚)+ (c^_^o)+ (゚゚)[゚゚]+(゚゚)+ (゚ー゚)+ ((゚ー゚) + (゚゚))+ (゚゚)[゚゚]+(゚゚)+ ((゚ー゚) + (゚゚))+ (゚ー゚)+ (゚゚)[゚゚]+(゚゚)+ ((゚ー゚) + (゚゚))+ (゚ー゚)+ (゚゚)[゚゚]+(゚゚)+ ((゚ー゚) + (゚゚))+ ((゚ー゚) + (o^_^o))+ (゚゚)[゚゚]+((゚ー゚) + (゚゚))+ (゚ー゚)+ (゚゚)[゚゚]+(゚ー゚)+ (c^_^o)+ (゚゚)[゚゚]+(゚゚)+ (゚゚)+ ((o^_^o) - (゚゚))+ (゚゚)[゚゚]+(゚゚)+ (゚ー゚)+ (゚゚)+ (゚゚)[゚゚]+(゚゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚゚)[゚゚]+(゚゚)+ (゚ー゚)+ (゚゚)+ (゚゚)[゚゚]+(゚゚)+ ((o^_^o) - (゚゚))+ (o^_^o)+ (゚゚)[゚゚]+(゚゚)+ (゚ー゚)+ (o^_^o)+ (゚゚)[゚゚]+(゚゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚゚))+ (゚゚)[゚゚]+(゚゚)+ ((゚ー゚) + (゚゚))+ (゚゚)+ (゚゚)[゚゚]+(゚゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚゚)[゚゚]+(゚゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚゚)[゚゚]+(゚ー゚)+ ((o^_^o) - (゚゚))+ (゚゚)[゚゚]+((゚ー゚) + (゚゚))+ (゚゚)+ (゚゚)[゚o゚]) (゚゚)) ('_');
AAEncode 解混同的形式和 JJEncode 相似,很简略,以下介绍几种常见的办法:
- 应用在线工具间接解密,比方:http://www.hiencode.com/aaenc... ;
- 去掉代码最初一个符号
('_')
后,放到浏览器外面去间接执行就能够看到源码; - 在线调试,在 AAEncode 代码第一行下断点,而后一步一步执行,最终也会在虚拟机(VM)里看到源码;
逆向参数
逆向的指标次要是翻页接口 _signature
参数,调用的加密办法依然是 window.get_sign()
,和后面两题是一样的,本文不再赘述,不分明的能够去看 K 哥上期的文章。
持续跟进,会发现是一个颜文字的 AAEncode 混同:
咱们将这段代码复制进去,去掉开端的 ('_')
,间接放到浏览器控制台运行一下(倡议单开一个无痕窗口,有时候可能会有影响),就能够看到源码了,点击源码来到虚拟机(VM),整个源码就展示在咱们背后了:
除了间接去掉 ('_')
运行以外,咱们还能够在混同代码第一行下断点,而后单步跟进,最初同样也会失去源码,如下图所示:
察看一下代码,有一个 Hook window.sign
操作,还有 delete 操作,而后接着是一个 DES 加密的函数,前面的 try-catch 语句设置一些 key 之类的参数,重点是 try-catch 语句,下断点看看理论是走的哪条语句:
其余逻辑咱们并不必关怀,间接把 try 语句 copy 进去,不让它走异样即可,DES 间接调用 crypto-js 即可,本地改写之后,配合 Python 代码携带 _signature 挨个计算每一页的数据,最终提交胜利:
残缺代码
GitHub 关注 K 哥爬虫,继续分享爬虫相干代码!欢送 star !https://github.com/kgepachong/
以下只演示局部要害代码,不能间接运行! 残缺代码仓库地址:https://github.com/kgepachong...
JavaScript 加密代码
/* ==================================# @Time : 2021-12-13# @Author : 微信公众号:K哥爬虫# @FileName: challenge_3.js# @Software: PyCharm# ================================== */var CryptoJS = require('crypto-js')function encryptByDES(message, key) { var keyHex = CryptoJS.enc.Utf8.parse(key); var encrypted = CryptoJS.DES.encrypt(message, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return encrypted.ciphertext.toString();}function getSign() { var message = "http://spider.wangluozhe.com/challenge/3"; message = message + '|' + Date.parse(new Date()).toString(); var key = Date.parse(new Date()).toString(); return encryptByDES(message, key);}// 测试输入// console.log(getSign())
Python 计算要害代码
# ==================================# --*-- coding: utf-8 --*--# @Time : 2021-12-13# @Author : 微信公众号:K哥爬虫# @FileName: challenge_3.py# @Software: PyCharm# ==================================import execjsimport requestschallenge_api = "http://spider.wangluozhe.com/challenge/api/3"headers = { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Cookie": "将 cookie 值改为你本人的!", "Host": "spider.wangluozhe.com", "Origin": "http://spider.wangluozhe.com", "Referer": "http://spider.wangluozhe.com/challenge/2", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36", "X-Requested-With": "XMLHttpRequest"}def get_signature(): with open('challenge_3.js', 'r', encoding='utf-8') as f: ppdai_js = execjs.compile(f.read()) signature = ppdai_js.call("getSign") print("signature: ", signature) return signaturedef main(): result = 0 for page in range(1, 101): data = { "page": page, "count": 10, "_signature": get_signature() } response = requests.post(url=challenge_api, headers=headers, data=data).json() for d in response["data"]: result += d["value"] print("后果为: ", result)if __name__ == '__main__': main()