(应一些园友建议,我把敏感字段去掉)
其实当初我的目的是很纯洁的,只是想找一个简单的网站生成模板,由于对.net更熟悉一点,就去搜索了.net框架的CMS,看它的介绍挺强大的,符合最初的目的,但是下下来之后发现最新版本是要钱的,低一级的版本免费,但是免费的生成出来的东西会有他们公司的版权,这就让我不能忍了,免费就免费啊,搞个纯净点的不行啊,GOOGLE是强大的,所以我尝试的去搜索看有没有破解的版本,发现搜出来的一律都是免费版的去掉版权的版本,擦,去个版权就叫破解了么,而且还是低一级的版本,略微坑爹。.NET的东西理论上没有什么不可以破解的,之前由于项目需要,偶尔也会去破解一些商业的.NET软件,学习学习嘛,破解也不是什么罪大恶极的事,只要你不破坏别人的利益就行,所以我就抱着学习的心态去看了一下P*****的源代码,罪过罪过。只是学习。
本人声明,下面的内容只是个人研究所用,不作为任何商业目的,如果有人看了本篇文章做出任何违法之事,本人不负任何责任责任。by Zengg
破解所需软件:Reflector,ILSpy,de4dot
Reflector和ILSpy其实是一个性质的,都是用来查看别人的源代码,由于有时我发现Reflector查看方法的时候会出现一些错误,所以就用ILSPY配合着用。
de4dot,脱壳和反混搅的利器,一般商业软件都会加壳或者用了混搅代码,让一些人就算看到代码也不明白写的是什么,有了这个神器,妈妈再也不用担心我看到乱码了。。。当然有时也不是万能的,90%都能还原吧。
P******版本:V3.0
这是V3.0的基本样貌
按照官网的说法,只要把域名和对应的注册码填到web.config里面就可以了。
Web.config
可以看到Url是域名,License就是填写注册码的地方,由于域名是唯一的,我们不难想象出Url肯定是作为生成注册码的主要参照物,说个题外话,破解嘛,看你是要暴力破解还是文艺破解,暴力破解就是把代码注入他的DLL,从而绕过他的验证达到注册的目的,文艺嘛,就是大家有话好好说,不改动他的DLL,但是需要根据他提供的一些信息去推测软件作者的加密思想,只要你明白了加密核心思想,就能从源码中找出蛛丝马迹,由于软件里的源码肯定只存在解密的步骤,加密的步骤就需要大家反推出来了,有木有一种当侦探的赶脚。。。。。当然,本人只是业余人士,大牛们看到心里鄙视就好,不用说出来。。会打击人的.by Zengg
言归正传,我们已经知道了URL是生成注册码的参照物,以后就按着这个线索去查找,其实上面还有一个重要的线索,”License”,由于注册码肯定是要从配置文件读取,读取之后就是验证的步骤,这验证的步骤就是我们需要去的地方,读取License的值,大家会想一下.NET的做法,是不是ConfigurationManager.AppSettings["License"],现在由于程序员的水平高低不齐,一般来说都会像上述那样去写,这样就暴露了获取验证码的地方,我们就可以定位到所有有”License”内容的代码段去,所以说,以后大家写核心解密代码的时候多留一个心眼,把敏感字段写入资源里面,至少给破解的人增加一点难度。
Bin目录下有很多的DLL,其中一个肯定就是藏有解密的地方
当然由于我已经破解过了,筛选DLL的过程就不描述了,P*******.web.dll,就是解密的地方,用de4dot先给DLL脱壳。
然后我们用ILSPY打开这个DLL
会看到。。尼玛还是这么坑爹,所有东西基本都是乱码,让人不能直视,具体为什么我也没研究过,由于我们也不需要去明白这些乱码写的是神马,按照上面的思路我们要查找所有含有License字段的代码段,这步骤可以用软件实现。
利用ILSPY,在SEARCH里填上License,就可以看到出来很多方法,当初很疑惑为什么有这么多地方用到验证注册码,验证的算法都是一样的,难道作者以为你各个角落都验证一遍就不能破解了么。。
仔细看了搜索出来的结果,他是一些重要的表操作时就会去验证一遍,挺谨慎的嘛,上面标蓝的地方就是登陆的时候主页验证,我们从这里开始。
点击进入该方法
从上面代码可以看出,其实注册码分为两个部分,以’g’字符隔开,前面一部分是由MD5加密,后面一部分暂时不清楚,前面我们推论注册码是由URL来的,我们有理由怀疑
的this.j3G1XJp4Xe, this.EsQ1WjnrPD肯定有一个是URL字段,至于另一个是什么得去寻找,一般来说我们初始化的时候会在类的构造函数初始化,相信在构造函数里面,我们会知道这两个字段的意思,忘记了这是web,我们应该从Page_load页面加载里面去寻找:
protected void Page_Load(object sender, EventArgs e) { string connectionString; int[] num; while (true) { IL_24F: this.Qi911iK25u = ":" + master_login.tDhwcmhvMr4nRqlEc9G(base.Request)["SERVER_PORT"]; while (true) { IL_232: if (this.Qi911iK25u == ":80") { this.Qi911iK25u = ""; } this.EsQ1WjnrPD = this.Jbr136aAXj(master_login.MpkoQbh7EvS0PEFh1B3(master_login.rEXTLBh8uXG8glkV91p(ConfigurationManager.AppSettings, "Url").ToString())); master_login.xncn9GhN2hVekNKKcgK(); if (!master_login.DMFvcGhZ55jZPl06Jhl()) { goto IL_FA; } goto IL_215; IL_1CA: bool flag; while (!(flag = (base.Request.Form["username"] == null))) { this.NTR1li2VG4(); this.Yqx1ac8tvS = new Conn(); connectionString = master_login.lPkTddhObfF6vvZs9Ta(this.Yqx1ac8tvS); num = new int[] { 41, 0, 6, 4, 26, 3, 12, 8, 13, 93, 28, 38, 44 }; while (true) { this.j3G1XJp4Xe = this.Yqx1ac8tvS.GetString(num); num = new int[] { 87, 4, 17, 17, 14, 17, 76, 34, 13, 21, 0, 11, 8, 3, 73, 37, 8, 2, 4, 13, 18, 4 }; this.DDU1A3AUYe = this.Yqx1ac8tvS.GetString(num); int expr_AA = 7; if (master_login.xncn9GhN2hVekNKKcgK()) { switch (expr_AA) { case 0: goto IL_232; case 2: case 4: goto IL_FA; case 3: case 8: goto IL_215; case 5: goto IL_176; case 6: continue; case 7: goto IL_276; case 9: goto IL_2AE; case 10: goto IL_1CA; case 11: goto IL_24F; case 12: goto IL_2F5; case 13: return; } break; } break; } goto IL_187; } return; IL_FA: this.KpC1B5ZX4p = this.Jbr136aAXj(master_login.tDhwcmhvMr4nRqlEc9G(master_login.rnmK14hAjv0aZay85lt(this))["SERVER_NAME"].ToLower()); if (!master_login.MAaokyhM2irc0iduDgg(this.KpC1B5ZX4p, "localhost")) { goto IL_1CA; } int num2 = this.KpC1B5ZX4p.IndexOf(this.EsQ1WjnrPD); string a; if (num2 >= 0) { a = this.KpC1B5ZX4p.Substring(num2, this.KpC1B5ZX4p.Length - num2); goto IL_176; } master_login.a6dZyFh3MrLLslJyyx5(this).Write("<script>location.href='http://" + this.EsQ1WjnrPD + this.Qi911iK25u + "/e/master/login.aspx';</script>"); goto IL_215; IL_187: if (!flag) { this.KpC1B5ZX4p = this.EsQ1WjnrPD; goto IL_1CA; } master_login.a6dZyFh3MrLLslJyyx5(this).Write("<script>location.href='http://" + this.EsQ1WjnrPD + this.Qi911iK25u + "/e/master/login.aspx';</script>"); base.Response.End(); goto IL_1CA; IL_215: master_login.a6dZyFh3MrLLslJyyx5(this).End(); goto IL_1CA; IL_176: flag = !(a == this.EsQ1WjnrPD); goto IL_187; } } IL_276: num = new int[] { 87, 4, 17, 17, 14, 17, 76, 34, 13, 21, 0, 11, 8, 3, 73, 28, 14, 15, 24, 17, 8, 6, 7, 19 }; this.wht18BDAPc = this.Yqx1ac8tvS.GetString(num); num = new int[] { 75, 41, 14, 22, 4, 17, 4, 3, 93, 1, 24, 93, 41, 0, 6, 4, 26, 3, 12, 8, 13, 93, 28, 38, 44 }; IL_2AE: this.eA41Kphpj9 = this.Yqx1ac8tvS.GetString(num); this.kwo1i4CnR3 = this.ne91erSgMV(); this.GqT1YHkWWq = new OleDbConnection(connectionString); master_login.qOyjNXhFe7tECUDuWP7(this.GqT1YHkWWq); this.gII1QQxT9S(); this.aK41NqyDHj(); this.Tov1vquSFP(); IL_2F5: this.GqT1YHkWWq.Close(); }