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

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

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

在控制台下输入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函数肯定是不行的,因为变量名的污染,也导致的代码的臃肿,我这里以返回值的形式赋值,代码如下:

var r = (function() {
    var n, r;
    n = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    r = {
        rotl: function(t, e) {
            return t << e | t >>> 32 - e
        },
        rotr: function(t, e) {
            return t << 32 - e | t >>> e
        },
        endian: function(t) {
            if (t.constructor == Number)
                return 16711935 & r.rotl(t, 8) | 4278255360 & r.rotl(t, 24);
            for (var e = 0; e < t.length; e++)
                t[e] = r.endian(t[e]);
            return t
        },
        randomBytes: function(t) {
            for (var e = []; t > 0; t--)
                e.push(Math.floor(256 * Math.random()));
            return e
        },
        bytesToWords: function(t) {
            for (var e = [], n = 0, r = 0; n < t.length; n++,
            r += 8)
                e[r >>> 5] |= t[n] << 24 - r % 32;
            return e
        },
        wordsToBytes: function(t) {
            for (var e = [], n = 0; n < 32 * t.length; n += 8)
                e.push(t[n >>> 5] >>> 24 - n % 32 & 255);
            return e
        },
        bytesToHex: function(t) {
            for (var e = [], n = 0; n < t.length; n++)
                e.push((t[n] >>> 4).toString(16)),
                e.push((15 & t[n]).toString(16));
            return e.join("")
        },
        hexToBytes: function(t) {
            for (var e = [], n = 0; n < t.length; n += 2)
                e.push(parseInt(t.substr(n, 2), 16));
            return e
        },
        bytesToBase64: function(t) {
            for (var e = [], r = 0; r < t.length; r += 3)
                for (var o = t[r] << 16 | t[r + 1] << 8 | t[r + 2], i = 0; i < 4; i++)
                    8 * r + 6 * i <= 8 * t.length ? e.push(n.charAt(o >>> 6 * (3 - i) & 63)) : e.push("=");
            return e.join("")
        },
        base64ToBytes: function(t) {
            t = t.replace(/[^A-Z0-9+\/]/gi, "");
            for (var e = [], r = 0, o = 0; r < t.length; o = ++r % 4)
                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);
            return e
        }
    }


    return r;
})()

再次运行,有结果了:

回到浏览器,看看这个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调用,请参考之前的两篇文章。

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 我没有具体的指导,但是可以给你一些建议:首先,可以研究一些已经实现的逆向JS的解决方案,然后根据你的需求来实现你所需要的功能;其次,可以在网上搜索一些关于PythonJS逆向教程,并且结合实践来掌握这些技术;最后,可以在社区中寻求帮助,可以得到其他更有经验的人的建议。 ### 回答2: PythonJavaScript是两种常见的编程语言,逆向工程指的是通过分析和理解已编译的代码来了解其内部机制和工作原理。下面将简要介绍关于PythonJavaScript逆向教程。 对于Python逆向来说,首先需要了解Python的字节码和内部数据结构。可以通过使用dis库来反编译Python代码并查看生成的字节码指令,进而分析其执行过程。另外,还可以使用反汇编工具来反编译Python的.pyc文件,以便更深入地研究其运行机制。 在JavaScript逆向教程中,首先需要学习JavaScript的语法和基本概念。然后,可以使用开发者工具来查看JavaScript代码的执行过程和调试信息。此外,还可以使用JavaScript反编译工具来将经过压缩或混淆的JavaScript代码还原为可读性较高的形式,以方便分析和理解。 不管是Python还是JavaScript逆向,重要的是要有良好的编程基础和对底层机制的理解。通过阅读相关文档、学习逆向工程技巧,并进行实践和实际项目中的应用,可以逐渐掌握逆向工程的技能。 总结起来,PythonJavaScript逆向教程涉及到反编译字节码、反汇编.pyc文件、使用开发者工具和反编译工具等技术。通过学习相关知识、实践和实际项目应用,可以逐步掌握逆向工程的技能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值