2004年8月12日

自已编写Resharper v1.0注册机的流水帐(3) -- 大功告成:)

本人写这个,仅供学习和研究之用,也算是自己的一个心得,注册后的插件,自己在家玩玩可以,但最好别拿去开发产品,更不要用于商业用途,JBuilder的教训是深刻的,作为公司觉得好还是去买正版吧,这点钱对公司来说还不算贵。如出现版权问题,本人概不负责。

自已编写Resharper v1.0注册机的流水帐(1) -- 上阵、分析、碰壁
自已编写Resharper v1.0注册机的流水帐(2) -- 分析算法、痛苦


四、大功告成

神来了,那就是发动群众的力量,半夜三更爬上MSN,发动群众帮我找高效的RSA分析工具或算法, IceSharK兄弟一连给俺找了三四个RSA工具,其中有个叫RSATool的东东,看样子还蛮专业的,不管它,用上先。

运气真好,神立马就出现了:)本来我还以为要算上几天的,结果在和IceSharK聊天的几分钟内就完成了,不敢相信啊。

结果如下,P Q全出来了:)

       p: 76934561593903517890538965067

q: 44708964245672789920122782207

e: 3439664563558343388897268028516178220150974083190422162869

       由于BigInteger算出来的素数并不一定是完全正确的,所以我还不敢肯定的说已经成功了。但是总要试试吧。将PQ的值分别代入公式

       Z = (p – 1) * (q – 1)

       Z = 3439664563558343388897268028394534694311397775379760415596

       OK,知道了ZD也就搞定了。

       现在PQZ EDMICI都统统知道了,加密还有啥难的呢:)代公式就行了。

       完成这个注册机:),VS.net 2003写的。
   
   

用算出的号码一试,哈哈。

   

OK,大功告成:)

 

以下是注册机的核心算法,主要就这些,其它的都是winform操作:)

这样看,代码就很简单了:
   

// 生成License
        
// 飞刀再次提醒,本代码仅学习和研究之用,千万别用于商业,否则版权纠纷很麻烦的。
        private string getLicense()
        
