探索 http://programhunter.home.china.com
杂志宗旨:知识共享 资料共享 资源共享
制作成员:程式猎人
发行时间:2000-7-15(第三期)
网站地址:http://programhunter.home.china.com

编辑寄语:

本周向各位订户发送了本杂志的第一份增刊,在增刊中向大家介绍的Oper V4.0的注册方法以及注册机的制作过程,那么这期首先向大家介绍由斑竹破解的Oper V3.5版,当然这个版本肯定没有4.0版注册复杂,但是它不妨碍大家来学习如何破解。从这周开始杂志将向大家介绍一些国外写的关于解密方面的文章,这样如果你的英语比较差,你可要努力了。因为对于解密来说,我们应当学习国外的先进技术,就要学习英语。如果我们国家技术先进,那么就不用再学习英语了,所以希望大家努力工作使我们的国家在世界上成为一个强大的国家。
目 录:
1.
Opera 3.50 程式猎人
wingate V3.0.5 程式猎人
帝国时代II硬盘版的制作 DayDreamer (转载)
Quick View Plus 4.0 The Keyboard Caper (转载)
2.
   
3.
   
4.
   
5.
   
返回
             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    *
                        ***************************************
返回
                   帝国时代II硬盘版的制作
帝国时代II光盘版出来好久了,我这两天才拿到。为了少被奸商赚钱,我经过X个小时的CRACKING才
把它搞成硬盘版。现在把过程大概说一下:

1、先进入游戏,把鼠标移到“Single Player”上,按Ctl+D激活Soft-Ice,设 bpx mouse_event
2、按Ctl+D 回到游戏,点击鼠标,Soft-Ice会弹出,再按Ctl+D
3、动一下鼠标,Soft-Ice会再次弹出,设bd 0
   按F12 、F8、再按八次F12
4、改按F10,直到CS:0041D041 CALL EBP
            这时会出框
我在这犯了个错误,以为关键就在CS:0041D041 CALL EBP里,搞了好久都没搞定。后来用DEASM把
EMPIRE2.EXE反汇编后,找到一个与CS:41F166有关连的字符串“CD Path”。


再进入游戏,按Ctl+D激活Soft-Ice,设BPX CS:41F166
被拦到后按几下F10,可以看到:

015F:004F00DC  Test EAX,EAX
015F:004F00DE  Jz   004f0172
               ~~
               鬼就在这里!


好,用UltraEdit打开EMPIRE2.EXE,找到:
                                    85 C0               (即 Test EAX,EAX)
                                    0F 84 8E 00 00 00   (即 Jz   4F0172)
                                    A1 C4 45 66 00
                                改为:
                                    85 C0               (即 Test EAX,EAX)
                                    0F 85 8E 00 00 00   (即 Jnz  4F0172)
                                    A1 C4 45 66 00
存盘,搞定!    

     各位CRACKING 爱好者,有什么经验还望和俺交流交流。



                                                     愚人工作室:DayDreamer 
                                                     1999.11.8
                                                     E-Mail:IHaveNoDream@163.net
返回
                         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.
返回
初学天地:
                         破解教程
                            程式猎人
   好了,各位学员请座好,现在我开始讲课了。你们还记得上节课我给大家留的作业没有
,我想大家一是工作太忙了,另一方面是因为这个作业太简单了吧。但是无论如何,我只
是希望大家能够练出本领就可以了,具体交不交作业没有关系。
   那么现在我就介绍一下上节课的作业如何进行破解。如下:
软件名称:WinRescue 9.12 For Win95 
文件大小:599 KB
软件授权:共享软件
使用平台:Win95/98
发布公司:http://superwin.com/ 
软件简介:当你的Windows 98/95操作系统发生问题无法开机,连安全模式也有问题时,
大部分的人可能会选择重灌作业系统一途,或许你可以试试这个软件,它可帮你在平时事
先备份Win 98/95的结构配置相关文件(包括autoexec.bat、config.sys、msdos.sys、Regi
stry登录档、Start Menu、桌面捷径、IE的书签...等)并建立一片紧急救援磁盘,当Win 9
8/95发生问题无法开机时让你使用救援磁盘顺利的开机进入安全模式,然后还原回先前的
结构配置.程序并且附有清除Registry登录档中没用的机码功能。
 
0046C687 8B55F4                  mov edx, dword ptr [ebp-0C]
0046C68A B86CC74600              mov eax, 0046C76C
0046C68F E82079F9FF              call 00403FB4
0046C694 85C0                    test eax, eax
0046C696 742D                    je 0046C6C5
0046C698 33D2                    xor edx, edx
0046C69A 8B83F4010000            mov eax, dword ptr [ebx+000001F4]
  在这里我们依然使用上节课介绍的方法进行破解,大家还记得上节课介绍的方法了吧?
现在我再说一遍。
  1 先输入fake RN:76543210
  2 ctrl+M调出TRW(crtl+D调出SI),在这里设bpx hmemcpy
  3 回到程序中,点击OK,TRW弹出。
  4 在这里你可以使用F12,跳跃直到上面0046C687处就可以了。
  5,现在使用 d 0046C76C,你会在数据窗口中看到一串字符,这个字符就是注册码,现
在大家知道了吧。


  作业今天就介绍到这里,我现在要向大家介绍另一个比较的方式,大家一定要记得我在
