美文网首页JS 逆向百例
【JS 逆向百例】网洛者反爬练习平台第三题:AAEncode 加

【JS 逆向百例】网洛者反爬练习平台第三题:AAEncode 加

作者: K哥爬虫 | 来源:发表于2021-12-16 16:12 被阅读0次

    声明

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

    逆向目标

    • 目标:网洛者反反爬虫练习平台第三题:AAEncode 加密
    • 链接:http://spider.wangluozhe.com/challenge/3
    • 简介:本题仍然是要求采集100页的全部数字,并计算所有数据加和,需要抠出源码进行计算,主要使用了 AAEncode 加密
    01.png

    AAEncode 简介

    AAEncode 和 JJEncode 都是同一个作者:日本的 Yosuke HASEGAWA ,AAEncode 可以将任何 JavaScript 代码编码为日式表情符号,在线体验地址:https://utf-8.jp/public/aaencode.html

    正常的一段 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 类似,很简单,以下介绍几种常见的方法:

    1. 使用在线工具直接解密,比如:http://www.hiencode.com/aaencode.html
    2. 去掉代码最后一个符号 ('_') 后,放到浏览器里面去直接执行就可以看到源码;
    3. 在线调试,在 AAEncode 代码第一行下断点,然后一步一步执行,最终也会在虚拟机(VM)里看到源码;

    逆向参数

    逆向的目标主要是翻页接口 _signature 参数,调用的加密方法仍然是 window.get_sign(),和前面两题是一样的,本文不再赘述,不清楚的可以去看 K 哥上期的文章。

    02.png

    继续跟进,会发现是一个颜文字的 AAEncode 混淆:

    03.png

    我们将这段代码复制出来,去掉末尾的 ('_'),直接放到浏览器控制台运行一下(建议单开一个无痕窗口,有时候可能会有影响),就可以看到源码了,点击源码来到虚拟机(VM),整个源码就展现在我们面前了:

    04.png 05.png

    除了直接去掉 ('_') 运行以外,我们还可以在混淆代码第一行下断点,然后单步跟进,最后同样也会得到源码,如下图所示:

    06.png 07.png

    观察一下代码,有一个 Hook window.sign 操作,还有 delete 操作,然后接着是一个 DES 加密的函数,后面的 try-catch 语句设置一些 key 之类的参数,重点是 try-catch 语句,下断点看看实际是走的哪条语句:

    08.png

    其他逻辑我们并不用关心,直接把 try 语句 copy 出来,不让它走异常即可,DES 直接调用 crypto-js 即可,本地改写之后,配合 Python 代码携带 _signature 挨个计算每一页的数据,最终提交成功:

    09.png

    完整代码

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

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

    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 execjs
    import requests
    
    
    challenge_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 signature
    
    
    def 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()
    

    相关文章

      网友评论

        本文标题:【JS 逆向百例】网洛者反爬练习平台第三题:AAEncode 加

        本文链接:https://www.haomeiwen.com/subject/rzevfrtx.html