JS逆向|AAEncode还原代码分享

举报
悦来客栈的老板 发表于 2022/04/29 22:19:13 2022/04/29
2.2k+ 0 0
【摘要】 关注它,不迷路。 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除! 一.实战地址 这里我使用 网洛者 - 反反爬虫练习平台 的第三题作为实例进行讲解,地址: http://spider.wangluozhe.com/challenge/3 抓包后发现有个&nbsp...

关注它,不迷路。

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

一.实战地址

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

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

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/124418498

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。