JS逆向:Webpack打包后的代码怎么搞?猿人学爬虫比赛第十六题详细题解

举报
悦来客栈的老板 发表于 2020/12/28 23:27:17 2020/12/28
【摘要】 实战地址 http://match.yuanrenxue.com/match/16 抓包分析 地址栏输入 地址,按下F12并回车,发现数据在这里: 查看cookie,无加密相关的字段。请求的接口倒是有个m的加密参数,看来这题的主要目的就是 看看m参数怎么进行加密的吧。 切换 Initiator,这请求也太明显了,点击下面所示的js文件: 跟进去并美...

实战地址

http://match.yuanrenxue.com/match/16

  

抓包分析

地址栏输入 地址,按下F12并回车,发现数据在这里:

查看cookie,无加密相关的字段。请求的接口倒是有个m的加密参数,看来这题的主要目的就是 看看m参数怎么进行加密的吧。

切换 Initiator,这请求也太明显了,点击下面所示的js文件:

跟进去并美化后,来到这里:

不用过多分析,m加密在这里:


   
  1. r.m = n[e(528)](btoa, p_s),
  2. r.t = p_s;

而这个实参 p_s 是由上面的这行代码生成的:


   
  1. p_s = Date[e(496)](new Date)[e(517)]();

 

在 r.m 赋值的这行打上断点,请求第二页,控制台输入 btoa 并回车,双击跟进,来到这里:

看这个混淆,很明显的 obfuscator 混淆,直接将整个 732 copy下来保存到文件,并写出AST插件进行反混淆:

进行反混淆和删除垃圾代码,优化后的btoa函数:


   
  1. function btoa(e) {
  2. var f = "U9876543210zyxwvutsrqpomnlkjihgfdecbaZXYWVUTSRQPONABHICESQWK2Fi+9876543210zyxwvutsrqpomnlkjihgfdecbaZXYWVUTSRQPONABHICESQWK2Fi";
  3. for (var o, a, s, l = 0, c = []; l < e["length"];) {
  4. a = e["charCodeAt"](l), s = l % 6;
  5. switch (s) {
  6. case 0:
  7. c["push"](f["charAt"](a >> 2));
  8. break;
  9. case 1:
  10. c["push"](f["charAt"]((2 & o) << 3 | a >> 4));
  11. break;
  12. case 2:
  13. c["push"](f["charAt"]((15 & o) << 2 | a >> 6)), c["push"](f["charAt"](a & 63));
  14. break;
  15. case 3:
  16. c["push"](f["charAt"](a >> 3));
  17. break;
  18. case 4:
  19. c["push"](f["charAt"]((o & 4) << 6 | a >> 6));
  20. break;
  21. case 5:
  22. c["push"](f["charAt"]((o & 15) << 4 | a >> 8)), c["push"](f["charAt"](a & 63));
  23. }
  24. o = a, l++;
  25. }
  26. c["push"](f["charAt"]((o & 3) << 4)), c["push"]("FM");
  27. return d(15) + md5(c["join"]("")) + d(10);
  28. }

这里可以看到还有 d 函数 和 md5 函数,分别进行抠取和优化。

优化后的d函数:


   
  1. function d(e) {
  2. e = e ||32;
  3. var l = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
  4. var s = l["length"];
  5. var c = "";
  6. for (i = 0; i < e; i++) c += l["charAt"](Math["floor"](Math["random"]() * s));
  7. return c;
  8. }

