栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

CrackMe1(.net破解)

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CrackMe1(.net破解)

文章目录
  • CrackMe1
    • (1)修改exe使得出现成功提示
      • i.用dnSpy修改CrackMe1.exe
      • ii.用IDA修改CrackMe1.exe
      • iii.用ILDASM和ILASM修改CrackMe1.exe
    • (2)不修改exe输入正确的密码达到成功的目的

CrackMe1

运行CrackMe1.exe,提示 “嗯,对了” 代表成功。首先修改exe使得出现成功提示,其次不修改exe输入正确的密码达到成功的目的。

先打开CrackMe1.exe,看来是输入一个字符串得到正确答案的题:

(1)修改exe使得出现成功提示 i.用dnSpy修改CrackMe1.exe

用dnSpy打开CrackMe1.exe,反编译:

直接修改代码,将代码

“fOCPTVF0diO+B0IMXntkPoRJDUj5CCsT”==this.Encode(this.textBox1.Text)

中的相等==修改为不相等!=

这样只要我们输入错误的答案都能输出“嗯,对了。。”

结果果然输出了“嗯,对了。。”

ii.用IDA修改CrackMe1.exe

先用IDA打开CrackMe1.exe,
原本想通过字符串“嗯,对了。。”找到文件的关键位置

但发现可能因为是中文或是.Net弹窗的原因,反汇编中没有任何字符串。

只好查看出现的函数名称和各部分Names

找到了加密函数的入口位置:

点进去查看:

找到加密部分函数的中间代码MSIL 反汇编程序:

用Graph view来看逻辑更清楚

Ceq指令的意思就是判断前面的两个值相等就返回1,不相等就返回0。所以我们现在的目的就是修改ceq,改变它的返回值。双击ceq,定位到它的位置上去:

打开IDA显示指令对应的16进制机器码,将ceq对应的机器码:FE 01 修改成clt对应的机器码:FE 04

运行成功输出了“嗯,对了。。”:

iii.用ILDASM和ILASM修改CrackMe1.exe

先用ILDASM打开CrackMe1.exe

转储,保存为:

用编辑器打开:

将ceq跳转修改为clt跳转:

再用ILASM将.il文件编译成.exe文件。

成功输出了“嗯,对了。。”:

(2)不修改exe输入正确的密码达到成功的目的

先用.NET Reflector打开CrackMe1.exe。

将反编译出来的C#代码输出到本地:

因为虽然代码在Reflector上虽然已经有了,但是是以每个函数为单位的,输出到本地可以是整体的文件,可以更好的看出代码结构和逻辑:

我们可以看出来这个CrackMe1.exe主要的逻辑就是,将输入的字符串加密后与“fOCPTVF0diO+B0IMXntkPoRJDUj5CCsT”相等,就输出“嗯,对了。。”。

主要的就是这个加密函数:

所以我们只要将“fOCPTVF0diO+B0IMXntkPoRJDUj5CCsT”解密出需要输入的字符串即可。
C#源代码:

using System;
using System.Text;
using System.Collections;
using System.IO;
using System.Security.Cryptography;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;

namespace Project
{
    class Program
    {
        public static void Main(string[] args)
        {
            
            string result; 
            
            byte[] byte1 = Convert.FromBase64String("fOCPTVF0diO+B0IMXntkPoRJDUj5CCsT");  
            byte[] bytes = Encoding.ASCII.GetBytes("wctf{wol");  
            byte[] bytes2 = Encoding.ASCII.GetBytes("dy_crack}"); 
            
            DESCryptoServiceProvider dESCryptoServiceProvider = new DESCryptoServiceProvider();  
            
            
            MemoryStream memoryStream = new MemoryStream();  
            
            CryptoStream cryptoStream = new CryptoStream(memoryStream, dESCryptoServiceProvider.CreateDecryptor(bytes, bytes2), CryptoStreamMode.Write);  
            
            cryptoStream.Write(byte1, 0, byte1.Length);
            
            cryptoStream.FlushFinalBlock(); 
            
            
            MemoryStream ms = new MemoryStream();
            
            IFormatter formatter = new BinaryFormatter();
            
            formatter.Serialize(ms, memoryStream);
            
            
            System.Text.Encoding encoding = System.Text.Encoding.UTF8;
            
            result = encoding.GetString(memoryStream.GetBuffer());    
                      
            Console.WriteLine(result);
            
            Console.ReadKey();
        }
    }
}

运行结果:

输出解密后的字符串为:wctf{dotnet_crackme1}
将它输入到原始CrackMe1.exe的输入框:

结果正确。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/911078.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号