{
            
int iUserHash = UserHash();

            
// 基础的Seed,即找到Endless License的明文
            BigInteger bigBaseSeed = new BigInteger((long65535);
            bigBaseSeed 
<<= 56// 校验代码中向右移56位,我就向左移56位
            bigBaseSeed += new BigInteger((long) iUserHash); // 为了使IsChecksum返回true

            
// Public Key 即充当N
            BigInteger bigPublickKey = new BigInteger(Constants.PUBLIC_KEY, 10);

            
// Private Key 即充当Z
            BigInteger bigPrivateKey = new BigInteger(Constants.PRIVATE_KEY, 10);

            
// 用户名计算 即充当E
            BigInteger bigUserName = new BigInteger(Encoding.Default.GetBytes(_username));
            bigUserName 
|= 1;

            
// 搞定最重要的密钥D
            BigInteger bigD = bigUserName.modInverse(bigPrivateKey);

            
// 套加密公式 ci = n^d mod n
            BigInteger bigLicense = bigBaseSeed.modPow(bigD, bigPublickKey);


            
return (Convert.ToBase64String(bigLicense.getBytes()));
        }


        
// UserHash ,直接从反编译的源代码中抄过来的
        
// 作用是判断用户名与License是否匹配
        private int UserHash()
        
{
            
int i = 0;
            
for (int j = 0; j < _username.Length; j++)
            
{
                i 
= ((i << 7+ _username[j])%65521;
            }


            
for (int k = 0; k < _company.Length; k++)
            
{
                i 
= ((i << 7+ _company[k])%65521;
            }

            
return (i);
        }


为防止被找麻烦,注册机现在不再提供下载了。


如果需要的兄弟,请你们自已在这文章的评论里面找“灵感之源”兄弟的贴,里面有下载的链接。

老是发邮件,我已经没有精力了。

注册机真的真的不要用于商业,自己玩玩就可以了。
   


 


   

posted @ 2004-08-12 10:07 飞刀 阅读(10672) 评论(87) 编辑

自已编写Resharper v1.0注册机的流水帐(2) -- 分析算法、痛苦

posted @ 2004-08-12 09:55 飞刀 阅读(5555) 评论(10) 编辑

自已编写Resharper v1.0注册机的流水帐(1) -- 上阵、分析、碰壁

本人写这个,仅供学习和研究之用,也算是自己的一个心得,注册后的插件,自己在家玩玩可以,但最好别拿去开发产品,更不要用于商业用途,JBuilder的教训是深刻的,作为公司觉得好还是去买正版吧,这点钱对公司来说还不算贵。如出现版权问题,本人概不负责。

      

上次给大家推荐了Resharper这个Vs.net插件(不知道他是啥的,可以看上次写的推荐一个NB的Vs.net 2003插件 ),虽然后面有兄弟向我推荐coderush,但是我装上了试试,感觉并不是很好,除了PP一点外,没有给我很兴奋的功能,也许也是因为飞刀我用eclipse写了太多的Java吧,还是喜欢与IntelleJ类似的编程工具。

Resharper牛是牛啊,可就是眼看着30天的试用期一天天临近,又舍不499$(看清楚了是美刀)的注册费,我急啊。在网上搜索了N天,也没有找到过Resharper的破解或注册机,无奈,只有自己动手搞定它了。。

这次是第一次上阵搞破解注册,所以水平有限,有搞破解的专家看到了,别笑话俺。。

以下是俺编写Resharper注册机的流水帐,以享观众:

 

一、装备

       .Net反编译器是不能少的,除非你很牛,能轻易看懂IL Code,反编译器就很多,免费的有reflector,要钱的有Remotesoft.Net Decompiler什么的。有一个就OKReflector足够了。

      

二、开始分析

       使用你手上的反编器器,把Resharper安装目录下的dllexe全部打开,一个个的查看。上天保佑,Resharper竟然是没有被混淆的,而且命名很规范,不愧是出品IntelleJ的公司啊。命名规范,看结构就很容易,很快我就锁定了JetBrainShared.dll中的JetBrains.License命名空间(问我为什么锁定?那么大一个License总认识吧,呵呵)。

       发现在这个命名空间下有四个类:BigIntegerEnterLicenseFormLicenseCheckerPasteTextBox。看名字就知道PasteTextBox没用,将其它三个类,统统反编译:

1.       BigInteger:大整型,超大整型类,先不管它。

2.       EnterLicenseForm 看名字就知道是输入License的窗口,一定要看,破解的入口啊。

3.       LicenseChecker 不用说了,名字已经很清楚了,八成算法就在里头。

接下来看代码,唉,反编译器还是不能完全反编译,有些地方还是不能搞定,不过不要紧,能看懂就行。

首先查看EnterLicenseForm的源代码,发现里面有一个CheckLicense的方法,估计这就是重点了,JetBrains公司真是太大方了,代码放得这么明显:)
   

        private bool CheckLicense()
        
{
            LicenseChecker checker1;
            DateTime time1;
            
this._okButton.Enabled = false;
            
if ((this._userName.Text.Length == 0|| (this._edtLicenseKey.Text.Length == 0))
            
{
                
this._detailsLabel.Text = 
                        
"Please enter or paste user name and corresponding license key";
                
return false;
            }

            
string text1 = this.LicenseString;
            
if (text1.Length == 32)
            
{
                checker1 
= new LicenseChecker(this._publicKey, this._userName.Text, "", text1);
                
// 判断username与license是否匹配 
                if (checker1.IsChecksumOK)
                
{
                    time1 
= DateTime.Now;
                    
// 判断是否已经过期了
                    if (DateTime.op_GreaterThan(checker1.ExpirationDate, time1.Date) 
                        
&& DateTime.op_GreaterThan(checker1.ExpirationDate, checker1.GenerationDate))
                    
{
                        
this._detailsLabel.Text 
                            
= ((checker1.ExpirationDate == DateTime.MaxValue) ?
                                
"Your license is ENDLESS!"
                                 : 
                                
"Expiration date: " 
                                    
+ (time1 = checker1.ExpirationDate).ToLongDateString());
                        
this._okButton.Enabled = true;
                        
return true;
                    }

                    time1 
= checker1.ExpirationDate;
                    
this._detailsLabel.Text = "Your license has expired on " 
                                                
+ time1.ToLongDateString();
                    
return false;
                }

            }

            
this._detailsLabel.Text = "The license key is invalid";
            
return false;
        }



    代码反编译的效果并不是很好,但是还是能够看出来逻辑,大致是先生成一个CheckLicense实例,传入PublicKeyUserName,以及CompanyName,然后使用IsChecksunOK来判断LicenseUserName是否配制,然后再比较License中包含过期时间是否大于当前时间。这里看出来过期时间是跟着License走的,而不是像以前一样的是根据安装时间。

       再来看CheckLicense类的结构,主要有五个属性:

IsChecksumOKTypeVersionGenerateDateExpirationDate

这些属性看名字就知道是什么了,就不解释了。

EnterLicenseForm中只比较了IsChecksumOKExpirationDate两个属性,他们两个属性应当是最重要的。

 

三、失败的破解过程

       人天生都是很懒的,我也一样,一看只是简单的比较了两个属性,就开始想捷径了,想想也是,破解是最省事的,把IsChecksum直接返回true,把ExpirationDate改成DateTime.MaxValue不就一切搞定了??

       马上搞出ildasm,把dll反编译成为il,直接改il 代码,并重新编译,然后把dll向安装目录和Vs.netprivateAssembly目录各copy一份,马上重新打开Vs.net 2003。。

       完了,Resharper插件,根本就不起作用了。。。连菜单都出不来了:(,太失败了。

       是哪里没有搞定呢?我没写过Vs.net插件,并不了解插件的加载过程:(到底是哪里出问题了,我就改了几个il code而已啊。失败,太打击人了。。。

       看来还是直接改字节,做Patch吧。。。

       不过当我用UltraEdit打开dll,看着满屏的16进制码(不要笑话飞刀俺,俺已经N年没碰过了,不像专业搞C的兄弟),算了,找个特征码都要搞死我,放弃。

       这时谷牛人提示我,像我这种对破解不熟的人,还是直接做注册机好,这样也最保险。

       好吧,做注册机吧。

自已编写Resharper v1.0注册机的流水帐(2) -- 分析算法、痛苦
自已编写Resharper v1.0注册机的流水帐(3) -- 大功告成:)

posted @ 2004-08-12 09:44 飞刀 阅读(9232) 评论(12) 编辑