吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5808|回复: 40
收起左侧

[.NET逆向] 某机房管理软件管理员密码加密算法的分析

  [复制链接]
NuclearEngine 发表于 2021-8-3 00:23
本帖最后由 NuclearEngine 于 2021-8-3 00:40 编辑

image.png
最近机房老师给电脑安装了此软件以加强对上课纪律的管理,因此将其拿来开刀{:1_886:}

惯例查壳
image.png
可以清楚的看到基于VB.NET框架开发,加了个Reactor4的弱混淆壳,直接de4dot扒了,拖进DNSPY
找到主窗口处理函数m1
image.png
非常的混乱。。。。。。。
仔细一看
很多都是无效代码(关于软件细节功能的部分略去,不在此讨论)




分析开始
                                                                IL_309:
                                num2 = 40;
                                this.Label2.Text = "原密码不正确,请重新输入!";
                                IL_31C:
                                num2 = 41;
                                this.pd_old.Text = "";


找到密码对比分析关键处
回到导致跳转到309的判断处


if (Operators.CompareString(left2, text, false) != 0)
         {
                     goto IL_309;
         }


很显然其对比了left2与text的值,相等则通过校验

回到代码上,调用left2的地方
找到两处

string left2 = Class7.smethod_0(this.pd_old.Text);//对话框读取并初次处理

left2 = Class7.smethod_2(left2);//再次处理

从left2基本可以得出其校验算法

进入method0

大致浏览 看到了标志性的DES加密算法


                                                DESCryptoServiceProvider descryptoServiceProvider = new DESCryptoServiceProvider();
                        IL_1AE:
                        num2 = 23;
                        Encoding.Default.GetBytes(string_0);
                        IL_1BD:
                        num2 = 24;
                        descryptoServiceProvider.Key = Encoding.UTF8.GetBytes(s);
                        IL_1D3:
                        num2 = 25;
                        descryptoServiceProvider.IV = Encoding.UTF8.GetBytes(s2);
                        IL_1E9:
                        num2 = 26;
                        MemoryStream memoryStream = new MemoryStream();
                        IL_1F3:
                        num2 = 27;
                        CryptoStream cryptoStream = new CryptoStream(memoryStream, descryptoServiceProvider.CreateEncryptor(), CryptoStreamMode.Write);
                        IL_207:
                        num2 = 28;
                        StreamWriter streamWriter = new StreamWriter(cryptoStream);

result = Class7.smethod_3(string_);
return result;



浏览一下代码 可以得到基本逻辑

Method0逻辑:读取对话框内容(老密码)---->获取系统盘路径作为des加密算法的密钥和偏移量----->对老密码进行des加密------>带入method3再次处理

进入method3

一眼看到关键处:经典的移位加密

byte b3 = checked((byte)num4);
                        for (b = 1; b <= b3; b += 1)
                        {
                                IL_102:
                                num2 = 22;
                                string @String = Strings.Mid(string_0, (int)b, 1);
                                IL_111:
                                num2 = 23;
                                string str = Conversions.ToString(Strings.Chr(checked(Strings.Asc(@string) - 10)));
                                IL_12A:
                                num2 = 24;
                                text += str;
                                IL_138:
                                num2 = 25;
                        }
                        IL_148:
                        num2 = 26;
                        result = text;



每位的asc码向前移10,这好办逆回去就行,这也不是大问题。。。。。自以为差不多准备收工

Method3逻辑:将method0得到的des密文每位前移10个asc码

最后抱着看不看无所谓的态度进了method2准备瞧瞧这是干什么的


晴天霹雳!

标准的MD5 hash算法乍一眼看没加盐:shutup:

                                                MD5CryptoServiceProvider md5CryptoServiceProvider = new MD5CryptoServiceProvider();
                        IL_ED:
                        num2 = 20;
                        byte[] array2 = md5CryptoServiceProvider.ComputeHash(Encoding.Default.GetBytes(string_0));
                        IL_104:
                        num2 = 21;
                        StringBuilder stringBuilder = new StringBuilder();


