首页
社区
课程
招聘
[旧帖] [原创]初学者破解VB.NET简单加密教学 0.00雪花
发表于: 2009-5-6 10:19 11734

[旧帖] [原创]初学者破解VB.NET简单加密教学 0.00雪花

2009-5-6 10:19
11734

【文章标题】: 初学者破解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


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
  • 0.JPG (21.75kb,654次下载)
  • 1.JPG (40.04kb,670次下载)
  • 2.JPG (52.51kb,674次下载)
  • 3.JPG (74.38kb,678次下载)
收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习~~破解又多种方法~
2009-5-6 14:39
0
雪    币: 504
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
这个程序应该是没有太多经验开发者开发的,看看他的命名
2009-5-6 15:07
0
雪    币: 8212
活跃值: (3356)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
收藏一份备用
2009-5-7 13:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不错的东东
收藏了
2009-5-7 14:28
0
游客
登录 | 注册 方可回帖
返回
//