且行且远
分类: 逆向手札, 随心所记 由 ssfighter 于 2006年5月23日 发表

自己的软件写的不怎么样,却天天琢磨着写一点程序就要注册挣钱,真是不让人鄙视都对不起作者本人。以前就看人说过要想挣钱就先把自己的软件写好,今天终于见识了一个挣钱不要脸的人了。我实在是不能理解作者怎么就能那么缺钱……

从天空软件站上下载了一个定时关机的小软件,软件创意还是不错的,不过功能挺一般的,却要收一大笔票子,看了程序就忍不住想骂作者……而且没注册的话限制还超级多,首先是只能连续运行一个小时,而且设置的时间不能保存,还有恶性的nag窗口,真不知道不注册的话这个程序还能干什么,ft2death。越看越想骂作者sb。

AsPack加的壳,不难脱,发现是FoxPro编的程序,用FoxTools可以完整地反编译。这个程序问题实在不少,其注册文件是放在相同目录下的。经常是启动了程序之后,根本就不去就退出了。最大的问题还是对注册码的判定上,因为我根本就不关心其他的功能。 FoxTools反编译后可以看到完整清晰的源程序(不得不说FoxTools确实太强大了),找到ZC.PRG,程序如下:

parameters xlh,zch
try
if ALLTRIM(UPPER(VARTYPE(xlh))) == “C” and ALLTRIM(UPPER(VARTYPE(zch))) == “C”
if LEN(ALLTRIM(xlh)) = 10 and LEN(ALLTRIM(zch)) = 10 and ALLTRIM(zch) == LEFT(ALLTRIM(STR((SQRT(SQRT(VAL(ALLTRIM(xlh))))/3.1)*67237770,30,0)),10)
else
sbtsbl = .t.
endif
else
sbtsbl = .t.
endif
catch
do tcxt.prg
endtry

xlh 就是序列号,大概是先取硬盘序列号,然后经过一系列简单的运算得到的。zch就是输入的注册号,从上面可以看到,正确的注册号应该是序列号开四次方再除以 3.1再乘以67237770后取整,如果位数大于10位就取前10位。不过因为序列号就是10位的,所以正确的注册号不会大于10位。注册算法大概就是这样,但是程序有问题,他执行时候得到的序列号好像是2002啥的来着,按照上面计算得到的算法输进去不对,后来用FoxPro直接打开程序一点点执行,发现启动时候经常是无法正确读取数据库文件,而且用FoxPro运行取得的注册号和单独执行时显示的完全不一样,不知道为什么,这样执行后得到的序列号用上面的算法可以得到正确的注册号并注册通过,但是重新启动程序之后又发现序列号又变了,注册又变得失败了,再次ft2death,也不知道是我系统的问题还是他程序的问题,不过我感觉他的程序问题多多,真是受不了这种类似于测试版的破程序拿出来卖钱的人是出于一种怎样的心理。为了弄这个破程序我还特意装了一份FoxPro8.0,结果仅仅知道了注册算法,但是不知道为什么就不能注册……

其实我破解软件本身就是出于爱好,世界上写程序的人千千万万,程序写的好坏也不尽相同,但是我真的忍不住想骂这个破程序的作者,自己的程序写的bug百出还要拿出来卖钱,而且本身功能就不多未注册限制还不少,这根本就是逼着人家必须注册……中国的程序员现在普遍都有一种浮躁的心理,这也可能就是我们这个浮躁的社会的体现吧。中国的好多软件都是自己的功能没怎么完善,但是加密、防盗版的技术做得特好,让人忍不住怀疑这个作者到底是在写软件,还是在练习防破解的技术。作为热爱中国软件业的人来说,真的不希望这种现象继续下去,挣钱是要在把自己的软件尽可能完善的基础上的,再也不愿意看到这样的程序了,也希望中国不要再有这样的程序员。



ww
2009年07月30日 22:53:14

你好,请问你能通过这个能知道注册算法吗?
LPARAMETER XLHL , ZCHL
XLHL = ALLTRIM(XLHL)
ZCHL = ALLTRIM(ZCHL)
LOCAL HH00 , H1 , H2 , H3 , H4 , H5
H1 = ”
H2 = ”
H3 = ”
H4 = ”
H5 = ”
HH00 = LEFT(XLHL,10)
H1 = ;
LEFT(ALLTRIM(STR(INT((((VAL(HH00) / 1.5548) + SQRT(VAL(HH00) / 1.9088)) / 1.8332) * 1000),20,0)),10)
IF LEN(XLHL) > 10
HH00 = SUBSTR(XLHL,11,10)
H2 = ;
LEFT(ALLTRIM(STR(INT((((VAL(HH00) / 1.2435) + SQRT(VAL(HH00) / 1.7686)) / 1.5578) * 1000),20,0)),10)
ENDIF
IF LEN(XLHL) > 20
HH00 = SUBSTR(XLHL,21,10)
H3 = ;
LEFT(ALLTRIM(STR(INT((((VAL(HH00) / 1.1353) + SQRT(VAL(HH00) / 1.3806)) / 1.5782) * 1000),20,0)),10)
ENDIF
IF LEN(XLHL) > 30
HH00 = SUBSTR(XLHL,31,10)
H4 = ;
LEFT(ALLTRIM(STR(INT((((VAL(HH00) / 1.3367) + SQRT(VAL(HH00) / 1.6731)) / 1.4021) * 1000),20,0)),10)
ENDIF
IF LEN(XLHL) > 40
HH00 = SUBSTR(XLHL,41,10)
H5 = ;
LEFT(ALLTRIM(STR(INT((((VAL(HH00) / 1.8232) + SQRT(VAL(HH00) / 1.2082)) / 1.2841) * 1000),20,0)),10)
ENDIF
HH00 = ALLTRIM(H1 + H2 + H3 + H4 + H5)
H1 = LEN(HH00)
H2 = 0
FOR H3 = 1 TO H1
H2 = H2 + INT(VAL(SUBSTR(HH00,H3,1)))
ENDFOR
H2 = ALLTRIM(STR(H2))
H1 = LEN(H2)
H4 = ”
FOR H3 = 1 TO H1
H4 = H4 + ALLTRIM(SUBSTR(HH00,INT(VAL(SUBSTR(H2,H3,1))),1)) + SUBSTR(H2,H3,1)
ENDFOR
H1 = ALLTRIM(LEFT(HH00,7))
H2 = ”
H3 = 1
DO WHILE .NOT. EMPTY(H1)
H3 = H3 + 7
H2 = H2 + ALLTRIM(STR(INT(VAL(H1)) + INT(VAL(H4))))
H1 = SUBSTR(HH00,H3,7)
ENDDO
HH00 = ALLTRIM(H2)
IF ZCHL == HH00
RELEASE HH00 , H1 , H2 , H3 , H4 , H5 , XLHL , ZCHL
ELSE
RELEASE HH00 , H1 , H2 , H3 , H4 , H5 , XLHL , ZCHL
GO 0 == ‘0’
ENDIF

发表评论

昵称:  (必须)
邮件:  (必须)
网址: 
评论: