vb.net 破解

【文章标题】: 初学者破解VB.NET简单加密教学
【文章作者】: 爱琴海
【软件名称】: 某数据处理程序
【下载地址】: 自己搜索下载
【编写语言】: VB.NET
【使用工具】: Reflector
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】

  PEID: Microsoft Visual C# / Basic .NET

  第一次接触VB.NET程序,产生分析的冲动。

http://bbs.pediy.com/attachment.php?attachmentid=25563&stc=1&d=1241576404
  
  软件未注册,运行后,弹出输入框要求输入对应机器码的注册码。三次输入错误提示注册失败。程序菜单全部锁定变灰色。
  
  遂用OD狂分析,一头雾水。
  
  偶见Reflector,柳暗花明,不敢独享,与君共勉。
  
  用Reflector载入主程序,看得如下:
  
  http://bbs.pediy.com/attachment.php?attachmentid=25564&stc=1&d=1241576404

  逐级展开,到“工程1”--“Form1”--“Form1_Load(Object,EventArgs):Void”
  
http://bbs.pediy.com/attachment.php?attachmentid=25565&stc=1&d=1241576567
  
  双击“Form1_Load(Object,EventArgs):Void”
  
  看到:
  
http://bbs.pediy.com/attachment.php?attachmentid=25566&stc=1&d=1241576404
  
  截取算法部分如下:
  
   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 
上传的缩略图
3.JPG 
上传的图像
0.JPG   1.JPG  2.JPG  
posted @ 2014-08-30 23:54  一亩二分  阅读(677)  评论(0编辑  收藏  举报