njcj2008 发表于 2020-9-30 16:42

请教用.NET Reflector载入后如何进行分析,教会的有悬赏。

今天有一个软件。.net语言的软件,以前接触的都是delphi的,对OD有一定的了解,
但是今天突然接触到.net的,提示下面这张图片这种,脑袋一片迷茫。



用.NET Reflector载入后如何进行分析,研究了几天一直没看懂,请问有哪一们大神给点教程或者思路。在此谢过。

https://attach.52pojie.cn//forum/202009/30/163557j99h692u9j629m96.jpg?l


vipcrack 发表于 2020-9-30 16:42

本帖最后由 vipcrack 于 2020-9-30 19:29 编辑

njcj2008 发表于 2020-9-30 19:21
我是想要方法,最后得来的码的方法,我只是想学习这个线路,麻烦详解。谢了。(而且每个机器的码都不同。 ...
反编译软件,看注册码判断的地方:

private void BtnRegister_Click(object sender, EventArgs e)
{
      try
      {
                string register = TbRegisterCode.Text.Trim();
                string code = TbMachineCode.Text.Trim();
                string machine = DES.GetMachine(register);
                if (machine.Equals(code))
                {
                        dal.Register(register);
                        base.DialogResult = DialogResult.OK;
                        Close();
                        return;
                }
                throw new Exception("Registration key mismatch");
      }
      catch (Exception ex)
      {
                MessageBox.Show(ex.Message, "Tips");
      }
}


machine.Equals(code),是说你输入的注册信息,DES.GetMachine(register)用这个函数解密后,必须等于机器码。

那么去看这个函数

public static string GetMachine(string pToDecrypt)
{
      if (string.IsNullOrWhiteSpace(pToDecrypt))
      {
                return string.Empty;
      }
      string str = Decrypt(pToDecrypt, key);//这里用des的key来对输入的注册码解码
      return str.Substring(0, str.Length - 3);//解码后的数据,去掉后3位
}

也就是说解密输入的注册码后的内容,去掉后3位必须等于机器码。

那么我们把机器码和后3位加密回去就是注册码,加密需要用到函数
public static string Encrypt(string pToEncrypt, string sKey)
{
      try
      {
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
                des.Key = Encoding.ASCII.GetBytes(sKey);
                des.IV = Encoding.ASCII.GetBytes(sKey);
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                StringBuilder ret = new StringBuilder();
                byte[] array = ms.ToArray();
                foreach (byte b in array)
                {
                        ret.AppendFormat("{0:X2}", b);
                }
                ret.ToString();
                return ret.ToString();
      }
      catch (Exception)
      {
                return "";
      }
}


这两个函数都是DES这个类中,直接复制代码出来,然后做注册机就行。

这里的后三位可以从代码里看到是啥?:
public static int GetNum(string pToDecrypt)
{
      if (string.IsNullOrWhiteSpace(pToDecrypt))
      {
                return 0;
      }
      string str = Decrypt(pToDecrypt, key);
      string num = str.Substring(str.Length - 3);
      return Convert.ToInt32(num);
}


这里可以看到是注册界面的key后面的数据,不知道干啥的,我没SQL环境。

private void InitialLoad()
{
      try
      {
                LblSoftwareVerNO.Text = "3.20.0003";
                chkBase64.Checked = (GetConfigValue("UseBase64", pathConfig) == "1");
                string uuid = ComputerHelper.GetUniqueIdentification();
                TbMachineCode.Text = uuid;
                string key = DecryptKeyDAL.GetKey();
                lblKeyNum.Text = DES.GetNum(key).ToString();
                TbRegisterCode.Text = (DES.GetMachine(key).Equals(uuid) ? DecryptKeyDAL.GetKey() : string.Empty);
      }
      catch (Exception e)
      {
                MessageBox.Show(e.Message, "Error");
      }
}

知道了这些,就把DES里用到的Encrypt函数,keys,key常量复制出来,然后用C#弄个界面,写成注册机就行了,代码就是前面我回复的代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;

namespace keygen
{
    public partial class Form1 : Form
    {
      public Form1()
      {
            InitializeComponent();
      }
      private static byte[] Keys = new byte
            {
      52,
      17,
      6,
      239,
      154,
      52,
      17,
      16
            };

      private static string key = "bxu+ss@q";
      public static string Encrypt(string pToEncrypt, string sKey)
      {
            try
            {
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
                des.Key = Encoding.ASCII.GetBytes(sKey);
                des.IV = Encoding.ASCII.GetBytes(sKey);
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                StringBuilder ret = new StringBuilder();
                byte[] array = ms.ToArray();
                foreach (byte b in array)
                {
                  ret.AppendFormat("{0:X2}", b);
                }
                ret.ToString();
                return ret.ToString();
            }
            catch (Exception)
            {
                return "";
            }
      }
      private void button1_Click(object sender, EventArgs e)
      {
            string str = Encrypt(textBox1.Text+"999", key);
            textBox2.Text = str;
      }
    }
}


界面上放两个TextBox一个Button就行了,Button代码用上面的。

细水流长 发表于 2020-9-30 16:47

njcj2008 发表于 2020-9-30 16:49

细水流长 发表于 2020-9-30 16:47
.net程序没有混淆的话就相当于把源码给你了,这还不会吗?

因为不会.net语言,所以不会,如果可以帮忙的话,太感谢 了。

细水流长 发表于 2020-9-30 16:53

longiana 发表于 2020-9-30 16:56

register 方法返回bool 估计直接修改这个返回值即可

ppszxc 发表于 2020-9-30 17:17

直接导出源码,用vs软件打开源码,重新修改。

不知道改成啥 发表于 2020-9-30 17:18

用dnSpy分分钟搞定,不.net的人用这个还能好点

不忘初心哟 发表于 2020-9-30 17:18

winform程序 反编译很简单

njcj2008 发表于 2020-9-30 17:20

不忘初心哟 发表于 2020-9-30 17:18
winform程序 反编译很简单

C#看不懂的样子,是否可以麻烦教一下。
页: [1] 2 3 4
查看完整版本: 请教用.NET Reflector载入后如何进行分析,教会的有悬赏。