本帖最后由 NuclearEngine 于 2021-8-3 00:40 编辑
最近机房老师给电脑安装了此软件以加强对上课纪律的管理,因此将其拿来开刀{:1_886:}
惯例查壳
可以清楚的看到基于VB.NET框架开发,加了个Reactor4的弱混淆壳,直接de4dot扒了,拖进DNSPY
找到主窗口处理函数m1
非常的混乱。。。。。。。
仔细一看
很多都是无效代码(关于软件细节功能的部分略去,不在此讨论)
分析开始
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
|