请教用.NET Reflector载入后如何进行分析,教会的有悬赏。
今天有一个软件。.net语言的软件,以前接触的都是delphi的,对OD有一定的了解,但是今天突然接触到.net的,提示下面这张图片这种,脑袋一片迷茫。
用.NET Reflector载入后如何进行分析,研究了几天一直没看懂,请问有哪一们大神给点教程或者思路。在此谢过。
https://attach.52pojie.cn//forum/202009/30/163557j99h692u9j629m96.jpg?l
本帖最后由 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
.net程序没有混淆的话就相当于把源码给你了,这还不会吗?
因为不会.net语言,所以不会,如果可以帮忙的话,太感谢 了。 register 方法返回bool 估计直接修改这个返回值即可 直接导出源码,用vs软件打开源码,重新修改。 用dnSpy分分钟搞定,不.net的人用这个还能好点
winform程序 反编译很简单 不忘初心哟 发表于 2020-9-30 17:18
winform程序 反编译很简单
C#看不懂的样子,是否可以麻烦教一下。