.net 5.0的ReverseMe,欢迎来艹
本帖最后由 jy04468108 于 2021-5-9 11:55 编辑基于.net 5.0。如果没有运行环境的请自行下载。
下载地址:https://dotnet.microsoft.com/download/dotnet/thank-you/runtime-5.0.5-windows-x64-installer
我没在其他电脑上测试过,这个运行时应该可以用吧。
分析算法,不要直接修改messagebox的内容,这谁都会。
失败截图:
成功截图:
crackme文件: 本帖最后由 asq56747277 于 2021-5-9 14:06 编辑
对称加密没有Key怎么办,只能是通过对明文结果反向加密,之后加密结果与目标结果对比来暴力枚举出Key么
既然楼主直接说了混淆器,那就直接用de4dot来反混淆,不过官方版本用不了,在论坛翻了翻找到一个[对.NET Reactor特攻的de4dot版本](https://www.52pojie.cn/forum.php?mod=viewthread&tid=1402864)
首先先对函数以及用到的变量进行重命名方便后续分析
`byte_0` => `EncryptedResult`
`byte_1` => `Rijndael_IV`
`string_0` => `Key_Dynamic`
`smethod_0` => `MD5Encrypt`
`smethod_1` => `Encrypt8bitText`
`smethod_2` => `DecryptRijndael`
`method_0` => `RepeatEncrypt`
分析之后了解到了验证的流程
```csharp
private void button1_Click(object sender, EventArgs e)
{
try
{
byte[] bytes = Form1.DecryptRijndael(Form1.EncryptedResult, this.textBox1.Text.Substring(0, 3) + this.Key_Dynamic.Substring(3));
string @string = Encoding.UTF8.GetString(bytes);
MessageBox.Show(@string);
}
catch (Exception)
{
MessageBox.Show("密码错误");
}
}
```
在输出结果的函数 `button1_Click` 内, 对 `EncryptedResult` 也就是加密后的 `密码正确 这个字符串` 进行解密, 以第一个文本框前3位加循环加密后的 `Key_Dynamic` 的3位之后的组成Key来进行解密. 假如Key不对会抛出 `Padding is invalid and cannot be removed.` 这个错误之后会到catch块中最终输出 `密码错误`
循环加密的实现
```csharp
private void RepeatEncrypt(ref int EncryptCount, string Result)
{
if (EncryptCount <= 0)
{
EncryptCount = this.textBox2.Text.Length;
this.Key_Dynamic = Result;
}
else
{
EncryptCount--;
Result = Form1.Encrypt8bitText(Result);
this.RepeatEncrypt(ref EncryptCount, Result);
}
}
private static string Encrypt8bitText(string Text2Encrypt)
{
return BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(Encoding.Default.GetBytes(Text2Encrypt)), 4, 8).Replace("-", "");
}
```
加密次数为第二个文本框的文本长度, 每次加密会对需要加密的文本进行MD5处理, 之后从第5个字节(MD5结果)取8个字节并转换为文本. 一共循环 `EncryptCount` 次, 最终将结果保存到全局字段 `Key_Dynamic` 中.
本帖最后由 jy04468108 于 2021-5-9 14:11 编辑
asq56747277 发表于 2021-5-9 13:06
对称加密没有Key怎么办,只能是通过对明文结果反向加密,之后加密结果与目标结果对比来暴力枚举出Key么 ...
我可以直接给出,前三位是:“WWW”
也就是说,用户名是以WWW开头的长度大于3的任意字符串即可。
当然了,你分析的大部分都对,唯一不对的是,key的后面几位,是经过了长度次的md5加密之后,再截取的,所以密码位数是不一定的。
为何不尝试一下修改密文呢,这样岂不是最快? 自认为这个还是有难度的,我目前只想到一种破解思路。 jy04468108 发表于 2021-5-9 11:03
自认为这个还是有难度的,我目前只想到一种破解思路。
加壳了吗? 花好s月圆 发表于 2021-5-9 11:06
加壳了吗?
加的弱壳,.NET Reactor
C#不加壳,代码全都可见,那就没意思了啊。 如南风过境z 发表于 2021-5-9 11:39
直接修改messagebox的内容,那就没有意思了。 jy04468108 发表于 2021-5-9 11:24
加的弱壳,.NET Reactor
C#不加壳,代码全都可见,那就没意思了啊。
我身边没电脑,不过我的初步想法是文本查找“密码正确”“密码错误”,找到关键跳转,修改关键跳转。 花好s月圆 发表于 2021-5-9 12:04
我身边没电脑,不过我的初步想法是文本查找“密码正确”“密码错误”,找到关键跳转,修改关键跳转。
没这么简单的。而且这是。net,不是C++。 asq56747277 发表于 2021-5-9 13:06
对称加密没有Key怎么办,只能是通过对明文结果反向加密,之后加密结果与目标结果对比来暴力枚举出Key么
我的初衷是让大家修改密文。从而实现破解。