| 
 | 
 
软件介绍与破解工具 
BW 3000XP商业管理系统(超市版)是一款综合的商业管理软件,它具有单据管理、信息档案、报表中心、图表分析等功能。 
破解工具:PEID、W32dsm10、FoxTools2.2(VFP反编译程序)。  
  
 
软件破解过程 
运行要破解的程序,选择“注册”,在弹出的注册窗口中输入公司名:nyyuan,注册码:654321,然后单击“确定”,弹出“注册失败,请与软件供应商联系。”的错误提示 
记住这个错误的提示,这对我们以后反编译有用,关闭程序,拿出PEiD检查程序是否加壳,还好程序并没有加任何壳,显示是用VC6.0编译而成的。 
接下来拿出W32dsm10对程序进行反编译,然后选择“参考”——“串式数据参考”,找见前面出现的错误提示,这时也许让大家失望了,里面根本就没有那个错误提示,因为你现在才发现原来程序是用VFP编写的。 
到这里可能有些朋友不知道该怎么办了,别急,在这里我可以给大家介绍一款专门破解VFP程序的工具——FoxTools2.2,也许有的朋友是第一次用,没关系,接下来我就教给大家怎样使用FoxTools2.2破解这个VFP程序。 
运行FoxTools2.2,选择要破解的程序,然后一定要选中“反编译后创建生成项目文件的rebuild.prg”。原因是选中了它在反编译的同时也会将反编译的所有文件都保存下来,这样我们才可以对软件进行破解。 
反编译完我们就可以打开程序所在的目录,你会看到多了好多以.SCX和.SCT命名的文件,好了破解就从这些文件下手。我们看看这些文件里是否有有关生成注册码算法的,怎么样是不是看到了一个名为“REGISTER.SCT”的文件,用记事本打开它,发现正是我们要找的生成注册码算法的代码。以下代码是进行注册码算法的重要代码: 
regi_aa=allt(thisform.text1.value) ‘regi_aa为我们输入的公司名 
regi_cc=0 
for i=1 to len(regi_aa) 
regi_cc=regi_cc+asc(subst(regi_aa,i,1)) ‘通过输入的公司名来算出另外一个参数regi_cc 
endfor 
regi_dd=0 
for j=1 to len(allt(str(regi_cc))) 
regi_dd=regi_dd+int(val(subst(allt(str(regi_cc)),j,1)))’通过上面算出的regi_cc来算出regi_dd. 
endfor ‘thisform.text2.value为注册码  
if thisform.text2.value=allt(str(99999999-int(val(allt(str(regi_cc))+allt(str(regi_dd))))*3-613+85999938))’这一行便是通过regi_cc和regi_dd来算出最终的注册码。 
下面的代码是通过系统目录下的bwxxcs.DLL文件对我们输入的注册码进行比较,如果相等就显示注册成功,反之失败: 
if files(syspaths+'\SYSTEM\bwxxcs.DLL')=.T. ‘比较bwxxcs.DLL文件 
if not used('bwxxcs') 
use syspaths+'\SYSTEM\bwxxcs.DLL' in 0 shared 
endif 
select bwxxcs 
replace gsmc with allt(thisform.text1.value),tdj with date(),tzc with tdj+thisform.text3.value,yn with '@',lx with iif(thisform.text2.value=allt(str(99999999-int(val(allt(str(regi_cc))+allt(str(regi_dd))))*3-613+85999938)),'O','N') 
gsname=allt(thisform.text1.value) 
if thisform.text2.value=allt(str(99999999-int(val(allt(str(regi_cc))+allt(str(regi_dd))))*3-613+85999938)) 
custom_lx='O' 
endif 
 
tregi_aa=allt(bwxxcs.gsmc) 
tregi_bb='' 
tregi_cc='' 
for i=1 to len(tregi_aa) 
tregi_bb=tregi_bb+allt(str(asc(subst(tregi_aa,i,1))-58*2)) 
endfor 
 
this_sn='' 
this_sn2='' 
FOR I=1 TO len(tregi_bb) step 2 
this_sn=this_sn+SUBST(tregi_bb,I,1) 
ENDFOR  
 
FOR I=2 TO len(tregi_bb) step 2 
this_sn2=this_sn2+SUBST(tregi_bb,I,1) 
ENDFOR  
 
this_sn=this_sn+this_sn2 
that_sn='' 
FOR I=1 TO len(this_sn) 
that_sn=that_sn+iif(type(SUBST(this_sn,I,1))='N',ALLT(STR(INT(VAL(SUBST(this_sn,I,1))+1))),SUBST(this_sn,I,1)) 
ENDFOR  
that_sn2='' 
FOR I=1 TO len(that_sn) step 3 
that_sn2=that_sn2+SUBST(that_sn,I,1) 
ENDFOR  
 
that_sn3='' 
FOR I=2 TO len(that_sn) step 4 
that_sn3=that_sn3+SUBST(that_sn,I,1) 
ENDFOR  
 
that_sn=that_sn2+that_sn3 
tregi_cc=allt(subst(that_sn,1,20)) 
replace gsmc with gsname,sysname with tregi_cc in parts 
=messagebox('恭喜您,注册成功!,请将您的公司'+chr(13)+'名称及注册码记录下来,以便下次使用!',48,'提示') 
 
if used('bwxxcs') 
use in bwxxcs 
endif  
 
tshowreg1=.f. 
tshow_reg1=.f. 
tshowreg2=.f. 
tshow_reg2=.f. 
tendtime=.f. 
tdemover=.f. 
thisform.release 
endif 
else 
=messagebox('注册失败!,请与软件供应商联系!',16,'提示') 
thisform.text2.setfocus 
endif  
 
总结算法 
现在我们来看一下注册码到底是怎样产生的: 
1. 将所输入的公司名的每一个字符转换成相对应的ASCII码,然后进行相加,得出的结果为regi_cc的值。例如:我输入的公司名为:nyyuan,那么转换后的ASCII码依次为110;121;121;117;97;110,相加得到regi_cc = 676。 
2. 将regi_cc的各位相加,所得的值为regi_dd = 19。 
3. 将regi_cc与regi_cc合并为一个数67619。 
4. 然后带进公式: 
thisform.text2.value=allt(str(99999999-int(val(allt(str(regi_cc))+allt(str(regi_dd))))*3-613+85999938)) 
算出最后的注册码为:185796467。 
现在我们用公司名:nyyuan,注册码:185796467,再一次进行注册是不是已经注册成功了。其实通过上的代码我们可以知道,软件将我们输入的注册信息放在系统目录下的一个名为bwxxcs.DLL的文件里,如果我们将这个文件删除了,那么程序又变成未注册的版本了。 
 
通过上面的文章,和大家讨论了一下使用FoxTools2.2来对VFP程序进行反编译的方法,然后通过得到的反编译文件找到注册码的算法,最终破解成功。其实有关VFP程序的破解思路还有很多,在这里就不一一介绍了,希望此文能抛砖引玉! 
相关软件下载地址: 
BW 3000XP商业管理系统(超市版): 
http://hlbr.onlinedown.net/files3/chaoshi.exe 
FoxTools2.2 http://www.pediy.com/tools/Decompilers.htm |   
 
 
 
 |