第一课中介绍的比较方式。对于初学者来说记住这些方式非常重要。
     mov  eax [      ]  这里可以是地址,也可以是其它寄存器
     mov  edx [      ]  同上  通常这两个地址就储存着重要信息
     call 00??????
     test eax eax
     jz(jnz)
 这种方式就是上节课介绍的,现在介绍另一个,如下:
     mov  eax [      ]  这里可以是地址,也可以是其它寄存器
     mov  edx [      ]  同上  通常这两个地址就储存着重要信息
     call 00??????
     jne(je)
  这种比较方式是一种更为常用的比较方式,如果你在追踪过程中如果发现了有这样一段
代码,大家一定要注意,因为这个极有可能就是得到注册码的地方。
  好了,现在我还是以hard key(HK)来向大家介绍如何追踪。对于这个HK来说,是破解中
最为简单,这个我在第一课就说过,因为大家是初学者,所以我们就应当先从最简单的开
始,如果你一开始就破解难度很高的软件,不仅你会无法破解,而且还有可以打消你的破
解斗志。现在不说了,开始举例破解。

软件名称:Directory Printer V3.0
简介:一套可将硬盘中的资料夹及文件名称打印出来的工具,它除可打印文件名外亦可
选项的将文件资讯如大小、日期、属性等加入打印,也可依日期、大小、文件名等来排
序打印,当然也可选择不打印而存成文字文件(*.TXT)。 
  这个软件的破解过程同前一讲介绍的一样,如果有些人没有听到前一节课的话,你们可
以到我的网站致病下载相应的杂志看一下就行了。
  1 先输入fake RN:76543210
  2 ctrl+M调出TRW(crtl+D调出SI),在这里设bpx hmemcpy
  3 回到程序中,点击OK,TRW弹出。
  4 在这里你可以使用F12,将程序跳跃到程序控制的地方,这里如果有人不懂的话,可
以参考我在第一节介绍的方法。现在大家将来到这里0047BE77,
0047BE77 8B45F8                  mov eax, dword ptr [ebp-08]
0047BE7A 8D55FC                  lea edx, dword ptr [ebp-04]
0047BE7D E89ECDF8FF              call 00018C20
0047BE82 8B45FC                  mov eax, dword ptr [ebp-04]
0047BE85 50                      push eax
0047BE86 8D55F4                  lea edx, dword ptr [ebp-0C]
0047BE89 B8CCF42700              mov eax, 0027F4CC
0047BE8E E841CFF8FF              call 00018DD4
0047BE93 8B55F4                  mov edx, dword ptr [ebp-0C]  
0047BE96 58                      pop eax
0047BE97 E82081F8FF              call 00013FBC
0047BE9C 0F85F0000000            jne 0008BF92
0047BEA2 B201                    mov dl, 01
  你们现在看一下这里的程序,大家有没有发现,这里有一个我前面介绍的类似的比较方式
0047BE93 8B55F4                  mov edx, dword ptr [ebp-0C]  
0047BE96 58                      pop eax
0047BE97 E82081F8FF              call 00013FBC
0047BE9C 0F85F0000000            jne 0008BF92
  这个比较方式是一个比较典型的方式,大家一定要记住。到达这里你一定要使用d 这个命
令,d一下edx,eax你会发现什么,在这里你将看到edx=2618572而eax=76543210,我想大家
都知道那个edx是什么。
  好了,这节课我们主要学习了第二个比较形式。对于这个比较形式大家一定一定要记住,
因为这种比较形式以后是常使用的,就是在name->RN时,它也很常用。
  总之,它的重要性大家以后一定会知道的。OK!这节课我就讲到这里,对于作业吗?我想
我还是留给大家,如果大家有时间或有兴趣不妨做一下,对初学者有一定的帮助。它的名字
autoranman V1.0,这个程序是管理启动程序的软件。初学者可以一试。
返回
问题答疑:

有的网友说,他无法设readfile writefile等中断,这里向你们介绍如何能够设这些中断。

    在 softice 的目录下有一个文件叫 winice.dat(在windows/system/driver下也有相同一个) 
其实是个文本文件,将这文件的最后几行把他改成如下 :
前面有分号的就是注解,把后面有 *32.dll 的方号去掉就行了 
顺便加上 vb5, vb6 的 dll, 也可拦 vb 的 function 了 
EXP=c:\windows\system\kernel32.dll 
EXP=c:\windows\system\user32.dll 
EXP=c:\windows\system\gdi32.dll 
EXP=c:\windows\system\comdlg32.dll 
EXP=c:\windows\system\shell32.dll 
EXP=c:\windows\system\advapi32.dll 
EXP=c:\windows\system\shell232.dll 
EXP=c:\windows\system\comctl32.dll 
;EXP=c:\windows\system\crtdll.dll 
;EXP=c:\windows\system\version.dll 
EXP=c:\windows\system\netlib32.dll 
;EXP=c:\windows\system\msshrui.dll 
EXP=c:\windows\system\msnet32.dll 
EXP=c:\windows\system\mspwl32.dll 
;EXP=c:\windows\system\mpr.dll 
exp=c:\soft\95logo3\vb40032.dll 
exp=c:\windows\system\msvbvm50.dll 
exp=c:\windows\system\msvbvm60.dll (从看雪crack教学转载)
返回
网站介绍:http://elitetoplist.com
对于能够访问国外网站的解密者来说,上面这个网站你们一定要进入看一看,因为这个网站上收集了世界上比较著名的破解站点,其中包括中国解密地带等相当出名的网站。它是一个导航站点,如果你进入这个网站你可以进入世界各个破解站点,你就可以从中学习到不少国外的先进破解技术,所以对于这个网站斑竹是大力向大家推荐。
返回
杂志信箱:

投稿信箱:discoveredit@china.com

答疑信箱:discoveranswer@china.com

斑竹信箱:programhunter@china.com

返回