LeapFTP注册算法的详细介绍
很久没玩OD,正好机器上试用版的LeapFTP过期了,于是心血来潮准备写个注册机,LeapFTP版本v2.76
记得以前跟过LeapFTP,注册码分为两段,是明文存放在内存中,但是没有去细看算法,今天决定把算法搞定以后升级也方便^_^.
用OD,载入,下注册表断点(为什么下注册表断点?因为我跟过^_^),关键部分0x00484d89处停下,程序去读取"Software/LeapWare/Registry/"下有没有UserName和UserKey两个东西,往下看,这两个东西都必须有否则就直接跳走了.这个版本的Leap似乎有点改进,记得以前好像是无论成功失败都会去写注册表,现在是只有注册成功了里面才有东西,不管那么多,先手工添加方便分析-_-#.
走啊走啊走啊走,走到了一个地方
00484FB7|>807E3500cmpbyteptr[esi+35],0
00484FBB|.7533jnzshort00484FF0
00484FBD|.807E3600cmpbyteptr[esi+36],0
00484FC1|.7413jeshort00484FD6
00484FC3|.A194C14B00moveax,dwordptr[4BC194]
00484FC8|.8B00moveax,dwordptr[eax]
00484FCA|.8B5628movedx,dwordptr[esi+28]
00484FCD|.E822F8FFFFcall004847F4;这个CALL比较长度是否合格
00484FD2|.84C0testal,al
00484FD4751Ajnzshort00484FF0
00484FD6|>8B462Cmoveax,dwordptr[esi+2C]
00484FD9|.50pusheax
00484FDA|.A194C14B00moveax,dwordptr[4BC194]
00484FDF|.8B00moveax,dwordptr[eax]
00484FE1|.8B4E28movecx,dwordptr[esi+28]
00484FE4|.8B5624movedx,dwordptr[esi+24]
00484FE7|.E860F6FFFFcall0048464C;比较
00484FEC|.84C0testal,al;不能跳
00484FEE|.7404jeshort00484FF4
00484FF0|>B301movbl,1;标志位
00484FF2|.EB0Fjmpshort00485003
大致流程就全在这了,先看第一个CALL,484FCD,F7跟入,里面似乎没什么特别的,只是有个比较注册码长度是不是0x13的情况,不是直接就回来了,是的话要经过一定算法的变形,大概就是比较某些位上是不是指定的值,继续往下看
关键CALL 484FE7,F7跟进去看看
0048469C|.85D2testedx,edx
0048469E|.7E33jleshort004846D3
004846A0|.B801000000moveax,1
004846A5|>8B4DFC/movecx,dwordptr[ebp-4]
004846A8|.0FB64C01FF|movzxecx,byteptr[ecx+eax-1]
004846AD|.0FAFC8|imulecx,eax
004846B0|.8BD9|movebx,ecx
004846B2|.C1E104|shlecx,4
004846B5|.2BCB|subecx,ebx
004846B7|.894DE8|movdwordptr[ebp-18],ecx
004846BA|.DB45E8|filddwordptr[ebp-18]
004846BD|.DC45F0|faddqwordptr[ebp-10]
004846C0|.8D0C80|leaecx,dwordptr[eax+eax*4]
004846C3|.894DE4|movdwordptr[ebp-1C],ecx
004846C6|.DB45E4|filddwordptr[ebp-1C]
004846C9|.DEC1|faddpst(1),st
004846CB|.DD5DF0|fstpqwordptr[ebp-10]
004846CE|.9B|wait
004846CF|.40|inceax
004846D0|.4A|decedx
004846D1|.^75D2jnzshort004846A5
004846D3|>8B4508moveax,dwordptr[ebp+8]
004846D6|.E83945F8FFcall00408C14;还不知道
004846DB|.8945E8movdwordptr[ebp-18],eax
004846DE|.DB45E8filddwordptr[ebp-18]
004846E1|.DD45F0fldqwordptr[ebp-10]
004846E4|.DC4DF0fmulqwordptr[ebp-10]
004846E7|.DEC1faddpst(1),st
004846E9|.DD5DF0fstpqwordptr[ebp-10]
前面这一段是根据输入的用户名来算注册码的核心部分,先比较用户名的长度如果不为0的话,就循环取用户名的char值,乘上序号,乘上个0x10,再减去个char值乘序号,加上序号乘个5,这部分的循环最后就简化为:
(User[i] * (i+1)) * 9 + 5* (i+1)
最后循环得到的值来个平方,再加上一个常数214065,就算完了,接下来看程序用这个得到的数字做什么样的比较规则:
后面比较简单就不在贴代码,只是判断前面6位是不是常数214065,第7位是不是-,后面一堆是不是算到的数,最后用自己的KeyGenMaker写了个注册机,代码如下:
for(inti=0;i<para1.Length;i++)
{
result=result+para1[i]*(i+1)*15;
result=result+5*(i+1);
}
result=result*result+214065;
return"214065-"+result.ToString();
给出一组注册码 UserName: Red_angelX
UserKey: 214065-6827104690
本文地址:http://www.45fan.com/dnjc/69177.html