Loading... “ 阅读本文大概需要 13 分钟。 ” 目录 一、前言介绍 二、参数分析 三、堆栈调试 四、算法分析 五、思路总结 --- 趣味模块 小军是一名工程师,最近小军遇到了一个棘手的问题:小军想要还原一个加密算法,他不想和往常一样通过 Python 调用 JS 的方式去实现算法还原;而是选择通过 Python、Go、Java 语言去实现算法还原。这篇文章中,我们将解决小军遇到的困境,让我们一起去看小军遇到的难题并通过多种语言去实现算法还原吧! --- 一、前言介绍 1、什么是 md5 加密? MD5 消息摘要算法 (MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个 128 位(16 字节)的散列值(hash value),用于确保信息传输完整一致。MD5 加密是一种不可逆的加密算法,不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。 2、md5 是如何加密的? MD5 算法的原理可简要的叙述为:MD5 码以 512 位分组来处理输入的信息,且每一分组又被划分为 16 个 32 位子分组,经过了一系列的处理后,算法的输出由四个 32 位分组组成,将这四个 32 位分组级联后将生成一个 128 位散列值。 总体流程如下图所示,每次的运算都由前一轮的 128 位结果值和当前的 512bit 值进行运算 。  了解了 md5 加密后,接下来我们去实战中分析 md5 是如何实现魔改并进行加密运算的。 --- 二、参数分析 1、首先打开我们今天要模拟的网站,刷新当前页面,使用 fn+F12 打开开发者界面,直接定位我们要获取的接口,截图如下所示:  2、我们确定好获取的接口后,点击 payload 查看该请求参数,截图如下所示:  3、标红的参数就是我们本次要还原的加密参数,接下来,我们对该接口各个参数进行初判断及整理分析: **Data 参数分析:** - formDataSign 初步怀疑是 md5 加密,长度 32 位 - formDataStr 搜索的关键字 - jsVer JS 发版时间 - timestamp 当前时间戳,长度 10 位 **Headers 参数分析:** \***\*说明:\*\***由于 headers 参数没有重要参数影响,故不作说明。 ormData --- 三、断点调试 1、使用最简单的方式,查询指定关键字、加密方法,定位加密参数具体坐标文件,截图如下:  **说明:**经过查询,我们可以肯定的是代码中没有用到这个变量名,然后我们去搜索加密方法,发现能搜到结果,但是和我们的加密参数关联不大,截图如下:  2、接下来,我们还是使用 XHR 打断点,回溯堆栈的方式查找吧,截图如下:  3、然后刷新当前页面,进行堆栈查找,截图如下:  总结:很明显此刻加密参数已经生成,我们需要定位参数生成的位置,就需要学会查看堆栈信息,接下里进行堆栈回溯。 4、通过 Call Stack 进行堆栈回溯,截图如下所示:  5、由于堆栈回溯流程环节较多,我们直接快进定位到加密参数位置,截图如下:  **说明:**此刻我们可以看到 t 参数为 timetamp 参数拼接 salt 参数,然后进行下面参数运行即可得到第一次加密的密文,截图如下所示:  **总结**:此刻我们验证下前面的猜想:是否是 md5 加密,将明文信息粘贴到 md5 在线生成工具中验证,结果和 js 生成的值不匹配,截图如下:  6、继续执行断点,我们可以看到第二次加密运行截图如下图所示:  总结:此刻我们可以看到第二次加密运行的入参为:formDataStr 拼接刚刚加密运行得到密文的 32 位字符串。继续执行断点,截图如下图所示:  7、将 JS 断点调试生成的最终加密值,与 xhr 请求时发送的 formDataSign 加密值对比,截图如下:  总结:我们可以看到 formDataSign 的值是经过两轮 js 自定义魔改算法而生成的,接下来我们通过还原 js 加密算法去验证该网站是否使用的魔改 md5。 --- 四、算法还原 1、先将本次分析的 js 代码抠出来使用 Nodejs 运行,去掉一些无用代码后,完整代码如下: function encrypt(e) { 1.1 代码运行后截图如下:  **总结:**通过还原 js 代码,我们已经能够解决小军提到的问题。大家肯定很好奇,为啥我知道该网站使用的算法是魔改 md5 加密算法,很简单的一步操作就是先看常量 (a、b、c、d),再看码表 K。很明显这个地方的 a、b、c、d 四个常量转为 16 进制后,是经过了特殊的魔改而来。接下来让我们用其他语言来实现该算法吧! 2、经过上面的深度分析后,我通过修改 md5 源码实现了一版 Python 魔改的 md5 算法,完整代码如下: # -*- coding: utf-8 -*- 2.1 代码运行后截图如下:  3、为了满足小军的需求,我们又实现了一版 Go 语言版本的魔改 md5 算法,完整代码如下: package md5 3.1 main 函数完整代码如下: package main 3.2 代码运行后,截图如下所示:  **总结**:观察 Goland 生成的加密值,我们可以确定和前面计算的结果一致,接下来我们再研究下 java 版本魔改 md5 如何实现。 4、作者通过 Java 语言实现的魔改 md5 完整代码如下: 4.1 代码实现后,我们将运行后的代码截图如下所示:  **总结:**本篇文章到这里,我们已经能够通过 Js、Python、Go、Java 语言去实现魔改 md5 算法还原了,小军遇到的难题我们已经迎刃而解,整篇文章字数有点多,感谢大家耐心观看! --- 五、思路总结 回顾整个分析流程,本次难点主要概括为以下几点: - 如何快速确定位加密参数的位置 - 堆栈回源如何过滤无用代码 - Js、Python 还原加密算法实现 - Go、Java 还原加密算法实现 - 熟练掌握 Md5 算法及加密运算过程 本篇分享到这里就结束了,欢迎大家关注下期,我们不见不散 ☀️☀️😊 最后修改:2023 年 03 月 12 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 17816 如果觉得我的文章对你有用,请随意赞赏