【自执行闭包JS逆向】某网站登录MD5加密分析

news2024/11/17 19:31:13

文章目录

  • 一、写在前面
  • 二、抓包分析
  • 三、加密函数分析

一、写在前面

   最近工作比较忙,不过还是在督促自己利用有限的时间学习更新一些技术文章。互联网这个行业大家目前也都知道是非常内卷的,所有大家在工作之余养成良好的自主学习习惯是非常好的,多的就不说了,开始本期重点!

分析站点

aHR0cHM6Ly9pLmZrdy5jb20v

在开始之前这里说一下“自执行”“闭包”。它们概念相似,但不完全相同。自执行函数是一种函数,它在定义之后会立即执行,通常使用 (function() { /* code */ })(); 这种形式。闭包是一个更广泛的概念,它指的是一个函数能够访问并保存在其外部定义的变量的能力

二、抓包分析

  这次分析的还是登陆参数,加密的对象是密码pwd。大家一定记得看看我之前写的这篇文章:JS逆向中快速搜索定位加密函数技巧总结

这里我们简单构造一个用户名密码进行登录抓包分析,密码就123456(MD5加密的话16位以49开头、32位e10或E10开头

在这里插入图片描述

老规矩这里我们可以搜索pwd或者我们已经猜到加密方式,根据我上面文章的各个密码特征关键词搜索都是可以的:

在这里插入图片描述

像我上面所示,根据MD5加密算法的关键词1732584193进行搜索也能够快速定位到加密函数位置!

在这里插入图片描述

同样也可以搜索pwd或者断点方式调式找到加密加密位置,发现md5鼠标点击跳转到加密函数

三、加密函数分析

  通过下图我们可以看到md5加密函数是一个自执行闭包函数,这里我们将*jQuery这部分稍微修改一下,无需引入 jQuery,修改加密JS代码如下:

(function(g) {
    function o(u, z) {
            var w = (u & 65535) + (z & 65535)
              , v = (u >> 16) + (z >> 16) + (w >> 16);
            return (v << 16) | (w & 65535)
        }
        function s(u, v) {
            return (u << v) | (u >>> (32 - v))
        }
        function c(A, w, v, u, z, y) {
            return o(s(o(o(w, A), o(u, y)), z), v)
        }
        function b(w, v, B, A, u, z, y) {
            return c((v & B) | ((~v) & A), w, v, u, z, y)
        }
        function i(w, v, B, A, u, z, y) {
            return c((v & A) | (B & (~A)), w, v, u, z, y)
        }
        function n(w, v, B, A, u, z, y) {
            return c(v ^ B ^ A, w, v, u, z, y)
        }
        function a(w, v, B, A, u, z, y) {
            return c(B ^ (v | (~A)), w, v, u, z, y)
        }
        function d(F, A) {
            F[A >> 5] |= 128 << ((A) % 32);
            F[(((A + 64) >>> 9) << 4) + 14] = A;
            var w, z, y, v, u, E = 1732584193, D = -271733879, C = -1732584194, B = 271733878;
            for (w = 0; w < F.length; w += 16) {
                z = E;
                y = D;
                v = C;
                u = B;
                E = b(E, D, C, B, F[w], 7, -680876936);
                B = b(B, E, D, C, F[w + 1], 12, -389564586);
                C = b(C, B, E, D, F[w + 2], 17, 606105819);
                D = b(D, C, B, E, F[w + 3], 22, -1044525330);
                E = b(E, D, C, B, F[w + 4], 7, -176418897);
                B = b(B, E, D, C, F[w + 5], 12, 1200080426);
                C = b(C, B, E, D, F[w + 6], 17, -1473231341);
                D = b(D, C, B, E, F[w + 7], 22, -45705983);
                E = b(E, D, C, B, F[w + 8], 7, 1770035416);
                B = b(B, E, D, C, F[w + 9], 12, -1958414417);
                C = b(C, B, E, D, F[w + 10], 17, -42063);
                D = b(D, C, B, E, F[w + 11], 22, -1990404162);
                E = b(E, D, C, B, F[w + 12], 7, 1804603682);
                B = b(B, E, D, C, F[w + 13], 12, -40341101);
                C = b(C, B, E, D, F[w + 14], 17, -1502002290);
                D = b(D, C, B, E, F[w + 15], 22, 1236535329);
                E = i(E, D, C, B, F[w + 1], 5, -165796510);
                B = i(B, E, D, C, F[w + 6], 9, -1069501632);
                C = i(C, B, E, D, F[w + 11], 14, 643717713);
                D = i(D, C, B, E, F[w], 20, -373897302);
                E = i(E, D, C, B, F[w + 5], 5, -701558691);
                B = i(B, E, D, C, F[w + 10], 9, 38016083);
                C = i(C, B, E, D, F[w + 15], 14, -660478335);
                D = i(D, C, B, E, F[w + 4], 20, -405537848);
                E = i(E, D, C, B, F[w + 9], 5, 568446438);
                B = i(B, E, D, C, F[w + 14], 9, -1019803690);
                C = i(C, B, E, D, F[w + 3], 14, -187363961);
                D = i(D, C, B, E, F[w + 8], 20, 1163531501);
                E = i(E, D, C, B, F[w + 13], 5, -1444681467);
                B = i(B, E, D, C, F[w + 2], 9, -51403784);
                C = i(C, B, E, D, F[w + 7], 14, 1735328473);
                D = i(D, C, B, E, F[w + 12], 20, -1926607734);
                E = n(E, D, C, B, F[w + 5], 4, -378558);
                B = n(B, E, D, C, F[w + 8], 11, -2022574463);
                C = n(C, B, E, D, F[w + 11], 16, 1839030562);
                D = n(D, C, B, E, F[w + 14], 23, -35309556);
                E = n(E, D, C, B, F[w + 1], 4, -1530992060);
                B = n(B, E, D, C, F[w + 4], 11, 1272893353);
                C = n(C, B, E, D, F[w + 7], 16, -155497632);
                D = n(D, C, B, E, F[w + 10], 23, -1094730640);
                E = n(E, D, C, B, F[w + 13], 4, 681279174);
                B = n(B, E, D, C, F[w], 11, -358537222);
                C = n(C, B, E, D, F[w + 3], 16, -722521979);
                D = n(D, C, B, E, F[w + 6], 23, 76029189);
                E = n(E, D, C, B, F[w + 9], 4, -640364487);
                B = n(B, E, D, C, F[w + 12], 11, -421815835);
                C = n(C, B, E, D, F[w + 15], 16, 530742520);
                D = n(D, C, B, E, F[w + 2], 23, -995338651);
                E = a(E, D, C, B, F[w], 6, -198630844);
                B = a(B, E, D, C, F[w + 7], 10, 1126891415);
                C = a(C, B, E, D, F[w + 14], 15, -1416354905);
                D = a(D, C, B, E, F[w + 5], 21, -57434055);
                E = a(E, D, C, B, F[w + 12], 6, 1700485571);
                B = a(B, E, D, C, F[w + 3], 10, -1894986606);
                C = a(C, B, E, D, F[w + 10], 15, -1051523);
                D = a(D, C, B, E, F[w + 1], 21, -2054922799);
                E = a(E, D, C, B, F[w + 8], 6, 1873313359);
                B = a(B, E, D, C, F[w + 15], 10, -30611744);
                C = a(C, B, E, D, F[w + 6], 15, -1560198380);
                D = a(D, C, B, E, F[w + 13], 21, 1309151649);
                E = a(E, D, C, B, F[w + 4], 6, -145523070);
                B = a(B, E, D, C, F[w + 11], 10, -1120210379);
                C = a(C, B, E, D, F[w + 2], 15, 718787259);
                D = a(D, C, B, E, F[w + 9], 21, -343485551);
                E = o(E, z);
                D = o(D, y);
                C = o(C, v);
                B = o(B, u)
            }
            return [E, D, C, B]
        }
        function p(v) {
            var w, u = "";
            for (w = 0; w < v.length * 32; w += 8) {
                u += String.fromCharCode((v[w >> 5] >>> (w % 32)) & 255)
            }
            return u
        }
        function j(v) {
            var w, u = [];
            u[(v.length >> 2) - 1] = undefined;
            for (w = 0; w < u.length; w += 1) {
                u[w] = 0
            }
            for (w = 0; w < v.length * 8; w += 8) {
                u[w >> 5] |= (v.charCodeAt(w / 8) & 255) << (w % 32)
            }
            return u
        }
        function k(u) {
            return p(d(j(u), u.length * 8))
        }
        function f(w, z) {
            var v, y = j(w), u = [], x = [], A;
            u[15] = x[15] = undefined;
            if (y.length > 16) {
                y = d(y, w.length * 8)
            }
            for (v = 0; v < 16; v += 1) {
                u[v] = y[v] ^ 909522486;
                x[v] = y[v] ^ 1549556828
            }
            A = d(u.concat(j(z)), 512 + z.length * 8);
            return p(d(x.concat(A), 512 + 128))
        }
        function t(w) {
            var z = "0123456789abcdef", v = "", u, y;
            for (y = 0; y < w.length; y += 1) {
                u = w.charCodeAt(y);
                v += z.charAt((u >>> 4) & 15) + z.charAt(u & 15)
            }
            return v
        }
        function m(u) {
            return unescape(encodeURIComponent(u))
        }
        function q(u) {
            return k(m(u))
        }
        function l(u) {
            return t(q(u))
        }
        function h(u, v) {
            return f(m(u), m(v))
        }
        function r(u, v) {
            return t(h(u, v))
        }

        g.md5 = function(v, w, u) {
        if (!w) {
            if (!u) {
                return l(v);
            } else {
                return q(v);
            }
        }
        if (!u) {
            return r(w, v);
        } else {
            return h(w, v);
        }
    }
}(typeof window !== "undefined" ? window : this));

最后我们使用JS调试工具就能验证了,这里我直接在控制台把扣出来的JS加密函数贴进去调用测试如下:

在这里插入图片描述

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/984240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

egg单元测试Mocha报错Error: Cannot find module ‘mocha‘解决办法

最近在玩egg&#xff0c;使用mocha作为单元测试工具时发现一个很奇怪的报错&#xff0c;差了大多数文档都没说明&#xff0c;只好去官网搜了下&#xff0c;发现官网有解决方案。 1. 问题 如果你的报错和我的差不多&#xff0c;恭喜您&#xff0c;以下就是解决方案。 2. 解决方…

基于Delft3D模型水体流动、污染物对流扩散、质点运移、溢油漂移及地表水环境报告编制丨掌握模型建立、参数校准、模拟运行和结果分析等实际操作

目录 专题一 Delft3D软件介绍及建模原理和步骤 专题二 掌握Delft3D各模块的基本原理&#xff0c;以及在模型中的操作流程、实例练习模型 专题三 Delft3D数值模拟溶质运移模型建立 专题四 工程实施前后水文情势、流场、冲淤的变化 专题五 地表水环境风险预测 专题六 地表水…

HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(一)连续识别

组合手势由多种单一手势组合而成&#xff0c;通过在GestureGroup中使用不同的GestureMode来声明该组合手势的类型&#xff0c;支持连续识别、并行识别和互斥识别三种类型。 .GestureGroup(mode:GestureMode, …gesture:GestureType[]) mode&#xff1a;必选参数&#xff0c;为G…

老听说企业要做私域运营,那具体如何做呢?

以前企业获得新客户的方式是从各大流量平台进行引流&#xff0c;但现在这些公域平台人力投入和产出的比例不合理&#xff0c;或者费用太高而无法承担。因此&#xff0c;企业需要建立自己的私域流量池&#xff0c;无需付费、随时可接触的私域流量池。 那么&#xff0c;怎么做私域…

【数据结构】 七大排序详解(壹)——直接插入排序、希尔排序、选择排序、堆排序

文章目录 &#x1f340;排序的概念及引用&#x1f431;‍&#x1f464;排序的概念&#x1f431;‍&#x1f453;排序运用&#x1f431;‍&#x1f409;常见的排序算法 &#x1f334;插入排序&#x1f38b;基本思想&#xff1a;&#x1f6eb;直接插入排序&#x1f4cc;算法步骤&…

彩色图像处理彩色模型

彩色图像处理 彩色基础 人类感知一个物体的颜色是由物体反射光的性质决定的描述彩色光源的基本量&#xff1a; 辐射&#xff1a;是从光源流出能量的总量&#xff0c;用瓦特来度量光强&#xff1a;给出观察者从光源感知的能量总和的度量&#xff0c;用流明来度量亮度&#xff…

小龟带你写Java经典题(合并有序数组)

合并有序数组 1.题目2.图解分析3.代码演示 1.题目 2.图解分析 3.代码演示

汽车行业“墨守成规”?VR全景助力车企打开新局面

近年来&#xff0c;随着互联网时代的快速发展&#xff0c;各个行业都在不断挖掘创新点&#xff0c;汽车行业也是如此。以往汽车销售在线下门店的限制较多&#xff0c;由于营销方式、场地限制等原因&#xff0c;用户的体验过于单一&#xff0c;并且现场展示样车不多&#xff0c;…

控制算法::速度前馈

伺服三环设计---位置环前馈环路设计 - 百度文库 (baidu.com) 伺服电机-松下伺服前馈功能的使用示例_上海会通自动化科技发展有限公司 (shhuitong.net) 运动控制中速度前馈的作用_省身求是的博客-CSDN博客 速度前馈功能_技成培训网论坛 (jcpeixun.com)

lvm + raid(逻辑磁盘+阵列)创建删除恢复 for linux

本教程适用于linux lvm为逻辑磁盘&#xff0c;raid为阵列&#xff0c;两种技术可以单独使用也可以搭配使用 2023.9.3更新 前三节是操作命令和基础知识&#xff0c;后面是实操。 一、存储硬件查看相关命令 硬盘分区相关操作在后面用的到&#xff0c;可以先略过&#xff0c;有需…

微信小程序实现连续签到七天

断签之后会从第一天重新开始 <template><view class"content" style"height: 100vh;background: white;"><view class"back"><view style"position: absolute;bottom: 200rpx;left: 40rpx;width: 90%;"><i…

星际争霸之小霸王之小蜜蜂(十一)--杀杀杀

系列文章目录 星际争霸之小霸王之小蜜蜂&#xff08;十&#xff09;--鼠道 星际争霸之小霸王之小蜜蜂&#xff08;九&#xff09;--狂鼠之灾 星际争霸之小霸王之小蜜蜂&#xff08;八&#xff09;--蓝皮鼠和大脸猫 星际争霸之小霸王之小蜜蜂&#xff08;七&#xff09;--消失…

箭头函数(arrow function)与普通函数之间的区别是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 语法简洁性&#xff1a;⭐ this 的绑定&#xff1a;⭐ 不能用作构造函数&#xff1a;⭐ 没有 arguments 对象&#xff1a;⭐ 不适用于方法&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上…

svn log 高级命令解释

参考目录 基本命令完整命令效果鸣谢 实现目标&#xff1a;svn查询指定版本或时间范围指定人最近的变更文件路径到输出文件 基本命令 svn log --search youname -r {param1}:{param2} -v > custom.out完整命令 svn log --search yuanyubo -r {2020-07-01}:{2020-09-01} -v …

leetcode 43.字符串相乘

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;字符串相乘 思路&#xff1a; 代码&#xff1a; class Solution { public:string multiply(string num1, string num2) {if (num1 "0" || num2 "0") {return "0";}/*0 1 2 下标1 2…

Python基于Mirai开发的QQ机器人保姆式教程(亲测可用)

在本教程中&#xff0c;我们将使用Python和Mirai来开发一个QQ机器人&#xff0c;本文提供了三个教学视频&#xff0c;包教包会&#xff0c;本文也很贴心贴了代码和相关文件。话不多说&#xff0c;直接开始教学。 目录 一、安装配置MIrai 图片验证码报错&#xff1a; 二、机器…

定时任务实现方案总结

一、概述 定时任务的作用是在设定的时间和日期后自动执行任务&#xff0c;执行任务的周期既能是单次也能是周期性。 本文重点说明Timer、ScheduledThreadPoolExecutor、Spring Task、Quartz等几种定时任务技术方案。 二、Timer JDK自带的Timer是最古老的定时任务实现方式了。…

基于SSM的房屋租售网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

2023如何做谷歌收录?

答案是&#xff1a;2023谷歌收录可以通过GPC爬虫池技术完成。 搜索引擎优化&#xff08;SEO&#xff09;对于任何网站来说都是至关重要的。 特别是谷歌作为全球最大的搜索引擎&#xff0c;网站是否能被其快速收录直接关系到网站的流量和影响力。 以下是关于2023年如何做谷歌…

nginx请求接口转发-浏览器访问80端口,要把请求转发至8882

1、需求 浏览器访问80端口&#xff0c;要把请求转发至8882 2、实现 修改ngixn配置文件 ngin配置文件在nginx安装目录/nginx/conf文件夹下 cd /usr/local/nginx/confvi ngin.conf修改server配置 server {listen 80;server_name localhost;location / {proxy_pass …