JS逆向——webpack实战

7 篇文章 2 订阅
5 篇文章 0 订阅

声明:本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!由于本人水平有限,如有理解或者描述不准确的地方,还望各位大佬指教!!


练习网站:DQpDcmF6eSBQcm9Nb25rZXkgaHR0cHM6Ly9tLnphaXRpYW5qaW4ubmV0LyMvdGVtcGxhdGUvP3R5cGU9MSZtZW51PTQmY2F0ZT0xOSZwYXJhbT1iS3ZVa0tWYkI4SThaU1BC

网站分析:

打开开发者工具,点击翻页,发现数据是通过ajax接口异步传输的,不过该接口的post请求参数和结果数据均进行了加密操作,如图

对于这种情况,根据加密参数格式以及长度,大佬就会想到常见的非对称加密,如RSA、DES、AES、DSA等等,然后就可以通过关键词搜索、DOM断点、hook方法、启动器启动等方式寻找入口,当然,我们可以根据某种方法会遇到的问题,去选择其他捷径方法作为最优解(比如异步操作导致跟栈困难等问题)。这里小编就直接步入正题,加密参数的入口如下图

这里可以看出来,该两个请求参数body和signature基本上是由密钥n(随机生成)、时间戳o、传参r(由定值key、page、定值页展示limit组成)等参数进行了AES-ECB 加密生成的。乍一看加密很简单,但是这只是body的值,而l方法的断点后续还没运行(即y.encrypt(o)还未执行,这是生成signature值的过程),我们让该方法执行完就会发现signture的值,如图

那么,我们就需要找y方法是谁,网上找就会发现熟悉的代码格式,没错,这就是webpack

在n("9816")处打断并刷新进入,就会看到该webpack的加载器

那么,接下来的过程就比较简单了,我们把webpack的自执行函数扣到本地,将y.encrypt需用到的“9816”等模块放入自执行函数下边用作实参传入,如图

然后再将AES加密补齐

