JS逆向|AAEncode还原代码分享

举报
悦来客栈的老板 发表于 2022/04/29 22:19:13 2022/04/29
【摘要】 关注它,不迷路。 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除! 一.实战地址 这里我使用 网洛者 - 反反爬虫练习平台 的第三题作为实例进行讲解,地址: 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加密了,或者某个字段被混淆了,而且请求一次变化一次,这是无法在控制台运行的,因此可以写个代码将其还原,然后提取有效信息即可。

二.还原源码

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


   
  1. # -*- coding: utf-8 -*-
  2. import re
  3. class AAencode():
  4. b = [
  5. "(c^_^o)",
  6. "(゚Θ゚)",
  7. "((o^_^o) - (゚Θ゚))",
  8. "(o^_^o)",
  9. "(゚ー゚)",
  10. "((゚ー゚) + (゚Θ゚))",
  11. "((o^_^o) +(o^_^o))",
  12. "((゚ー゚) + (o^_^o))",
  13. "((゚ー゚) + (゚ー゚))",
  14. "((゚ー゚) + (゚ー゚) + (゚Θ゚))",
  15. "(゚Д゚) .゚ω゚ノ",
  16. "(゚Д゚) .゚Θ゚ノ",
  17. "(゚Д゚) ['c']",
  18. "(゚Д゚) .゚ー゚ノ",
  19. "(゚Д゚) .゚Д゚ノ",
  20. "(゚Д゚) [゚Θ゚]"
  21. ]
  22. def __init__(self):
  23. pass
  24. def encode(self, text):
  25. r = "゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); "
  26. if re.match("ひだまりスケッチ×(365|356)\s*来週も見てくださいね[!!]", text):
  27. r += "X=_=3; "
  28. r += "\r\n\r\n X / _ / X < \"来週も見てくださいね!\";\r\n\r\n"
  29. r += "(゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);" +\
  30. "(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] " +\
  31. ",゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] " +\
  32. ",゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];" +\
  33. "(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];" +\
  34. "(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];" +\
  35. "(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + " +\
  36. "((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+" +\
  37. "((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+" +\
  38. "((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+" +\
  39. "((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];" +\
  40. "(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+" +\
  41. "((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+" +\
  42. "((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; " +\
  43. "(゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\\\'; " +\
  44. "(゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];" + \
  45. "(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];" +\
  46. "(゚Д゚) [゚o゚]='\\\"';" + \
  47. "(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+"
  48. r += "(゚Д゚)[゚o゚]+ "
  49. for i in text:
  50. n = ord(i)
  51. t = "(゚Д゚)[゚ε゚]+"
  52. if n <= 127:
  53. m = '%o' % n
  54. for j in m:
  55. t += self.b[int(j)] + "+ "
  56. else:
  57. t += "(o゚ー゚o)+ "
  58. m = "%x" % n
  59. m = ("000" + m)[-4:]
  60. for j in m:
  61. t += self.b[int(j, 16)] + "+ "
  62. r += t
  63. r += "(゚Д゚)[゚o゚]) (゚Θ゚)) ('_');"
  64. return r
  65. def decode(self, text):
  66. for i in range(len(self.b)):
  67. if i <= 7:
  68. text = text.replace(self.b[i] + "+ ", str(i))
  69. else:
  70. text = text.replace(self.b[i] + "+ ", "%x" % i)
  71. text = text.replace("(゚Д゚)[゚o゚]) (゚Θ゚)) ('_');", "")
  72. rs = text.split("(゚Д゚)[゚ε゚]+")
  73. print(rs[1:])
  74. t = ""
  75. for i in rs[1:]:
  76. if i.startswith("(o゚ー゚o)+ "):
  77. t += chr(int(i[9:], 16))
  78. else:
  79. t += chr(int(i, 8))
  80. return t
  81. AA = AAencode()
  82. 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

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

全部回复

上滑加载中

设置昵称

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

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

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