大家好,我是TheWeiJun;最近由于工作太忙好久没有更新了。静下心来,突然很想念各位读者朋友,所以晚上抽空更新一篇。今天分享一篇关于魔改md5实现的加密算法逆向分析,本文将用多种语言还原加密算法,解决不同语言还原加密算法的难题。希望各位朋友能够多多提出宝贵意见,在阅读的同时记得给我一个star!
特别声明:本公众号文章只作为学术研究,不作为其它不法用途;如有侵权请联系作者删除。
目录
一、前言介绍
二、参数分析
三、堆栈调试
四、算法分析
五、思路总结
趣味模块
小军是一名工程师,最近小军遇到了一个棘手的问题:小军想要还原一个加密算法,他不想和往常一样通过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运行,去掉一些无用代码后,完整代码如下:
1.1 代码运行后截图如下:
总结:通过还原js代码,我们已经能够解决小军提到的问题。大家肯定很好奇,为啥我知道该网站使用的算法是魔改md5加密算法,很简单的一步操作就是先看常量(a、b、c、d),再看码表K。很明显这个地方的a、b、c、d四个常量转为16进制后,是经过了特殊的魔改而来。接下来让我们用其他语言来实现该算法吧!
2、经过上面的深度分析后,我通过修改md5源码实现了一版Python魔改的md5算法,完整代码如下:
2.1 代码运行后截图如下:
3、为了满足小军的需求,我们又实现了一版Go语言版本的魔改md5算法,完整代码如下:
3.1 main函数完整代码如下:
3.2 代码运行后,截图如下所示:
总结:观察Goland生成的加密值,我们可以确定和前面计算的结果一致,接下来我们再研究下java版本魔改md5如何实现。
4、作者通过Java语言实现的魔改md5完整代码如下:
4.1 代码实现后,我们将运行后的代码截图如下所示:
总结:本篇文章到这里,我们已经能够通过Js、Python、Go、Java语言去实现魔改md5算法还原了,小军遇到的难题我们已经迎刃而解,整篇文章字数有点多,感谢大家耐心观看!
五、思路总结
回顾整个分析流程,本次难点主要概括为以下几点:
如何快速确定位加密参数的位置
堆栈回源如何过滤无用代码
Js、Python还原加密算法实现
Go、Java还原加密算法实现
熟练掌握Md5算法及加密运算过程
领取专属 10元无门槛券
私享最新 技术干货