1  /  1  页   1 跳转 查看:1150

破解SQL Prompt3

破解SQL Prompt3

前几天在博客园上发布了第一个破解作品,然后有人要求我再破解一下SQL Prompt3,他其实不知道我在这方面菜得很…呵呵…没办法,既然人家开口了,我也只能硬着头皮看一看咯…首先安装好RedGate全系列工具,进入SQL Prompt3文件夹里面找到RedGate.Licensing.Client.dll,用Reflector打开一看,囧…果然没那么简单,被混淆了一下…这么多类,肯定不能一个个看,所以我赶紧打开软件的注册窗口,看看有没有什么切入点。
 
 
  这是激活窗口,既然invoice特别强调了一下,我就从它开始,嘿嘿。输入Reflector一找,果然找到了一个叫P的类,这个类明显就是上面那个窗口,接着在这里很容易就找到了Activate按钮的方法,代码如下
        private void b(object obj1, EventArgs)      {          string str = ((TextBox) obj1).Text.ToUpper().Trim();          bool fEnable = o.b(str);          this.a.Visible = fEnable;          this.a((V.a) 2, fEnable, true);          if (fEnable)          {              this.a.a.SerialNumber = str;          }      }
这里非常明显o.b(str)这个方法就是验证序列号正确性的,赶紧跟进去找到这么一段代码
  internal static bool c(string text1)  {      text1 = text1.ToUpper().Trim();      Regex regex = new Regex(@"^[A-Z]{2}-[0-9A-Z]{1}-[0-9A-Z]{1}-\d{5}-[0-9A-F]{4}$");      Regex regex2 = new Regex(@"^\d{3}-\d{3}-\d{6}-[0-9A-F]{4}$");      if (regex.IsMatch(text1))      {          string str = text1.Substring(0, 12);          string str2 = string.Format("{0:X4}", W.a(str));          if (!text1.EndsWith(str2))          {              return false;          }      }      else if (regex2.IsMatch(text1))      {          string str3 = text1.Substring(0, 14);          string str4 = string.Format("{0:X4}", W.a(str3));          if (!text1.EndsWith(str4))          {              return false;          }      }      else      {          return false;      }      return true;  }
真是得来全不费功夫,竟然用正则来验证,这岂不是比ReSharper 4.0更容易破解?我心里暗爽了一把…
赶紧按照正则规则算出了一个合适的激活码,迫不及待地输进去…结果出现…Red Gate…我恨你…
 
原来一切都是幻觉…没办法…只好另找突破点…从提示来看,似乎每个真正序列号都在服务器有注册…这岂不是跟Windows的激活差不多了?难道要我一个个试?这明显不可能呀…

原文出处:http://blog.tonxoo.com/
金鳞岂是池中物,一遇风云便化龙
 

回复: 破解SQL Prompt3

正当我郁闷的时候,忽然想起如果连不上网呢?不可能不能激活吧。赶紧断网再试,果然出了网上激活还提供了一个本地激活的方法,看起来像是要通过序列号去官网申请一个License文件,我当然不可能去申请一个,不过既然可以用文件激活就代表破解还是有希望的…

把提示中的<activationrequest>放到Reflector里面继续找,顺着引用可以找到
internal static string a(string text1, string text2, Product product1){  //此处省略...    string str = a(text1, Guid.NewGuid().ToString(), text2, product1);    if (!o.a(IntPtr.Zero, activation, str, out str3, out str2))  //此处省略...} 从o.a开始一直往里找可以找到public bool ActivateLicence(string activationRequest, out string activationResponse, out string errorMessage){    object[] objArray = base.Invoke("ActivateLicence", new object[] { activationRequest });    activationResponse = (string) objArray[1];    errorMessage = (string) objArray[2];    return (bool) objArray[0];}


由于之前用minisniffer抓了几个包,所以这里很容易知道activationResponse里面的XML片断就是关键了。接着继续在dll文件里面翻,在
private static bool a(XmlNode node1, ref a aRef1)
这个函数里面发现了整个激活过程最重要的部分,分析之后可以得到如下信息:
  • 1.activationResponse的结构
  • 2.加密方法(1024位的RSA加密,这是不可能像ReSharper那样破解了)
  • 3.可以用一个License激活一系列Red Gate的软件,也就是以一个软件包的形式激活
  • 既然RSA无法破解当然只能绕过去了,不过还好,只需要改一个License.dll文件,然后一次性激活所有软件就行了。if (!provider.VerifyData(bytes, new SHA1Managed(), buffer)){    aRef1.c = ClientResources.ba();    return false;}
这个函数就是验证RSA签名的,用IL Disassembler把dll文件解开然后把VerifyData前面的!去掉,再伪造一个activationResponse的片断,呵呵,大功告成咯…


后记,搞完才发现,原来有些License.dll并没有混淆,我靠…
金鳞岂是池中物,一遇风云便化龙
 
1  /  1  页   1 跳转

版权所有 老猫的理想   Sitemap

Powered by Discuz!NT 2.1.202    Copyright © 2001-2008 Comsenz Inc.
Processed in 0.015625 second(s) , 3 queries. 冀ICP备05001409号
返顶部