【文章标题】: 初学者破解VB.NET简单加密教学
【文章作者】: 爱琴海
【软件名称】: 某数据处理程序
【下载地址】: 自己搜索下载
【编写语言】: VB.NET
【使用工具】: Reflector
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
PEID: Microsoft Visual C# / Basic .NET
第一次接触VB.NET程序,产生分析的冲动。
软件未注册,运行后,弹出输入框要求输入对应机器码的注册码。三次输入错误提示注册失败。程序菜单全部锁定变灰色。
遂用OD狂分析,一头雾水。
偶见Reflector,柳暗花明,不敢独享,与君共勉。
用Reflector载入主程序,看得如下:
逐级展开,到“工程1”--“Form1”--“Form1_Load(Object,EventArgs):Void”
双击“Form1_Load(Object,EventArgs):Void”
看到:
截取算法部分如下:
bool flag = false;
if (((Strings.Len(FileSystem.Dir("c:/program files/common files/autodesk shared/acdbspspd.lxy",
FileAttribute.Normal)) >= 5) && (Strings.Len(FileSystem.Dir("c:/windows/winnta.dlt", FileAttribute.Normal)) >= 5))
&& ((Strings.Len(FileSystem.Dir("c:/windows/system/sounda.bpc", FileAttribute.Normal)) >= 5) && (Strings.Len
(FileSystem.Dir("c:/windows/system32/c_808.efp", FileAttribute.Normal)) >= 5)))
{
flag = true;
}
else
{
double num2 = Math.Abs(Conversion.Int((double) (Math.Tan(DateAndTime.Timer) * 100000000.0)));
double d = num2 * 720915.0;
double num4 = Math.Abs(Conversion.Int((double) (Math.Tan(Math.Log(d)) * 100000000.0)));
int num5 = 1;
do
{
if (Interaction.InputBox("用户码:" + Conversions.ToString(num2), "用户注册", "", -1, -1) ==
Conversions.ToString(num4))
{
int fileNumber = FileSystem.FreeFile();
FileSystem.FileOpen(fileNumber, "c:/program files/common files/autodesk shared/acdbspspd.lxy",
OpenMode.Output, OpenAccess.Default, OpenShare.Default, -1);
FileSystem.PrintLine(fileNumber, new object[] { "confg.sys" });
FileSystem.FileClose(new int[] { fileNumber });
fileNumber = FileSystem.FreeFile();
FileSystem.FileOpen(fileNumber, "c:/windows/winnta.dlt", OpenMode.Output, OpenAccess.Default,
OpenShare.Default, -1);
FileSystem.PrintLine(fileNumber, new object[] { "pff.efg" });
FileSystem.FileClose(new int[] { fileNumber });
fileNumber = FileSystem.FreeFile();
FileSystem.FileOpen(fileNumber, "c:/windows/system/sounda.bpc", OpenMode.Output,
OpenAccess.Default, OpenShare.Default, -1);
FileSystem.PrintLine(fileNumber, new object[] { "aword.app" });
FileSystem.FileClose(new int[] { fileNumber });
fileNumber = FileSystem.FreeFile();
FileSystem.FileOpen(fileNumber, "c:/windows/system32/c_808.efp", OpenMode.Output,
OpenAccess.Default, OpenShare.Default, -1);
FileSystem.PrintLine(fileNumber, new object[] { "excel.app" });
FileSystem.FileClose(new int[] { fileNumber });
goto Label_033B;
}
num5++;
}
while (num5 < 4);
Interaction.MsgBox("注册失败!", MsgBoxStyle.OkOnly, "警告");
this.Txt1.LoadFile(@"D:\LnlPro\cass数据处理\1.txt", RichTextBoxStreamType.PlainText);
this.MenuStrip.Enabled = false;
this.Toolbar.Enabled = false;
}
逐条语句分析来看:
先定义一个FALSE变量
检测:
c:/program files/common files/autodesk shared/acdbspspd.lxy
c:/windows/winnta.dlt
c:/windows/system/sounda.bpc
c:/windows/system32/c_808.efp
这些文件是否存在,且大小必须大于等于5个字节,如果符合,就返回TRUE,不然就是FALSE,需要注册。
可见手动建立以上这4个文件,且填入5个以上字符,即可告破。
我们接着分析算法流程:
do
{
num5++;
}
while (num5 < 4);
表示如果注册码错误,可以允许3次输入机会。
double num2 = Math.Abs(Conversion.Int((double) (Math.Tan(DateAndTime.Timer) * 100000000.0)));
double d = num2 * 720915.0;
double num4 = Math.Abs(Conversion.Int((double) (Math.Tan(Math.Log(d)) * 100000000.0)));
int num5 = 1;
用TIMER函数产生一个关于当前时间的随机数,然后对其求正切,然后对值乘100000000,转换为整型。对这个值乘以720915,类型
为DOUBLE。
这个值也就是显示出来的机器码了。
从:
if (Interaction.InputBox("用户码:" + Conversions.ToString(num2), "用户注册", "", -1, -1) == Conversions.ToString
(num4))
可以看出num4就是用户要输入的字符。
其计算公式为:
double num4 = Math.Abs(Conversion.Int((double) (Math.Tan(Math.Log(d)) * 100000000.0)));
也就是将机器码取对数,再正切,然后乘以100000000,再把结果取整,组后取绝对值。这个就是注册码了!
算法注册机就没必要写了,这个算法太简单。
--------------------------------------------------------------------------------
【经验总结】
学会使用Reflector,对代码未加密的.NET的程序来说,非常好用!你也试试?
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2009年05月06日 10:18:38
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课