jy04468108 发表于 2021-5-9 10:41

.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 13:06

本帖最后由 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` 中.


如南风过境z 发表于 2021-5-9 11:39



jy04468108 发表于 2021-5-9 14:08

本帖最后由 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

jy04468108 发表于 2021-5-9 11:03
自认为这个还是有难度的,我目前只想到一种破解思路。

加壳了吗?

jy04468108 发表于 2021-5-9 11:24

花好s月圆 发表于 2021-5-9 11:06
加壳了吗?

加的弱壳,.NET Reactor
C#不加壳,代码全都可见,那就没意思了啊。

jy04468108 发表于 2021-5-9 11:51

如南风过境z 发表于 2021-5-9 11:39


直接修改messagebox的内容,那就没有意思了。

花好s月圆 发表于 2021-5-9 12:04

jy04468108 发表于 2021-5-9 11:24
加的弱壳,.NET Reactor
C#不加壳,代码全都可见,那就没意思了啊。

我身边没电脑,不过我的初步想法是文本查找“密码正确”“密码错误”,找到关键跳转,修改关键跳转。

jy04468108 发表于 2021-5-9 12:25

花好s月圆 发表于 2021-5-9 12:04
我身边没电脑,不过我的初步想法是文本查找“密码正确”“密码错误”,找到关键跳转,修改关键跳转。

没这么简单的。而且这是。net,不是C++。

jy04468108 发表于 2021-5-9 13:15

asq56747277 发表于 2021-5-9 13:06
对称加密没有Key怎么办,只能是通过对明文结果反向加密,之后加密结果与目标结果对比来暴力枚举出Key么

我的初衷是让大家修改密文。从而实现破解。
页: [1] 2 3
查看完整版本: .net 5.0的ReverseMe,欢迎来艹