文学书籍

JProfiler 4.2 注册分析

您现在的位置:文学书籍 > 儿童诗歌时间2019-08-13 11:19 来源:本站

	JProfiler 4.2 注册分析

注册分析作者:舵手申明:如转载请保证文章的完整性以及出处摘要:JProfiler是一款Java剖析器。 JProfiler直观的用户界面能够帮助你找到性能瓶颈,并指明你的内存漏洞和解决线程问题。 JProfiler是通过EXE来执行,用十六进制编辑器很容易找到程序的入口类:如果你要通过命令行运行,得看看这个类的main方法,它需要两个参数才能运行。

简单分析了一下该类,发现方法H完成了注册码的验证,让我们顺藤摸瓜找到计算注册码的位置。 publicbooleanH(){Ee1=().A2();//由于代码经过了混淆,以E命名的类有n多,所以千万要找正确,否则会浪费你的保宝贵时间//——E的完整类路径inti1=(null,this);switch(i1){case-2:if(l()){("Yourlicensekeyhasexpired.");returnfalse;}intj1=A(p,",pleaserequestanewkeyat"+L(),newString[]{"Enternewkey","Sendmail"},0);if(j1==1){O();returnfalse;}if(!A(((String)(null)),true))returnfalse;break;case-1:break;case-3:if(!A("",true))returnfalse;break;case-5:if(!A("",true))returnfalse;break;case-4:if(!A("",true))returnfalse;break;case-6:A((),false);returnfalse;default:if(i10)thrownewRuntimeException("Unknownlicensestatus"+i1);(i1);break;}();returntrue;}如果让(null,this)返回-1,那问题就解决了。 如果想暴破可以从这个方法入手,我们这里的任务是追出注册算法:)首先我们跟进().A2();这两个方法,发现只是对类做一些初始化,我们略过。

跟进(null,this),它又调用了重载方法ApublicintA(Strings,C._A_pa){returnA(s,_pa,true);}publicintA(Strings,C._A_pa,booleanflag){if(s==null)s=F4;//在该类初始化时已经给F4给了值,如果注册文件存在,该值为注册码if(flag!("FLOAT:")!("S-"))(s,_pa);//跟进这里,发现是网络验证,由于我访问不了所以没有详细分析,//有时间了再补上。

如果你那里通不过网络验证,把$_B(C的内部类)里的IP改一下应该就没问题//可别问我怎么改,十六进制编辑器就可以了:)returnS(s);//我们再看这个方法}publicintS(Strings){if(s==null)s=F4;//在该类初始化时已经给F4给了值,如果注册文件存在,该值为注册码if(("FLOAT:"))//不知道这代表什么,直觉上不是好东西,先不进入,直接到else{Strings1=("FLOAT:".length());inti=-1;intj=(:);if(j-1){try{i=((j+1));}catch(NumberFormatExceptionnumberformatexception){}s1=(0,j);}intk=C3();intl=(s1,i,k,C7());FD=();D(l0||l==-1);returnl;}else{returnQ(s);}}Q(s)直接调用下面方法publicstaticintG(Strings){//s为注册码if(s==null)return-3;s=();if(()3||(1)!=-||(#)==-1)//长度大于3,第二位字符必须为-,必段有#return-3;switch((0))//取注册码中的第一个字符{case69://E试用版inti=A(s);//查检当前日期是否过了试用期if(!F(s))return-3;elsereturni;case65://Acase76://L//这三个有什么区别还没有搞清case83://SreturnH(s);//让这里返回-1}return-3;}privatestaticintH(Strings){if(B(s)!=2)//license串中的"-"必须等于两个,B函数的作用是计算串中的"-"字符的个数return-3;returnF(s)-1:-3;//这里F必须反回true}privatestaticbooleanF(Strings){Aa=newA(s);//传入注册码,进行截取处理if(!())returnfalse;Strings1=();//返回注册码中第二个“-”后的所有字符Strings2=E(s1);//把上面得到的字符串以“#”为界分开,“#”前的给s2Strings3=D(s1);//“#”后的给s3if(s3==null||s2==null)returnfalse;elsereturnA(s3,s2,11,7,29);//重点所在}protectedstaticbooleanA(Strings,Strings1,inti,intj,intk){charac[]=();“#”前的串转换为charintl=0;charac1[]=ac;inti1=;for(intj1=0;j1i1;j1++){charc=ac1[j1];l+=c;//累加}Strings2=(l%i)+(l%j)+(l%k);//分别模11、7、29,结果相加,结果要和“#”后的那部分相等(s2);}到这里我们已经知道注册的算法了,其实很简单:注册码必须以A、S、L其中一个字母开头,第二个字符必须为“-”,“-”字符必须为两个,至少一个“#”字符,从目前的分析可以看出注册码长度已以大于等于四了,程序代码中3时完蛋。 接下来载取注册码中从第二个“-”字符位置加1开始到“#”前一个字符的子串,转换为char后累加,再分别模11、7、29,把三次模运算的结果相加,这个值等于注册码中“#”后面的所有字符。

下面给写出它的注册机*;/***pTitle:注册机/p*pDescription:每执行一次得到一个注册码/p*pCopyright:Copyright()2006/p*author舵手**/publicclassjprofiler4_keygen{publicstaticvoidmain(String[]args){Strings1="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";Strings2="ALS";Stringlicense="";Stringkey="";Randomrd=newRandom();intj=(3);license+=(j,j+1)+"--";for(inti=0;i12;i++){j=(62);license+=(j,j+1);key+=(j,j+1);}license+="#";charac[]=();intl=0;charac1[]=ac;inti1=;for(intj1=0;j1i1;j1++){charc=ac1[j1];l+=c;}Strings3=(l%11)+(l%7)+(l%29);license+=s3;(license);}}通过上面的分析,我们可以用正则表达式表示出注册码[A|L|S]-.-[a-zA-Z0-9]#[0-9],第二个“-”后的字符到“#”字符前的字符串的长度并没有限制,当然,不能为0,我只测试了长度为1和12,计算的注册码都没有问题,有兴趣的可以多试几个:)“.”这个位置可以插入任意长度的任意字符。

从注册算法上说,这个程序的保护很简单,但如果加上混淆和错综复杂的方法调用,会让你头痛好一阵子。

这里我只列出了和计算注册码有关的一些方法,而在实际跟踪中,牵扯到的类和方法数量是很大的,这就需要耐心。 我一直以来都认为这样的文章对那些想要从这里学到东西的人没有什么用处,因为这种文章充其量只能算是授人以鱼而不是授人以渔。

对那些正在分析这个软件的注册算法的人来说,也许有那么一点点用处:)分析这个软件的注册只是个人爱好,由于水平有限,错误疏漏在所难免,欢迎大家提出宝贵意见!。

回到顶部