function oo(e) {
    e = e || 32;
    for (var t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678", n = t.length, o = "", r = 0; r < e; r++)
        o += t.charAt(Math.floor(Math.random() * n));
    return o
}

function webpack_sdk(i) {
    var O = my_sign,
    k = {
        debug: !1,
        host: "https://business-project.zaitianjin.net",
        loginPage: "/login",
        aes_mode: "AES-ECB",
        logColor: "background: #222; color: #bada55",
        pemVersion: "rsa.20230731100736",
        rand_key: oo(32),
        publicKey: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzaqdDedX9L8lUwun4dxj\nUnHuTTU8VnKWo9c9kRPxuJJcg2T1tJNSYetLUALbJWCE3EW58qr3wpSjkuSxTZCT\ntD+IYKVvdJqdftbf2i0lViplS1j0ZfqvLxQHxb6ij0jPZ9PmbkxrOjPMM8BIrQzh\nkIGoYBfVV113Err4EOk5Mt2F9TystJICPPJm2+NcX8fadXP8p+kcFNNRuki+1Gwc\nrp01gM+YXikSapKbZztEeTabH5JCcS5ZDriiIHCVNPthlKLdrBp9JuL2OJCgIWzS\nzHUHQ3UJgS6wWl8LR/zR4+E5/VSiZLPO4xZh6jeUrIMSYRvUlVnYc/pQUKjv5Pws\noQIDAQAB\n-----END PUBLIC KEY-----",
        privateKey: "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC05GAiIUnCvC9/\nxnbzJ+aQBTn9X5BjjMEeYItKhoNgmcmSieKrRLoAc4GkhkPN2AxUSD9kUYOw+qCx\nTYyqdFgCLGEdqBfBwWeGV5KRxYQ98X7Dd7Zm95YLNuvLwN6WuZhRmxvFChnBjV/U\n5vLrZDcFaCp94UoCwObXMSrYM67NEYNlk3EfnYui+n9ZkNxmIAm3u/j0J/4En23/\n4X1e+Nrl4vrI5SmkRlALGCgCZ/M3k47tGElIUh7SGKcwuO8DzTu1gQB6rHmaPx4h\ndRwk7UsHrlVxaXtNl3Mo2vysQDnYW+AuInM7YCv3JGSvakfXYKOQvrAF1hjXU6u/\nJ4Oi2okBAgMBAAECggEAW7NWRJcJdG2/yo+Kp3N3v1TW8+opIT4ufD7G/g24thTg\nCahavyYFAMuNUiE6aDR485T4hduI3gP/yEIe6B44q0liJg2blX59A66LP9iYVGqD\nL4YVcpdaee7qlAz/CfumCuCNsFKRgfwwM5asWMYh2lzXBZ9azJCLtVVYeeehWpUG\n0cj70QMj8nrzqSuXJMzxhYvCocZ6Zw4Lqfm7wl5E8b3iwtgNpyNuYIPvySMXKxV+\nnP2lJu1QtZRF+q/f5PNY9z1Jv3YyDYoz9td9fpzhytfXSHllyxMYjFK2l+b7fsMA\n2D33JT0CSYCeRD/GP12ZloulcUzZPqx8JlmSV0OazQKBgQDhkhrOUnNw96BqX6mO\n7+59wkKf45Tf+Nb/4tuia/6J/Iq+5VF8ChW0NIq/S2NQRbr54jOL2rUdzljXErF4\nVAZ8YlI8EuPffkhnyqS/8LOdSekwLbo+59PsM6iM5T+74GcWYkUtUVqRh051YOGo\n5vQHQ7i/5sGkm5CVEAuGwDtGewKBgQDNS1T2Z/vbJeih+Hfm1D0SWMnA5G3SRBdg\nDPggSFDoeoxrYU0jWzpAhzy47bxhL0D4lBp8GLPmWrqpUAv1izBSNeBu4klBwJMP\nj5G0QQdpnIAkTHyV6KKK9iCbUvnHCrcb1cCBZioB+sBSl93c78NEW1iOdlW1L9QM\nvsThJY1zswKBgQCqI6HEbbxVQPHmSjGCdsbUZGoMX4QzS2Yfq+UuJXbgbXPZeO51\nOMYWHmtozlwid/YH9O4cVuK1kKbB0n+52ubpet+8ICNwt7e1UcviWpOf19fjVxpb\nyFC4oF5Jp8Di3Ofkokq7W9mMWxp6vpB27Xyy3gnD9TGqDwyG4otPID+VcQKBgGrG\n/tb2uLmAWyI7oOmPhIBRbAaHCVPvFJVhyYDI/EQe0YBcaIm2PnMno/6vsGZ/9HQW\nXDwlgRSUJjhAKSg6kBSCb0xdKCsp5ZOXYfp2REu7Ga9HlRlHmZtbbxQ6sS3Etf6l\nS+5B3CGRcYzD7qKmllKsjD/07plB2jIS20YbiRofAoGAaVOZwGERxYFP2qigRY4Y\nCCWMx+cXL5DU+OeDdp4kBrwNWv4nSnYcMiGCYV9BkZfM9pxUF9hZsTxiKOJ09i1G\nB2HNgmv9FvVdxaeGodkl7kc4b18BsQlma61CrZJRBQ+4QvPwpPea0bwIp2FWUv1X\nDScG/EAX8/CCjd0SloVvkyQ=\n-----END PRIVATE KEY-----"
    }, y = new O["a"];
    y.setPublicKey(k.publicKey)
    result = y.encrypt(i)
    return result
}

function cc() {
    return parseInt((new Date).getTime() / 1e3)
}

a = function(e, t) {
    var n = CryptoJS.enc.Utf8.parse(t.substring(0, 16))
      , o = CryptoJS.enc.Utf8.parse(t.substring(16, 32));
    var e2 = CryptoJS.enc.Utf8.parse(e),
    e3 = CryptoJS.AES.encrypt(e2, n, {
        iv: o,
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    })
    return e3.ciphertext.toString()
}

rrr = function(e){
    return CryptoJS.MD5(e).toString()
}

l = function(e, t, n) {
    var o = JSON.stringify({
        aes_mode: "AES-ECB",
        time: t,
        rand_key: n,
        hash: rrr(e + "https://m.zaitianjin.net"),
        origin: "https://m.zaitianjin.net"
    });
    return webpack_sdk(o);
}

function fjm_sdk(data) {
    var n = oo(32)
      , o = cc()
      , r = JSON.stringify(data ? data : {})
      , c = a(r, n)
      , s = l(c, o, n);
    return {
        body: c,
        signature: s
    }
}

console.log("请求加密参数")
console.log(fjm_sdk(
    {
    'key': 'bKvUkKVbB8I8ZSPB',
    'page': '6',
    'limit': '6',
}
))

那么加密参数body和signature就都破解了,如图

然后,用python的exec正常调用该加密,响应结果也就能正常返回了,如图

但是响应结果也是加密的,那我们就需要再解密一下,经过再次跟栈,找到解密入口

然后就能正常返回数据啦

那么,今日的分享就到这里,想要学习更多的python爬虫和js逆向的相关技巧和知识的小伙伴们一定要点下关注哟,后期会不定时分享相关干货内容

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaScript逆向工程涉及到逆向分析、代码还原、代码修改等多个方面,其中Webpack作为一个重要的静态模块打包器,也是逆向工程中需要重点关注的一部分。以下是一些关于Webpack逆向的笔记: 1. Webpack的打包过程是从入口文件开始的,Webpack会递归地遍历所有依赖模块,并将它们打包成一个或多个Bundle文件。因此,逆向工程的第一步就是找到Webpack打包的入口文件。 2. 在入口文件中,Webpack会通过require或import语句加载其他模块,并递归地遍历所有依赖模块。因此,我们可以通过分析入口文件来了解应用的整体结构和模块依赖关系。 3. 在Webpack的打包过程中,每个模块都会被赋予一个唯一的标识符,这个标识符可以通过module.id来获取。因此,我们可以通过分析打包后的代码,来了解每个模块的标识符和依赖关系。 4. 在Webpack的打包过程中,Loader和Plugin是非常重要的扩展机制,它们可以对模块进行转换和优化。因此,我们可以通过分析Loader和Plugin的源代码,来了解它们的作用和实现原理。 5. 在逆向工程中,我们可以使用Webpack的source-map选项来生成源映射文件,从而方便我们进行代码还原和调试。同时,我们也可以使用Webpack的devtool选项来设置不同的调试工具,以便更好地进行逆向分析和调试。 总的来说,Webpack作为静态模块打包器,在JavaScript逆向工程中扮演着重要的角色。通过对Webpack逆向分析,我们可以更加深入地了解应用的整体结构和模块依赖关系,从而更好地进行代码还原和调试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crazy ProMonkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值