破解GIF Movie Gear 3.01:
为了找一个汉化的对像,我找到了它,根据介绍,这个软件功能强大,我不会玩GIF动画,但在汉化过程中它给我的感觉倒是很好的,小巧的身材,强大的功能...我喜欢这样的软件.在汉化中我顺便想把它注册了,于是今晚就请出了SICE把它给破了,呵呵...(也久没有CRACK了,为了搞安装程序的制作...哪天我要写一个关于搞安装程序的制作的教程,我在网上找了好久都发现有...)
好了,言归正传.打开注册窗口填入:
NAME:Vitamin C
CODE:1234abcd1234abcd
(不知从哪天起喜欢用长的NUM.了...)
在SICE里用:BPX HMEMCPY.其实这个断点是最好用的,以前我不太懂CRACK时很怕用它,现在次次都用.(因为用GETWINDOWTEXTA等有时会拦不到...)...
按'OK'中断按F12后你会发现原来它是用GetWindowTextA的,按多几次F12(我记不清是几次了,好像不是很多次^_^)后到达我们的目的地:
...
* Reference To: USER32.GetWindowTextA, Ord:015Eh
|
:00431959 8B1DF8834400 mov ebx, dword
ptr [004483F8]/*它是把要CALL的偏移放入EBX
:0043195F 50
push eax
再调用的*/
:00431960 FFD3
call ebx /*这个CALL取NAME*/
:00431962 8D9424C4000000 lea edx, dword ptr
[esp+000000C4]<-我们要在这里停
* Possible Reference to Dialog: DialogID_0064
|
:00431969 6A64
push 00000064
:0043196B 52
push edx
* Possible Reference to Dialog: DialogID_0091, CONTROL_ID:0450, ""
|
:0043196C 6850040000 push 00000450
:00431971 56
push esi
:00431972 FFD7
call edi
:00431974 50
push eax
:00431975 FFD3
call ebx /*这个CALL取CODE,和上面的CALL调用同一个偏移*/
:00431977 8D8424C4000000 lea eax, dword ptr
[esp+000000C4]
:0043197E 8D4C2460 lea
ecx, dword ptr [esp+60]
:00431982 50
push eax /*这里是的两个寄存器里有一个是你输入的CODE有一个
:00431983 51
push ecx 是mvg21951736,呵呵不用我说了吧,可是它可不是*/
:00431984 E8F7FBFFFF call 00431580/*这个是关键的CALL,这里是一个经典的组合,CALL
:00431989 83C408
add esp, 00000008了之后来一个TEST EAX,EAX,呵呵...^_^*/
:0043198C 85C0
test eax, eax
:0043198E 0F84AD000000 je 00431A41
:00431994 8D542410 lea
edx, dword ptr [esp+10]
...
试一试用F10跳过关键CALL,EAX就为00H,(那个CODE是乱来的吗!)然后就完了...
那么就是要跟进那个CALL:
...
* Referenced by a CALL at Addresses:
|:004316C9 , :00431984
|
:00431580 53
push ebx
:00431581 55
push ebp/*EBP是你输入的CODE的地址*/
:00431582 8B6C2410 mov
ebp, dword ptr [esp+10]
:00431586 56
push esi
:00431587 57
push edi
:00431588 807D006D cmp
byte ptr [ebp+00], 6D/*CODE和第一个字符是:m*/
:0043158C 0F85A0000000 jne 00431632/*跳了就OVER,下面几个一样的,知道是怎么回事了吧?*/
:00431592 807D0167 cmp
byte ptr [ebp+01], 67/*第二个:g*/
:00431596 0F8596000000 jne 00431632
:0043159C 807D0233 cmp
byte ptr [ebp+02], 33/*第三个:3*/
:004315A0 0F858C000000 jne 00431632
:004315A6 807D0337 cmp
byte ptr [ebp+03], 37/*第四个:7*/
:004315AA 0F8582000000 jne 00431632
* Possible Indirect StringData Ref from Data Obj ->"mvg21951736"<-这个字符串不知有什么用?
|
:004315B0 BBC4D44400 mov ebx,
0044D4C4
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004315D6(C)
|
:004315B5 8B13
mov edx, dword ptr [ebx]
:004315B7 83C9FF
or ecx, FFFFFFFF
:004315BA 8BFA
mov edi, edx
:004315BC 33C0
xor eax, eax
:004315BE F2
repnz
:004315BF AE
scasb
:004315C0 F7D1
not ecx
:004315C2 49
dec ecx
:004315C3 8BFA
mov edi, edx
:004315C5 8BF5
mov esi, ebp
:004315C7 33C0
xor eax, eax
:004315C9 F3
repz
:004315CA A6
cmpsb
:004315CB 7465
je 00431632
:004315CD 83C304
add ebx, 00000004
:004315D0 81FBC8D44400 cmp ebx, 0044D4C8
:004315D6 7CDD
jl 004315B5
:004315D8 807D0473 cmp
byte ptr [ebp+04], 73/*第五个字符:s(不是必须的,另有用处)*/
:004315DC 7501
jne 004315DF
:004315DE 45
inc ebp
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004315DC(C)
|
:004315DF 83C507
add ebp, 00000007 /*取CODE第7位后的字符!CODE要>7位啊!*/
:004315E2 55
push ebp
:004315E3 E8D0DD0000 call 0043F3B8/*这个CALL其实作用是这样的:把CODE第8位起的字符
:004315E8 8B542418 mov
edx, dword ptr [esp+18] '1234'->1234D*/
:004315EC 83C404
add esp, 00000004
:004315EF 8BFA
mov edi, edx
:004315F1 33C9
xor ecx, ecx
:004315F3 8A12
mov dl, byte ptr [edx]/*这里开始是用NAME计算CODE了*/
:004315F5 BEDF0B0000 mov esi,
00000BDF
:004315FA 84D2
test dl, dl
:004315FC 7426
je 00431624
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431622(C)
|
:004315FE 0FBED2
movsx edx, dl
:00431601 41
inc ecx
:00431602 0FAFD1
imul edx, ecx
:00431605 03F2
add esi, edx
:00431607 81FEBE170000 cmp esi, 000017BE
:0043160D 7E06
jle 00431615
:0043160F 81EEBE170000 sub esi, 000017BE
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043160D(C)
|
:00431615 83F90A
cmp ecx, 0000000A/*到了名字的第10个字符则要跳出去了!*/
:00431618 7E02
jle 0043161C
:0043161A 33C9
xor ecx, ecx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431618(C)
|
:0043161C 8A5701
mov dl, byte ptr [edi+01]
:0043161F 47
inc edi
:00431620 84D2
test dl, dl
:00431622 75DA
jne 004315FE
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004315FC(C)
|
:00431624 3BF0
cmp esi, eax/*将用NAME计算得到的CODE和CODE第8位起的字符->数字进
:00431626 750A
jne 00431632 行比较!*/
:00431628 5F
pop edi
:00431629 5E
pop esi
:0043162A 5D
pop ebp
:0043162B B801000000 mov eax,
00000001/*EAX置01H*/
:00431630 5B
pop ebx
:00431631 C3
ret
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0043158C(C), :00431596(C), :004315A0(C), :004315AA(C), :004315CB(C)
|:00431626(C)
|
:00431632 5F
pop edi
:00431633 5E
pop esi
:00431634 5D
pop ebp
:00431635 33C0
xor eax, eax/*听笨冬瓜兄说,这是我们的大敌!(EAX=00H)*/
:00431637 5B
pop ebx
:00431638 C3
ret
...
知道了CODE前4位是:mg37,那就让它OVER我们把CODE改一改:mg37abc1234,好了,顺利到了:004315E3这个CALL,这个CALL其实作用是这样的:把CODE第8位起的字符(就是:'1234')变成十进制的数字(就是:1234D)!我跟进了那个CALL但没能找出不所以然来,还有一点,变是第8位起的字符不能是字母,要不会成为一个负数的!我一开始就是这样,所以我走了弯路...
好了,之后就是用NAME计算了,得到一个数字和CODE第8位起的字符(就是:'1234')变成十进制的数字(就是:1234D)进行比较,相等就OK!,我的NAME(Vitamin
C)得到的是031DH=797D,那我的正确的CODE是:mg37xxx797(xxx可以为任何字符!)其实还有一个CODE,就是第5位是s的:mg37sxxx797(xxx可以为任何字符!),这个CODE是站点CODE(SITE
LICENSE)那个是个人CODE(GIF Movie Gear这个软件说的)这就是那个非必须比较的作用!
好了,到了这里,也就完成了.其实那个计算NAME的算法可以看出来的,不难,要你有能力,可以写一个注册机!
算法:
Vitamin C
取每个字符的16进制数*它所在的位(第一位*1,第二位*2...)相加再加上0BDFH,要是>17BEH时就减去一个17BEH直到<17BEH(6078D)就行了,那个得到的数的10进制数就是这个NAME的CODE.对了,还有一点,就是计算名字最多计算到第10个字符!其它的就不用算了!
OK!
NAME:Vitamin C
CODE:mg37xxx797/mg37sxxx797 (xxx可以为任何字符!)
Vitamin C[抗坏血酸].2002.2.18.HY.GD.CHI.
- 标 题:破解GIF Movie Gear 3.01 (8千字)
- 作 者:VitaminC[抗坏血
- 时 间:2002-3-13 22:17:27
- 链 接:http://bbs.pediy.com