PhotoCaster v3.0.3软件产品号(ProductID)生成部分的分析 (7千字)
软件简介:见前面前言:我将我最早找到的注册码240521和98567G给那位网上的朋友后,他回复说不能注册成功,那么就说明问题肯定是ProductID不同所致,这就否定了网上的那篇PhotoCaster v2破解文章所述的与“一个常数”异或运算的说法,这样就激起了我分析ProductID产生的雄心,还好,这次又让我给分析着了。于是我想,既然在我的机器上能生成该“常数”——23675,那么肯定有一段程序是生成它的。开始我想bpm该内存地址,看看那个地方给该地址赋值,但失败了,因为它在内存中的地址是变化的(事后想想,这样做虽然有点投机取巧,想省点事,但方法确实有点傻)。于是我只好从Director调入该xtra入手,来分析其生成过程。如果该xtra的设计者在生成这个常数之前绕来绕去,进行大量转换(如密码学),我想我会基本绝望并放弃的——除非这个xtra的ProductID对我来说,跟饭碗和生命相关,必须要分析出来。
过程:启动Director8.5,Ctrl+D激活SoftICE,设断:bpx loadlibrarya,选择Insert PhotoCaster,这时会被SoftICE拦截,进入到PhotoCaster领空后,F10跟踪,每次F10带过一个call后,都搜索一下内存中是否生成了23675,幸好在生成23675之前的call不太多,最后来到下面:
:1001A0C1 mov ecx, esi
:1001A0C3 call sub_10012FA0 ;F10带过这步后,产生常数23675和ProductID,追进去看看
10012FA0的call:
:10012FDD push 1Eh
:10012FDF push edx
:10012FE0 push 0
:10012FE2 push eax
:10012FE3 call dword ptr [ecx+0Ch] ;取Director的安装序列号,我的是WDW850-02044-87235-26475
:10012FE6 test eax, eax ;是否成功
:10012FE8 mov [esp+4Ch+var_40], eax
:10012FEC jnz short loc_10012FFC ;没有得到序列号则转
:10012FEE lea edi, [esp+4Ch+var_30] ;Director序列号
:10012FF2 or ecx, 0FFFFFFFFh
:10012FF5 repne scasb
:10012FF7 not ecx
:10012FF9 dec ecx
:10012FFA jnz short loc_1001302A
:10012FFC mov edi, offset aDrw80012345123 ; "DRW800-12345-12345-12345"
:10012FFC-10013028的语句:Director序列号用"DRW800-12345-12345-12345"代替,语句略
:1001302A lea edi, [esp+4Ch+var_30] ;Director序列号
:1001302E or ecx, 0FFFFFFFFh
:10013031 xor eax, eax
:10013033 repne scasb
:10013035 not ecx
:10013037 dec ecx
:10013038 cmp ecx, 9
:1001303B jge short loc_10013049 ;序列号的长度大于等于9则转
:1001303D pop edi
:1001303E pop esi
:1001303F mov eax, 0FFFFFED0h ;失败标志
:10013044 pop ebp
:10013045 add esp, 30h
:10013048 retn
:10013049 lea esi, [esp+ecx+4Ch+var_31] ;esi指向序列号的最后一位
:1001304D mov ecx, 1 ;置初值
:10013052 lea edx, [esp+4Ch+var_34] ;存放要取的序列号
:10013056 mov al, [esi]
:10013058 cmp al, 30h
:1001305A jl short loc_10013064
:1001305C cmp al, 39h
:1001305E jg short loc_10013064 ;不是0-9的数字则取下一个字符
:10013060 mov [edx], al ;取得的数字放此
:10013062 inc ecx
:10013063 dec edx
:10013064 dec esi
:10013065 lea eax, [esp+4Ch+var_30]
:10013069 cmp esi, eax ;序列号全取完了吗?
:1001306B jb short loc_1001303D ;取完了则转
:1001306D cmp ecx, 9 ;取满了9个数字?
:10013070 jle short loc_10013056 ;没有则转
10013049-10013070表示:从Director序列号的尾部开始取9个数字,我的结果为723526475
:10013072 lea ecx, [esp+4Ch+var_40]
:10013076 lea edx, [esp+4Ch+var_3C] ;所取的9个数字
:1001307A push ecx
:1001307B push edx
:1001307C mov ecx, ebp
:1001307E call sub_10013210 ;根据这9个数字生成ProductID的部分字符
这个call的计算过程如下:
每次取3个数字,用a表示,则
(1) a*0.914285715/32;如:723*0.914285715=661,661\32=20
(2) a mod 23h,得到余数;如723 mod 23h=723 mod 35=23
根据这两个值从"0-9A-Z"中取相应的字符,则723经过计算取得的字符为:K和N
这样,共得到三组6个字符,我的是KNF1DK
:10013083 mov esi, eax
:10013085 lea eax, [esp+4Ch+var_40]
:10013089 push eax
:1001308A push esi
:1001308B mov ecx, ebp
:1001308D call sub_100130E0 ;生成产品号
过程:PhotoCaster文件的第1个字符+6个字符的前2个+" - "+后4个字符,知道文件格式的人都清楚,xtra的第一个字符是M,这样,我的PhotoCaster的ProducID为:MKN - F1DK,共10个字符
:10013092 push esi
:10013093 mov ecx, ebp
:10013095 mov [ebp+0Ch], eax
:10013098 call sub_10012F80
:1001309D mov eax, [esp+4Ch+var_40]
:100130A1 test eax, eax
:100130A3 jnz short loc_100130CE
:100130A5 lea ecx, [esp+4Ch+var_40]
:100130A9 lea edx, [esp+4Ch+var_3C]
:100130AD push ecx ;所取的9个数字
:100130AE push 0CBh ;换成二进制就是011001011b
:100130B3 push edx
:100130B4 mov ecx, ebp
:100130B6 call sub_10013190 ;生成比较注册码正确与否的5个数字
该固定计算值的生成过程:取CBh为1的对应的数字,则从9个数字中分别取第2、3、6、8、9位的数字,就得到了23675
:100130BB pop edi
:100130BC mov [ebp+10h], eax
:100130BF mov eax, [esp+48h+var_40]
:100130C3 pop esi
:100130C4 pop ebp
:100130C5 add esp, 30h
:100130C8 retn
这样,知道了ProductID和固定常数的生成过程,该软件的注册器就可以做了。
附记:PhotoCaster v2.0.5破解文章的作者说的“一个常数”其实也并没有错,虽然他尝试了很多机器,发现都是这个数,但我想,他做梦也不会想到PhotoCaster竟会用Director的序列号来生成自己的ProductID,但通过我这篇的分析文章就会明白,即使他尝试更多的机器,还会是相同的“一个常数”——安装时填入的Director的序列号都相同嘛。如果安装的Director是Z版的话,几乎是一机一号,那么PhotoCaster的ProductID也就可能出现不同了。那个作者在安装Director时手上要是多几个Director安装序列号的话,他的那篇文章就会能更深一步去分析ProductID的生成过程。还有,应该感谢网上的那个朋友(huihuicn),如果不是他回复说注册码不能用并说PhotoCaster v2在Director v8和v8.5的注册码是不同的话,如果他安装的Director不是v8而是v8.5并且安装序列号也和我的一样的话,我也可能会出现和PhotoCaster v2破解作者一样的观念。现在,他把这个机会让给我了。
还有,我想做一个根据ProductID计算常数的程序,一般来讲,软件虽然升级,但通常注册码计算的改动却不一定太大,但我用这个程序就是找不出来v2.0.5的9个数字,于是我想,难道v3.0.3和v2.0.5的注册码的计算变化很大吗?于是只好请求网上的那位朋友将他手上的v2.0.5版给我,我反编译一看,注册码的计算过程与v3.0.3完全一样!注册码的生成过程也跟v3.0.3基本一样,不同的有两点:(1)v3.0.3版如果得不到Director的序列号则由DRW800-12345-12345-12345代替,而v2.0.5版如果得不到则产生错误信息并退出;(2) 取“常数”的部位不同,v2.0.5如下:
:10009BB4 push 14Eh ;二进制就是101001110b,那么就是取9个数字的1、3、6、7、8位的数字
:10009BB9 push edx
:10009BBA mov ecx, ebp
:10009BBC call sub_10009C90 ;生成常数
于是我又把他的破解文章里的ProductID验算了一下,发现他写的MK9-RACA是错的,而应该是MK9-QACA,常数79043没错,他使用的Director的序列号应该是:WDW700-04074-07099-20430(这个序列号对于较早免费使用Director的人来说,应该是很熟悉的噢^_^),用我做的算号器搜索了一下v2的注册码(运算时间好长,将近1个小时,从注册码的运算过程来看,用逆算法反推出注册码基本是不可能的,谁若是会的话,教教我),共找到40组可用的注册码(还会找到更多!),但和v2破解文章不同的是,我搜索到的注册码中没有他的第3个注册码:653467,我想,他算的第3个应该是错的,不信,谁有条件试试,看我说的对不对。
