JS逆向|AAEncode还原代码分享

关注它,不迷路。

  • 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!

一.实战地址

这里我使用 网洛者 - 反反爬虫练习平台 的第三题作为实例进行讲解,地址:

http://spider.wangluozhe.com/challenge/3

抓包后发现有个 _signature 参数:

d5bf45e0c69284ddc032ea5acba6b4d6.png

全局搜索后,定位到这里:

f463c3cc9bf3dbda6d091122dedaaca8.png

上面有个 get_sign 函数,跟进去看看:

510870aaeff362a7aae9c792af3e466f.png

红色箭头的位置就是 AAEncode,这种代码没人能看懂,一般复制到控制台运行。将实参和括号去掉,控制台运行后:

e07509e03174923aec4aa6f1ab0a48da.png

可以看到 window.sign的赋值就在这里。具体的请求就不在这里讲了。

好像没用到代码来还原AAEncode。

那这里就结束了?

其实不然,可以考虑这样的一种情况:

加密的参数是动态的js返回的,而动态的js又被AAEncode加密了,或者某个字段被混淆了,而且请求一次变化一次,这是无法在控制台运行的,因此可以写个代码将其还原,然后提取有效信息即可。

二.还原源码

这里我直接给出大佬写好的代码:

# -*- coding: utf-8 -*-
import re
class AAencode():
    b = [
        "(c^_^o)",
        "(゚Θ゚)",
        "((o^_^o) - (゚Θ゚))",
        "(o^_^o)",
        "(゚ー゚)",
        "((゚ー゚) + (゚Θ゚))",
        "((o^_^o) +(o^_^o))",
        "((゚ー゚) + (o^_^o))",
        "((゚ー゚) + (゚ー゚))",
        "((゚ー゚) + (゚ー゚) + (゚Θ゚))",
        "(゚Д゚) .゚ω゚ノ",
        "(゚Д゚) .゚Θ゚ノ",
        "(゚Д゚) ['c']",
        "(゚Д゚) .゚ー゚ノ",
        "(゚Д゚) .゚Д゚ノ",
        "(゚Д゚) [゚Θ゚]"
    ]


    def __init__(self):
        pass


    def encode(self, text):
        r = "゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); "
        if re.match("ひだまりスケッチ×(365|356)\s*来週も見てくださいね[!!]", text):
            r += "X=_=3; "
            r += "\r\n\r\n    X / _ / X < \"来週も見てくださいね!\";\r\n\r\n"
        r += "(゚Д゚) =(゚Θ゚)= (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゚]='\\\"';" + \
            "(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+"
        r += "(゚Д゚)[゚o゚]+ "
        for i in text:
            n = ord(i)
            t = "(゚Д゚)[゚ε゚]+"
            if n <= 127:
                m = '%o' % n
                for j in m:
                    t += self.b[int(j)] + "+ "
            else:
                t += "(o゚ー゚o)+ "
                m = "%x" % n
                m = ("000" + m)[-4:]
                for j in m:
                    t += self.b[int(j, 16)] + "+ "
            r += t
        r += "(゚Д゚)[゚o゚]) (゚Θ゚)) ('_');"
        return r


    def decode(self, text):
        for i in range(len(self.b)):
            if i <= 7:
                text = text.replace(self.b[i] + "+ ", str(i))
            else:
                text = text.replace(self.b[i] + "+ ", "%x" % i)
        text = text.replace("(゚Д゚)[゚o゚]) (゚Θ゚)) ('_');", "")
        rs = text.split("(゚Д゚)[゚ε゚]+")
        print(rs[1:])
        t = ""
        for i in rs[1:]:
            if i.startswith("(o゚ー゚o)+ "):
                t += chr(int(i[9:], 16))
            else:
                t += chr(int(i, 8))
        return t




AA = AAencode()
print(AA.decode("""゚ω゚ノ= /`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) +(o^_^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゚]) (゚Θ゚)) ('_');"""))

在此感谢,可直接运行,需要的自取吧。

另外一个大佬写了个js版本的,能兼容更多情况,由于文件太多,我发在星球里了,如果你需要学习研究,可以加我微信私聊获取。

91c9b874624fba67bb6ed855c1e55666.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值