JS逆向|非常实用的扣代码教程来了,欢迎收藏

举报
悦来客栈的老板 发表于 2020/12/29 00:31:10 2020/12/29
【摘要】 声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 经过简单的分析,已知某网站参数的加密位置在这里: 在控制台下输入f()并回车: 跟进该函数后,在第一行打上断点: 按下快捷键F8,停在此处: 单步执行,来到这行: 代码 var n = r.wordsToBytes(s(t, e));调用了两个...

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢!

经过简单的分析,已知某网站参数的加密位置在这里:

在控制台下输入f()并回车:

跟进该函数后,在第一行打上断点:

按下快捷键F8,停在此处:

单步执行,来到这行:

代码 var n = r.wordsToBytes(s(t, e));调用了两个函数,分别是r.wordsToBytes 和 s,在控制台看看t,e的值:

t是上面讲到的固定的实参,e则未定义,不用理会,因此我们先将s函数扣出来看看,按照上面的方法,控制台输入s并回车跟进,来到这里:

一直到这里,都是与s相关的代码:

因此,将这段代码扣出来,保存到文件(我这里命名为md5.js),注意去掉s前面的括号以及:

保存以后,构造一个实参,并调用s函数:

直接在node下面跑一下,看看报啥错:

提示这里的o未定义,那跟进代码里面看看o是怎么定义的:

分析代码不难得知,这里实际是调用了o.stringToBytes这个函数,控制台输入看看:

双击跟进,来到这里:

直接把这个 n 对象扣出来,加入到s函数代码中,然后在照着逻辑加入这么一行代码:

再次运行,看结果:

再次报错,r未定义,按照之前的方法,跟进到r相关的代码在这里:

发现此时又定义了一个n,是base64的码表,因此按照上面的方式进入s函数肯定是不行的,因为变量名的污染,也导致的代码的臃肿,我这里以返回值的形式赋值,代码如下:


   
  1. var r = (function() {
  2. var n, r;
  3. n = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
  4. r = {
  5. rotl: function(t, e) {
  6. return t << e | t >>> 32 - e
  7. },
  8. rotr: function(t, e) {
  9. return t << 32 - e | t >>> e
  10. },
  11. endian: function(t) {
  12. if (t.constructor == Number)
  13. return 16711935 & r.rotl(t, 8) | 4278255360 & r.rotl(t, 24);
  14. for (var e = 0; e < t.length; e++)
  15. t[e] = r.endian(t[e]);
  16. return t
  17. },
  18. randomBytes: function(t) {
  19. for (var e = []; t > 0; t--)
  20. e.push(Math.floor(256 * Math.random()));
  21. return e
  22. },
  23. bytesToWords: function(t) {
  24. for (var e = [], n = 0, r = 0; n < t.length; n++,
  25. r += 8)
  26. e[r >>> 5] |= t[n] << 24 - r % 32;
  27. return e
  28. },
  29. wordsToBytes: function(t) {
  30. for (var e = [], n = 0; n < 32 * t.length; n += 8)
  31. e.push(t[n >>> 5] >>> 24 - n % 32 & 255);
  32. return e
  33. },
  34. bytesToHex: function(t) {
  35. for (var e = [], n = 0; n < t.length; n++)
  36. e.push((t[n] >>> 4).toString(16)),
  37. e.push((15 & t[n]).toString(16));
  38. return e.join("")
  39. },
  40. hexToBytes: function(t) {
  41. for (var e = [], n = 0; n < t.length; n += 2)
  42. e.push(parseInt(t.substr(n, 2), 16));
  43. return e
  44. },
  45. bytesToBase64: function(t) {
  46. for (var e = [], r = 0; r < t.length; r += 3)
  47. for (var o = t[r] << 16 | t[r + 1] << 8 | t[r + 2], i = 0; i < 4; i++)
  48. 8 * r + 6 * i <= 8 * t.length ? e.push(n.charAt(o >>> 6 * (3 - i) & 63)) : e.push("=");
  49. return e.join("")
  50. },
  51. base64ToBytes: function(t) {
  52. t = t.replace(/[^A-Z0-9+\/]/gi, "");
  53. for (var e = [], r = 0, o = 0; r < t.length; o = ++r % 4)
  54. 0 != o && e.push((n.indexOf(t.charAt(r - 1)) & Math.pow(2, -2 * o + 8) - 1) << 2 * o | n.indexOf(t.charAt(r)) >>> 6 - 2 * o);
  55. return e
  56. }
  57. }
  58. return r;
  59. })()

再次运行,有结果了:

回到浏览器,看看这个s函数的值是否正确:

控制台输入s(t,e):

扣到这里,再分析函数r.wordsToBytes,发现居然就是刚才扣的r对象,这下就省事多了,直接比对结果吧:

在扣出来的代码上添加输出即可:

console.log(r.wordsToBytes(s(tmp)));

  

运行看结果:

与上面的结果也是惊人的一致。

回到浏览器,看这里return的是啥:

这是一个三目表达式,直接在浏览器上看看逻辑:

可以看到,最终执行了r.bytesToHex(n),在扣出来的代码上添加输出:

console.log(r.bytesToHex(r.wordsToBytes(s(tmp))));

  

可以看到,结果出来了。

至此,代码抠取完毕。至于怎么给Python调用,请参考之前的两篇文章。

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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