管他MD5还是5DM,有彩虹表,怕啥?继续。。。。。

result = Strings.Mid(str, 11, 30);


额。。。。。它对比的好像不是完整的32位md5,是中间的一小个片段。。。。。。。

Metho2逻辑:计算method3处理过的密文的MD5,并返回其11到32位子串


------------------------------------------------------

分析到此心已基本亮了半截

看一下密码总逻辑:

Method0 逻辑:读取对话框内容(老密码)---->获取系统盘路径作为des加密算法的密钥和偏移量----->对老密码进行des加密------>带入method3再次处理
Method3逻辑:将method0得到的des密文每位前移10个asc码
Metho2逻辑:计算method3处理过的密文的MD5,并返回其11到32位子串
最后对比储存着密码特征值与输入的特征值进行校验

也就是说就算我撞出一样的md5,我也没有办法推导过des解密这关,众所周知des对密文要求很高。。。。。。。


开发者的细节处理相当的不错,也就是说。。嗯。。。推导出密码的可能性微乎其微


文章的最后,再来分享一个解密过程中遇到的一个小坎。

也就是在寻找其特征码存在何处时,真的一开始完全摸不着头脑。。。(作者写了很多迷惑干扰的注册表路径。。)

知道我发现了这个:
string text = "7]F8H]&gd9*fCAd(B9(Z9PEIl+";text += "P::9mnJ8,@b'I?I%.3";

非常可疑的字符串,调试走一下发现text就是特征码注册表路径的des加密密文,密钥还是之前method0里的,‘


唉。

这细节!绝了!


总结一下:开发者写的这种混合加密方式确实是对于MD5算法的一种不错的加强,尤其是在如今高算力时代,碰撞的时间复杂度早已大大降低。当然今天的目的还是没有达成,但也收获了一种值得学习的安全技巧。

样本链接:https://nuclear.lanzoui.com/i6R3ls5vrvc























image.png

免费评分

参与人数 10威望 +1 吾爱币 +29 热心值 +9 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Elnus + 1 + 1 谢谢@Thanks!
vicky526356 + 1 膜拜大神。小白看不懂系列
tao5200 + 1 + 1 用心讨论,共获提升!
tss1390 + 1 + 1 学习了,慢慢消化
xinpenghao + 1 + 1 太强了!
snakenba580 + 1 + 1 谢谢@Thanks!
icebeans + 1 + 1 教程中使用的工具可以分享一下吗
a84291212 + 1 + 1 谢谢@Thanks!
egbert_tao + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

JuncoJet 发表于 2021-8-3 09:33
结论呢,解出来没
头像被屏蔽
shayu2021 发表于 2021-8-3 16:34
温柔 发表于 2021-8-3 00:42
我有个想法,你可以偷偷改了程序代码,让他的密码可以明文保存,那么只要老师管理一次的话.....
 楼主| NuclearEngine 发表于 2021-8-3 00:50
温柔 发表于 2021-8-3 00:42
我有个想法,你可以偷偷改了程序代码,让他的密码可以明文保存,那么只要老师管理一次的话.....

钓鱼也不是不行,伪造密码输入框
kanxue2018 发表于 2021-8-3 00:52
好东西,学习
why174980 发表于 2021-8-3 07:06
学习学习,好东西
头像被屏蔽
shayu2021 发表于 2021-8-3 07:18
提示: 作者被禁止或删除 内容自动屏蔽
xxjj999 发表于 2021-8-3 07:32
谢谢楼主分享
mdx005 发表于 2021-8-3 08:06
感谢楼主大神无私分享,又可以学习了
asdfgh2011 发表于 2021-8-3 08:32
思路挺新颖的。
zx2700 发表于 2021-8-3 08:43
膜拜大佬 学习学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-26 01:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表