Opera 3.50
简介:Opera is a World Wide Web client, ie. a program for retrieving information
on the World Wide Web via documents created with the HyperText Markup Language (HTML).
追踪:name:dahuilang
company:programhunter
RN:01234567
今天这是我第二次写这个软件破解文章,第一次写的在最后保存时候出现了一个系统性的
错误,所以一下子都没有了,这个可是我一个小时的工作就这样没有了,没有办法还得将它
写出来供大家参与。这个程序dro已经将V4.0版的破解过程和注册机制作完成了。这里我是
将这个软件的V3.5版追踪一下,但是这个版本同4.0有差相当的差别,从最简单的来说,这
个版本可以看到注册码,而4.0中无法看到注册码。那么这个版本就是初中级的人来学习追
的。let's go!
* Reference To: USER32.GetDlgItemTextA, Ord:0104h
|
0048946B 8B35A4944E00 mov esi, dword ptr [004E94A4]
00489471 57 push edi
00489472 BFC8000000 mov edi, 000000C8
00489477 8D8548FEFFFF lea eax, dword ptr [ebp+FFFFFE48]
0048947D 57 push edi
0048947E 50 push eax
* Possible Reference to Dialog: REGISTER, CONTROL_ID:290C, ""
|
0048947F 680C290000 push 0000290C
00489484 53 push ebx
00489485 FFD6 call esi
00489487 8D8514FFFFFF lea eax, dword ptr [ebp+FFFFFF14]
0048948D 57 push edi
0048948E 50 push eax
* Possible Reference to Dialog: REGISTER, CONTROL_ID:290D, ""
|
0048948F 680D290000 push 0000290D
00489494 53 push ebx
00489495 FFD6 call esi
00489497 8D45E0 lea eax, dword ptr [ebp-20]
0048949A 6A1E push 0000001E
0048949C 50 push eax
* Possible Reference to Dialog: REGISTER, CONTROL_ID:290E, ""
|
0048949D 680E290000 push 0000290E
004894A2 53 push ebx
004894A3 FFD6 call esi
004894A5 8D8514FFFFFF lea eax, dword ptr [ebp+FFFFFF14]
004894AB 8B0D182B5000 mov ecx, dword ptr [00502B18]
004894B1 50 push eax
004894B2 8D8548FEFFFF lea eax, dword ptr [ebp+FFFFFE48]
004894B8 50 push eax
004894B9 8D45E0 lea eax, dword ptr [ebp-20]
004894BC 50 push eax
004894BD E86F15FDFF call 0045AA31
* Reference To: USER32.EndDialog, Ord00B9h
|
004894C2 8B35D0944E00 mov esi, dword ptr [004E94D0]
004894C8 85C0 test eax, eax
004894CA 7407 je 004894D3
004894CC 6A01 push 00000001
004894CE 53 push ebx
004894CF FFD6 call esi
004894D1 EB07 jmp 004894DA
大家看到上面那个esi了吧,它的作用是让程序使用USER32.GetDlgItemTextA这个函数,
这个函数就是将对话框中值取到程序中来。它将连续取三次,因为有三个选项,当程序来到
call 0045AA31出错,因为下面有一个跳跃的地方,可以大概知道这里就是关键的地方进入
其中。
0045AA31 8B442408 mov eax, dword ptr [esp+08]
0045AA35 53 push ebx
0045AA36 33DB xor ebx, ebx
0045AA38 56 push esi
0045AA39 3BC3 cmp eax, ebx
0045AA3B 57 push edi
0045AA3C 8BF1 mov esi, ecx
0045AA3E 0F8410010000 je 0045AB54
0045AA44 3818 cmp byte ptr [eax], bl
0045AA46 0F8408010000 je 0045AB54
0045AA4C 8B7C2418 mov edi, dword ptr [esp+18]
0045AA50 3BFB cmp edi, ebx
0045AA52 0F84FC000000 je 0045AB54
0045AA58 381F cmp byte ptr [edi], bl
0045AA5A 0F84F4000000 je 0045AB54
0045AA60 8B8634030000 mov eax, dword ptr [esi+00000334]
0045AA66 3BC3 cmp eax, ebx
0045AA68 7407 je 0045AA71
0045AA6A 50 push eax
0045AA6B E8BDE50700 call 004D902D
0045AA70 59 pop ecx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|0045AA68(C)
|
0045AA71 8B8638030000 mov eax, dword ptr [esi+00000338]
0045AA77 3BC3 cmp eax, ebx
0045AA79 7407 je 0045AA82
0045AA7B 50 push eax
0045AA7C E8ACE50700 call 004D902D
0045AA81 59 pop ecx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|0045AA79(C)
|
0045AA82 8B8630030000 mov eax, dword ptr [esi+00000330]
0045AA88 3BC3 cmp eax, ebx
0045AA8A 7407 je 0045AA93
0045AA8C 50 push eax
0045AA8D E89BE50700 call 004D902D
0045AA92 59 pop ecx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|0045AA8A(C)
|
0045AA93 FF742414 push [esp+14]
0045AA97 E8C4F60400 call 004AA160
0045AA9C 57 push edi
0045AA9D 898634030000 mov dword ptr [esi+00000334], eax
0045AAA3 E8B8F60400 call 004AA160
0045AAA8 FF742418 push [esp+18]
0045AAAC 898638030000 mov dword ptr [esi+00000338], eax
0045AAB2 E8A9F60400 call 004AA160
0045AAB7 50 push eax
0045AAB8 898630030000 mov dword ptr [esi+00000330], eax
0045AABE E80EF70400 call 004AA1D1
0045AAC3 8B8634030000 mov eax, dword ptr [esi+00000334]
0045AAC9 83C410 add esp, 00000010
0045AACC 3BC3 cmp eax, ebx
0045AACE 0F8480000000 je 0045AB54
0045AAD4 3818 cmp byte ptr [eax], bl
0045AAD6 747C je 0045AB54
0045AAD8 8B8638030000 mov eax, dword ptr [esi+00000338]
0045AADE 3BC3 cmp eax, ebx
0045AAE0 7472 je 0045AB54
0045AAE2 3818 cmp byte ptr [eax], bl
0045AAE4 746E je 0045AB54
上面的程序是验证输入的三项是否有一项为空,如果不则进行到下面。
0045AAE6 FFB630030000 push dword ptr [esi+00000330]
0045AAEC 8BCE mov ecx, esi
0045AAEE E84E010000 call 0045AC41
0045AAF3 85C0 test eax, eax
0045AAF5 7534 jne 0045AB2B
0045AAF7 8BB630030000 mov esi, dword ptr [esi+00000330]
0045AAFD 3BF3 cmp esi, ebx
0045AAFF 7421 je 0045AB22
0045AB01 381E cmp byte ptr [esi], bl
0045AB03 741D je 0045AB22
程序现在来到有跳跃的地方,通常有跳跃的地方大家一定要注意它们,那么这里是重要还
是不重要,这就要你去分析它。
如果在上面没有进行跳跃的话,你将来到下面。
0045AB05 6A04 push 00000004
* Possible StringData Ref from Data Obj ->"1234"
|
0045AB07 68F4704F00 push 004F70F4
0045AB0C 56 push esi
0045AB0D E82EE50700 call 004D9040
0045AB12 83C40C add esp, 0000000C
0045AB15 85C0 test eax, eax
0045AB17 7509 jne 0045AB22
0045AB19 53 push ebx
0045AB1A 53 push ebx
* Possible Reference to String Resource ID=20115: "The serial number you just
entered is pirated. Please suppor"
|
0045AB1B 68934E0000 push 00004E93
0045AB20 EB39 jmp 0045AB5B
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|0045AAFF(C), 0045AB03(C), 0045AB17(C)
|
0045AB22 53 push ebx
0045AB23 53 push ebx
* Possible Reference to String Resource ID=20099: "Incorrect serial number"
|
0045AB24 68834E0000 push 00004E83
0045AB29 EB30 jmp 0045AB5B
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|0045AAF5(C)
|
0045AB2B 8B0E mov ecx, dword ptr [esi]
0045AB2D 3BCB cmp ecx, ebx
0045AB2F 741E je 0045AB4F
0045AB31 FFB630030000 push dword ptr [esi+00000330]
0045AB37 FFB638030000 push dword ptr [esi+00000338]
0045AB3D FFB634030000 push dword ptr [esi+00000334]
0045AB43 E857610500 call 004B0C9F
0045AB48 8B0E mov ecx, dword ptr [esi]
0045AB4A E800620500 call 004B0D4F
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|0045AB2F(C)
|
0045AB4F 6A01 push 00000001
0045AB51 58 pop eax
0045AB52 EB15 jmp 0045AB69
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|0045AA3E(C), 0045AA46(C), 0045AA52(C), 0045AA5A(C), 0045AACE(C)
|0045AAD6(C), 0045AAE0(C), 0045AAE4(C)
|
0045AB54 53 push ebx
0045AB55 53 push ebx
* Possible Reference to String Resource ID=21106: "Please enter both name and organization."
|
0045AB56 6872520000 push 00005272
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|0045AB20(U), 0045AB29(U)
|
0045AB5B 8B0D382B5000 mov ecx, dword ptr [00502B38]
0045AB61 53 push ebx
0045AB62 E888140100 call 0046BFEF
0045AB67 33C0 xor eax, eax
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|0045AB52(U)
|
0045AB69 5F pop edi
0045AB6A 5E pop esi
0045AB6B 5B pop ebx
0045AB6C C20C00 ret 000C
首先这个函数在返回之前大家一定要知道只有当eax等于什么时候才能使注册成功。只有
当eax=1的时候才能注册成功。那么我们就要想办法使eax=1,通过上面来看,只有当程序跳
到
0045AB4F 6A01 push 00000001
0045AB51 58 pop eax
这里时才能eax=1,那么程序将如何才能跳到这里,向上看,发现只有这个地方可以跳到正确的地方。
0045AAEE E84E010000 call 0045AC41
0045AAF3 85C0 test eax, eax
0045AAF5 7534 jne 0045AB2B
现在就进入call 0045AC41中
0045AC4D 7443 je 0045AC92
0045AC4F 56 push esi
0045AC50 E82BE40700 call 004D9080
0045AC55 83F80C cmp eax, 0000000C
0045AC58 59 pop ecx
现在可以发现这里比较注册码的位数,通常只要有比较位数的地方就快到了比较地方了,
设RN:012345678901后向下走。
0045AC5B 8D45F0 lea eax, dword ptr [ebp-10]
0045AC5E 56 push esi
0045AC5F 50 push eax
0045AC60 E82BE60700 call 004D9290
0045AC65 8D45F0 lea eax, dword ptr [ebp-10]
0045AC68 50 push eax
0045AC69 E881FFFFFF call 0045ABEF
0045AC6E 8D45F0 lea eax, dword ptr [ebp-10]
0045AC71 56 push esi
0045AC72 50 push eax
0045AC73 E888E40700 call 004D9100
0045AC78 83C414 add esp, 00000014
0045AC7B 85C0 test eax, eax
0045AC7D 7513 jne 0045AC92
0045AC7F 0FB606 movzx eax, byte ptr [esi]
0045AC82 50 push eax
0045AC83 E8A2EE0700 call 004D9B2A
0045AC88 85C0 test eax, eax
0045AC8A 59 pop ecx
0045AC8B 7405 je 0045AC92
0045AC8D 6A01 push 00000001
0045AC8F 58 pop eax
0045AC90 EB02 jmp 0045AC94
同样这里又有一个保证eax=1,那么如何可以到达这里呢?它上面有二个可以跳跃过这里c
all,先进入第一个当中。
004D9100 8B542404 mov edx, dword ptr [esp+04]
004D9104 8B4C2408 mov ecx, dword ptr [esp+08]
* Possible Reference to Menu: MenuID_0003
|
004D9108 F7C203000000 test edx, 00000003
004D910E 753C jne 004D914C
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|004D913C(C), 004D9166(C), 004D9182(U)
|
004D9110 8B02 mov eax, dword ptr [edx]
004D9112 3A01 cmp al, byte ptr [ecx]
004D9114 752E jne 004D9144
004D9116 0AC0 or al, al
004D9118 7426 je 004D9140
004D911A 3A6101 cmp ah, byte ptr [ecx+01]
004D911D 7525 jne 004D9144
004D911F 0AE4 or ah, ah
004D9121 741D je 004D9140
004D9123 C1E810 shr eax, 10
004D9126 3A4102 cmp al, byte ptr [ecx+02]
004D9129 7519 jne 004D9144
004D912B 0AC0 or al, al
004D912D 7411 je 004D9140
004D912F 3A6103 cmp ah, byte ptr [ecx+03]
004D9132 7510 jne 004D9144
004D9134 83C104 add ecx, 00000004
004D9137 83C204 add edx, 00000004
004D913A 0AE4 or ah, ah
004D913C 75D2 jne 004D9110
004D913E 8BFF mov edi, edi
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|004D9118(C), 004D9121(C), 004D912D(C), 004D915E(C), 004D9174(C)
|004D917D(C)
|
004D9140 33C0 xor eax, eax
004D9142 C3 ret
在上面这里,你将能够看到真正的注册码,但是大家不要急,因为主程序下面还有一个可
以跳跃的地方,我们只有解决掉那个拦路虎才能真正的得到注册码。进入下面的call中。
004D9B2A 833D5CFE4F0001 cmp dword ptr [004FFE5C], 00000001
004D9B31 7E0E jle 004D9B41
004D9B33 6A01 push 00000001
004D9B35 FF742408 push [esp+08]
004D9B39 E8EB5E0000 call 004DFA29
004D9B3E 59 pop ecx
004D9B3F 59 pop ecx
004D9B40 C3 ret
进入call 004DFA29中
004DFA29 55 push ebp
004DFA2A 8BEC mov ebp, esp
004DFA2C 51 push ecx
004DFA2D 8B4508 mov eax, dword ptr [ebp+08]
004DFA30 8D4801 lea ecx, dword ptr [eax+01]
004DFA33 81F900010000 cmp ecx, 00000100
004DFA39 770C ja 004DFA47
* Possible StringData Ref from Data Obj ->" ((((( "
->" H"
|
004DFA3B 8B0D50FC4F00 mov ecx, dword ptr [004FFC50]
004DFA41 0FB70441 movzx eax, word ptr [ecx+2*eax]
004DFA45 EB52 jmp 004DFA99
004DFA99 23450C and eax, dword ptr [ebp+0C]
004DFA9C C9 leave
004DFA9D C3 ret
这里函数的入口为注册码的第一个字符,那么程序将对这个字符进行什么计算呢?在这,
常常解密的人可以知道大概,它很有可能是验证这个字符的什么特性,如是数字,是字母会
的,那么在这里程序是验证什么的。
1 eax=[ecx+eax*2]
2 eax=eax AND [ebp+c] [ebp+c]=1(固定)
程序由eax的从ecx的表中得到一个值,再使用这个值同1进行and计算,这里将得到eax,
因为如果保证它上级的call不跳跃的话,只有当and的结果等于1才行,那么当and的结果等
于1时,第一步的eax就等于什么,从ecx的表中查到,ecx+41*2的值可以满足条件。那么这
里就是验证第一个字符是否为字母,所以现在设RN:AAAA45678901后,再到前面得到后8位
的注册码,现在就可以宣告破解这个软件的。
*********************************
* name:dahuilang *
* company:programhunter *
* RN:AAAAjXPtL16W *
*********************************
|
wingate V3.0.5
程式猎人
简介:
追踪:name:dahuilang
RN:01234567
由于网友的要求,所以从网上下载了这个文件来试着将破解一下,破解后发现其实这个软
件还是比较简单的,但是对于初学者来说应当有一定的难度。现在就来看一看如何对它进行
破解。
004638DB E8BDF20400 call 004B2B9D
004638E0 83C660 add esi, 00000060 程序将从这里出来
004638E3 56 push esi
* Possible Reference to Dialog: DialogID_00B3, CONTROL_ID:04D7, "Licensee"
|
004638E4 68D7040000 push 000004D7
004638E9 FF742410 push [esp+10]
004638ED E8ABF20400 call 004B2B9D
004638F2 5E pop esi
004638F3 C20400 ret 0004
上面就是程序从系统区域跳到程序的地方,在这里没有什么可以多说的,GO!
0046392E FF7660 push [esi+60]
00463931 8D4DC8 lea ecx, dword ptr [ebp-38]
00463934 C745FC01000000 mov [ebp-04], 00000001
0046393B E8777DFDFF call 0043B6B7
00463940 8B465C mov eax, dword ptr [esi+5C]
00463943 8378F818 cmp dword ptr [eax-08], 00000018 比较RN位数=18(H)
00463947 740B je 00463954
00463949 50 push eax
0046394A 8D4DC8 lea ecx, dword ptr [ebp-38]
0046394D E8747DFDFF call 0043B6C6
00463952 EB0B jmp 0046395F
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|00463947(C)
|
00463954 6A01 push 00000001
00463956 50 push eax
00463957 8D4DC8 lea ecx, dword ptr [ebp-38]
0046395A E8767DFDFF call 0043B6D5
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|00463952(U)
|
0046395F A1805E5100 mov eax, dword ptr [00515E80]
00463964 8945F0 mov dword ptr [ebp-10], eax
00463967 8D45F0 lea eax, dword ptr [ebp-10]
0046396A 8D4DC8 lea ecx, dword ptr [ebp-38]
0046396D 50 push eax
0046396E C645FC02 mov [ebp-04], 02
00463972 E82399FDFF call 0043D29A ***
00463977 85C0 test eax, eax
00463979 7473 je 004639EE
0046397B 833D48CE510000 cmp dword ptr [0051CE48], 00000000
00463982 7461 je 004639E5
上面有一个地方是比较注册码的位数是否等于18(H)=24位,所以在这里将RN:012345678
901234567890123后重新追踪这个程序,当来到***发现它是一个关键的函数,所以应当进入其中。
0043D29A B820794C00 mov eax, 004C7920
0043D29F E8306D0500 call 00493FD4
0043D2A4 51 push ecx
0043D2A5 56 push esi
0043D2A6 57 push edi
0043D2A7 8BF1 mov esi, ecx
0043D2A9 E887E6FFFF call 0043B935
0043D2AE 50 push eax
0043D2AF 8D4DF0 lea ecx, dword ptr [ebp-10]
0043D2B2 E8E8CC0600 call 004A9F9F
0043D2B7 8365FC00 and dword ptr [ebp-04], 00000000
* Possible StringData Ref from Data Obj ->"@!WGCLIENT"
|
0043D2BB 6858815000 push 00508158
0043D2C0 8BCE mov ecx, esi
0043D2C2 E8F0E3FFFF call 0043B6B7
0043D2C7 FF7508 push [ebp+08]
0043D2CA 8BCE mov ecx, esi
0043D2CC E86D000000 call 0043D33E
0043D2D1 85C0 test eax, eax
0043D2D3 7411 je 0043D2E6
0043D2D5 807E0C03 cmp byte ptr [esi+0C], 03
0043D2D9 720B jb 0043D2E6
0043D2DB 807E0D07 cmp byte ptr [esi+0D], 07
0043D2DF 7505 jne 0043D2E6
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|0043D2FC(C)
|
0043D2E1 6A01 push 00000001
0043D2E3 5F pop edi
0043D2E4 EB3A jmp 0043D320
现在我们来到了这个call的内部,又发现了比较的关键地方,所以继续进入call 0043D33中,
0043D367 E8D1E5FFFF call 0043B93D
0043D36C 8BD8 mov ebx, eax
0043D36E 85DB test ebx, ebx
0043D370 0F84CC020000 je 0043D642
0043D376 8B45E0 mov eax, dword ptr [ebp-20]
0043D379 8B48F8 mov ecx, dword ptr [eax-08]
0043D37C 83F918 cmp ecx, 00000018 注册码位数=18(H)
0043D37F 7536 jne 0043D3B7
0043D381 33FF xor edi, edi
0043D383 EB03 jmp 0043D388
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|0043D3B3(C)
|
0043D385 8B45E0 mov eax, dword ptr [ebp-20]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|0043D383(U)
|
0043D388 8A0C78 mov cl, byte ptr [eax+2*edi]
0043D38B 8D0478 lea eax, dword ptr [eax+2*edi]
0043D38E 884DE4 mov byte ptr [ebp-1C], cl
0043D391 6A10 push 00000010
0043D393 8A4001 mov al, byte ptr [eax+01]
0043D396 8065E600 and byte ptr [ebp-1A], 00
0043D39A 8845E5 mov byte ptr [ebp-1B], al
0043D39D 8D45E4 lea eax, dword ptr [ebp-1C]
0043D3A0 6A00 push 00000000
0043D3A2 50 push eax
0043D3A3 E8917E0500 call 00495239
0043D3A8 83C40C add esp, 0000000C
0043D3AB 88443DE8 mov byte ptr [ebp+edi-18], al
0043D3AF 47 inc edi
0043D3B0 83FF0C cmp edi, 0000000C
0043D3B3 7CD0 jl 0043D385
0043D3B5 EB19 jmp 0043D3D0
0043D415 59 pop ecx
0043D416 33FF xor edi, edi
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|0043D425(C)
|
0043D418 E81F040000 call 0043D83C
0043D41D 30443DE8 xor byte ptr [ebp+edi-18], al
0043D421 47 inc edi
0043D422 83FF0C cmp edi, 0000000C
0043D425 7CF1 jl 0043D418
0043D427 32C9 xor cl, cl
0043D429 33FF xor edi, edi
0043D42B 33C0 xor eax, eax
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|0043D43A(C)
|
0043D42D 83F808 cmp eax, 00000008
0043D430 7404 je 0043D436
0043D432 024C05E8 add cl, byte ptr [ebp+eax-18]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|0043D430(C)
|
0043D436 40 inc eax
0043D437 83F80C cmp eax, 0000000C
0043D43A 7CF1 jl 0043D42D
0043D43C 8A45F0 mov al, byte ptr [ebp-10]
0043D43F 3AC8 cmp cl, al
0043D441 7567 jne 0043D4AA
现在我们可以从上面的地方得到这个软件要求注册码位数要为24位。当我来到call 0043D
83C这里时,发现这里是运算注册码的关键地方,因为我没有仔细的分析这里,我现在只将
它如何运算写出来。这里是从call 0043D83C中得到al值,使用al值来同[ebp+edi-18]进行X
OR计算,这里还要向大家解释一下这个[ebp+edi-18]是什么,它就是程序前面将我们输入的
RN以字符形式储存在这里的,使用这里每两个字符同al值进行XOR计算后,得到的12值后在
下面将这12值相加后,得到的值应当等于[ebp-10]这个值,如果相等则可以注册码成功。现
在经过试验,发现al值是不变的,所以这样我就可以轻松得到这个软件的注册码了。但是在
这里还有一点不行,因为在这里就是使cl=al后,出call后,也无法注册成功。如果大家来
到下面这里使用上面的方法注册就可以成功了。
0043D2EB E8C7E3FFFF call 0043B6B7
0043D2F0 FF7508 push [ebp+08]
0043D2F3 8BCE mov ecx, esi
0043D2F5 E844000000 call 0043D33E
0043D2FA 85C0 test eax, eax
0043D2FC 75E3 jne 0043D2E1
* Possible StringData Ref from Data Obj ->"@@WGINTERNAL##30##IGNORE@@"
|
0043D2FE 68BC815000 push 005081BC
这里的call同上面的call是同一个函数,所以在这里如果使cl=al就可以注册成功。现在
从上面的call中可以得到12个cl值,分别如下:
cl C8 EE A5 79 1B 7B 58 12 70 45 28 4A
因为al=0,所以在这里只要将12cl值当为注册码就可以了。现在也就是说明破解OK了。
***************************************
* name:dahuilang *
* RN:C8EEA5791B7B58127045284A *
***************************************
|
Quick View Plus 4.0
Step 1. Run ORDER32.EXE
Step 2. Click on $49 Single User License (You can click on $59), then ACCEPT,
then UNLOCK BY PHONE.
Step 3. Enter any code to get the error message. (You should write down this
message) and exit the program by clicking on CANCEL.
Step 4. Run Norton Commander, go to QVP directory.
Step 5. Copy ORDER32.EXE to ORDER32.EXX (for backup) and copy ORDER32.EXE to
1.EXE (for use by W32Dasm)
Step 6. Run W32Dasm and disassemble 1.EXE.
Step 7. Once it's disassembled, click STRING DATA REFERENCE, look down for the
string "You have entered an incorrect code. Please check your entry"
(You should remember that error message), double click on it.
Step 8. Close SDR window, you should see the line:
* Possible reference to String Resource ID=00041: "You have entered...
:004049F8 6A29 push 00000029
:004049FA FF353CCE4000 push dword ptr [0040CE3C]
Step 9. Ok, now you must look for the last comparison like CMP, JNE, JE, TEST,
etc before the error string. Press UP arrow key till you find:
:004049CD 755A jne 00404A29
* Possible reference to String Resource ID=00032: "You must select...
:004049CF 6A20 push 00000020
...
...
* Possible reference to String Resource ID=00040: "Unlock Error"
Step 10. Now you know where it jumps to when you've entered the wrong code.
Now you want see if it will work when you replace "jne" with "je".
Make sure the green color bar is on :004049CD 755A jne 00404A29, you
should see Offset address below on the screen like @Offset 00003DCDh.
It's where you can patch it in ORDER32.EXE.
Step 11. Go back to Norton Commander, run HIEW ORDER32.EXE, press F4 to select
Decode mode (ASM), press F5 and enter 3DCD. You should see like:
00003DCD: 755A jne 000003E29
00003DCF: 6A20 push 020
00003DD1: FF15 call w,[di]
Step 12. That's where you can change the bytes, press F3, enter 74, press F9 to
update ORDER32.EXE. Exit HIEW.
Step 13. Run ORDER32.EXE, enter any code. Voila! You've cracked QVP 4.0!
Beware! What if you've enter the real serials? It'll jump to the error
message dialog! What now?
Step 14. Run again HIEW ORDER32.EXE, press F4, select Decode, press F5 and
enter 3DCD. Press F3, enter EB, press F9. It'll jump directly to
Unlocked dialog.
|