当前位置:首页 > 资讯 > 正文

被魔改md5加密坑了?某网站魔改md5加密逆向还原 (多种语言还原)

被魔改md5加密坑了?某网站魔改md5加密逆向还原 (多种语言还原)

大家好,我是TheWeiJun;最近由于工作太忙好久没有更新了。静下心来,突然很想念各位读者朋友,所以晚上抽空更新一篇。今天分享一篇关于魔改md5实现的加密算法逆向分析,本文将用多种语言还原加密算法,解决不同语言还原加密算法的难题。希望各位朋友能够多多提出宝贵意见,在阅读的同时记得给我一个star!

特别声明:本公众号文章只作为学术研究,不作为其它不法用途;如有侵权请联系作者删除。

目录

一、前言介绍

二、参数分析

三、堆栈调试

四、算法分析

五、思路总结

趣味模块

小军是一名工程师,最近小军遇到了一个棘手的问题:小军想要还原一个加密算法,他不想和往常一样通过Python调用JS的方式去实现算法还原;而是选择通过Python、Go、Java语言去实现算法还原。这篇文章中,我们将解决小军遇到的困境,让我们一起去看小军遇到的难题并通过多种语言去实现算法还原吧!

逆向与爬虫的故事

专注于网络爬虫、JS逆向、APP逆向、安全攻防实战经验分享及总结。


一、前言介绍

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参数没有重要参数影响,故不作说明。


三、断点调试

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算法及加密运算过程

本篇分享到这里就结束了,欢迎大家关注下期,我们不见不散☀️☀️😊


往期推荐

爬虫最快框架collyx,今天开源了...

某站弹幕Protobuf协议逆向分析  |  Go语言版本

某游戏社区App | So层逆向分析

某容器管理平台模拟登录(Go语言版本)

Scrapy源码分析之RetryMiddleware模块

作者简介

我是TheWeiJun,有着执着的追求,信奉终身成长,不定义自己,热爱技术但不拘泥于技术,爱好分享,喜欢读书和乐于结交朋友,欢迎扫我微信与我交朋友💕

分享日常学习中关于爬虫及逆向分析的一些思路,文中若有错误的地方,欢迎大家多多交流指正💕

原文地址: 被魔改md5加密坑了?某网站魔改md5加密逆向还原 (多种语言还原)

微信搜公众号:逆向与爬虫的故事;给我一个关注!