优化后的md5函数:


   
  1. function md5(e) {
  2. function o(e, n) {
  3. e[n >> 5] |= 128 << n % 32;
  4. e[(n + 64 >>> 9 << 4) + 14] = n;
  5. var b = 1732584193;
  6. var x = -271733879;
  7. var T = -1732584194;
  8. var w = 271733878;
  9. for (var d = 0; d < e["length"]; d += 16) {
  10. var m = b;
  11. var y = x;
  12. var v = T;
  13. var g = w;
  14. b = s(b, x, T, w, e[d + 0], 7, -680976936);
  15. w = s(w, b, x, T, e[d + 1], 12, -389564586);
  16. T = s(T, w, b, x, e[d + 2], 17, 606105819);
  17. x = s(x, T, w, b, e[d + 3], 22, -1044525330);
  18. b = s(b, x, T, w, e[d + 4], 7, -176418897);
  19. w = s(w, b, x, T, e[d + 5], 12, 1200080426);
  20. T = s(T, w, b, x, e[d + 6], 17, -1473231341);
  21. x = s(x, T, w, b, e[d + 7], 22, -45705983);
  22. b = s(b, x, T, w, e[d + 8], 7, 1770035416);
  23. w = s(w, b, x, T, e[d + 9], 12, -1958414417);
  24. T = s(T, w, b, x, e[d + 10], 17, -42063);
  25. x = s(x, T, w, b, e[d + 11], 22, -1990404162);
  26. b = s(b, x, T, w, e[d + 12], 7, 1804550682);
  27. w = s(w, b, x, T, e[d + 13], 12, -40341101);
  28. T = s(T, w, b, x, e[d + 14], 17, -1502002290);
  29. x = s(x, T, w, b, e[d + 15], 22, 1236531029);
  30. b = l(b, x, T, w, e[d + 1], 5, -165796510);
  31. w = l(w, b, x, T, e[d + 6], 9, -1069501632);
  32. T = l(T, w, b, x, e[d + 11], 14, 643717713);
  33. x = l(x, T, w, b, e[d + 0], 20, -373897302);
  34. b = l(b, x, T, w, e[d + 5], 5, -701520691);
  35. w = l(w, b, x, T, e[d + 10], 9, 38016083);
  36. T = l(T, w, b, x, e[d + 15], 14, -660478335);
  37. x = l(x, T, w, b, e[d + 4], 20, -405537848);
  38. b = l(b, x, T, w, e[d + 9], 5, 568446438);
  39. w = l(w, b, x, T, e[d + 14], 9, -1019803690);
  40. T = l(T, w, b, x, e[d + 3], 14, -187363961);
  41. x = l(x, T, w, b, e[d + 8], 20, 1163531501);
  42. b = l(b, x, T, w, e[d + 13], 5, -1444681467);
  43. w = l(w, b, x, T, e[d + 2], 9, -51403784);
  44. T = l(T, w, b, x, e[d + 7], 14, 1735328473);
  45. x = l(x, T, w, b, e[d + 12], 20, -1921207734);
  46. b = u(b, x, T, w, e[d + 5], 4, -378558);
  47. w = u(w, b, x, T, e[d + 8], 11, -2022574463);
  48. T = u(T, w, b, x, e[d + 11], 16, 1839030562);
  49. x = u(x, T, w, b, e[d + 14], 23, -35311556);
  50. b = u(b, x, T, w, e[d + 1], 4, -1530992060);
  51. w = u(w, b, x, T, e[d + 4], 11, 1272893353);
  52. T = u(T, w, b, x, e[d + 7], 16, -155497632);
  53. x = u(x, T, w, b, e[d + 10], 23, -1094730640);
  54. b = u(b, x, T, w, e[d + 13], 4, 681279174);
  55. w = u(w, b, x, T, e[d + 0], 11, -358537222);
  56. T = u(T, w, b, x, e[d + 3], 16, -722881979);
  57. x = u(x, T, w, b, e[d + 6], 23, 76029189);
  58. b = u(b, x, T, w, e[d + 9], 4, -640364487);
  59. w = u(w, b, x, T, e[d + 12], 11, -421815835);
  60. T = u(T, w, b, x, e[d + 15], 16, 530742520);
  61. x = u(x, T, w, b, e[d + 2], 23, -995338651);
  62. b = c(b, x, T, w, e[d + 0], 6, -198630844);
  63. w = c(w, b, x, T, e[d + 7], 10, 11261161415);
  64. T = c(T, w, b, x, e[d + 14], 15, -1416354905);
  65. x = c(x, T, w, b, e[d + 5], 21, -57434055);
  66. b = c(b, x, T, w, e[d + 12], 6, 1700485571);
  67. w = c(w, b, x, T, e[d + 3], 10, -1894446606);
  68. T = c(T, w, b, x, e[d + 10], 15, -1051523);
  69. x = c(x, T, w, b, e[d + 1], 21, -2054922799);
  70. b = c(b, x, T, w, e[d + 8], 6, 1873313359);
  71. w = c(w, b, x, T, e[d + 15], 10, -30611744);
  72. T = c(T, w, b, x, e[d + 6], 15, -1560198380);
  73. x = c(x, T, w, b, e[d + 13], 21, 1309151649);
  74. b = c(b, x, T, w, e[d + 4], 6, -145523070);
  75. w = c(w, b, x, T, e[d + 11], 10, -1120210379);
  76. T = c(T, w, b, x, e[d + 2], 15, 718787259);
  77. x = c(x, T, w, b, e[d + 9], 21, -343485551);
  78. b = f(b, m);
  79. x = f(x, y);
  80. T = f(T, v);
  81. w = f(w, g);
  82. }
  83. return Array(b, x, T, w);
  84. }
  85. function a(e, n, r, o, a, s) {
  86. return f(d(f(f(n, e), f(o, s)), a), r);
  87. }
  88. function s(e, n, r, o, s, l, u) {
  89. return a(n & r | ~n & o, e, n, s, l, u);
  90. }
  91. function l(e, n, r, o, s, l, u) {
  92. return a(n & o | r & ~o, e, n, s, l, u);
  93. }
  94. function u(e, n, r, o, s, l, u) {
  95. return a(n ^ r ^ o, e, n, s, l, u);
  96. }
  97. function c(e, n, r, o, s, l, u) {
  98. return a(r ^ (n | ~o), e, n, s, l, u);
  99. }
  100. function f(e, n) {
  101. var o = (65535 & e) + (n & 65535),
  102. a = (e >> 16) + (n >> 16) + (o >> 16);
  103. return a << 16 | o & 65535;
  104. }
  105. function d(e, n) {
  106. return e << n | e >>> 32 - n;
  107. }
  108. function p(e) {
  109. for (var r = Array(), o = 65535, a = 0; a < e["length"] * 16; a += 16) r[a >> 5] |= (e["charCodeAt"](a / 16) & o) << a % 32;
  110. return r;
  111. }
  112. function h(e) {
  113. for (var r = "0123456789abcdef", o = "", a = 0; a < e["length"] * 4; a++) o += r["charAt"](15 & e[a >> 2] >> a % 4 * 8 + 4) + r["charAt"](15 & e[a >> 2] >> a % 4 * 8);
  114. return o;
  115. }
  116. return function (e) {
  117. return h(o(p(e), 16 * e["length"]));
  118. }(e);
  119. }

代码合并后,运行不再报错。很快就写出了 Python代码:


   
  1. # -*- coding: utf-8 -*-
  2. import time
  3. import execjs
  4. import requests
  5. def main():
  6. sums = 0
  7. headers = {"User-Agent": "yuanrenxue.project",}
  8. with open("decode_16.js","r",encoding = "utf-8") as fp:
  9. jscode = fp.read()
  10. ctx = execjs.compile(jscode)
  11. for i in range(1, 6):
  12. t = str(int(time.time()*1000))
  13. m = ctx.call("btoa",t)
  14. params = {
  15. "m":m,
  16. "page":i,
  17. "t":t,
  18. }
  19. response = requests.get(url="http://match.yuanrenxue.com/api/match/16",params = params,headers=headers).json()
  20. for each in response["data"]:
  21. sums += each["value"]
  22. print(sums)
  23. # 287383
  24. if __name__ == "__main__":
  25. main()

对于这个webpack打包的网站来说,基本没啥难度吧,先优化一波,去混淆,删除垃圾代码,再缺啥补啥就好,浏览器相关的都不用补。

当然,webpack也有技巧,不过很少用的,无脑抠就好,然后缺啥补啥

我也不喜欢一大坨代码搞在一起,简单点,事情简单点,心情或许会好很多。

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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