關於UltraEdit32 v8.1的註冊校驗(PJ手記).高手免看! (14千字)

看雪資料發表於2002-02-01

軟體: UltraEdit32 v8.10
下載: 隨處可下.
工具: SoftIce 4.05,W32Dasm.
 
    此軟體的用途可不用我多說了吧! 網上也有很多它的序號產生器,新手可用它來練練手,呵呵! 今次主要來
看看它的註冊校驗.它的註冊碼經過加密後放在安裝路徑下的Uedit32.reg檔案裡,注意這不是登錄檔檔案.
程式在每次起動,執行時和關閉時檢測註冊碼的正確性.下:bpx createfilea do "d *(esp+4)"就可以攔截
到它讀這個檔案,回到程式的領空後再經readfile後就可見到你的經過加密後的註冊碼,經過解密運算後,
再按N次F10就來到如下的程式段:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00414927(C)
|
:0041483A 8B45F8                  mov eax, dword ptr [ebp-08]
:0041483D 8D740DB0                lea esi, dword ptr [ebp+ecx-50]
:00414841 03C6                    add eax, esi
:00414843 83F83C                  cmp eax, 0000003C
:00414846 7D42                    jge 0041488A
:00414848 8BC1                    mov eax, ecx

* Possible Reference to String Resource ID=00004: "*.MAC"
                                  |
:0041484A 6A04                    push 00000004
:0041484C 99                      cdq
:0041484D 5F                      pop edi
:0041484E F7FF                    idiv edi
:00414850 8BC1                    mov eax, ecx

* Possible Reference to String Resource ID=00032: "

Any changes will be lost and the file deleted!"
                                  |
:00414852 6A20                    push 00000020
:00414854 5B                      pop ebx

* Possible Reference to String Resource ID=00059: "Select File to Compare"
                                  |
:00414855 6A3B                    push 0000003B
:00414857 8BFA                    mov edi, edx
:00414859 99                      cdq
:0041485A F7FB                    idiv ebx
:0041485C 8BC2                    mov eax, edx
:0041485E 99                      cdq
:0041485F 2BC2                    sub eax, edx
:00414861 8B14BD9C225000          mov edx, dword ptr [4*edi+0050229C]
:00414868 D1F8                    sar eax, 1
:0041486A 5F                      pop edi
:0041486B 0FB60402                movzx eax, byte ptr [edx+eax]
:0041486F 8AD1                    mov dl, cl
:00414871 0255FC                  add dl, byte ptr [ebp-04]
:00414874 0FB6D2                  movzx edx, dl
:00414877 33C2                    xor eax, edx
:00414879 99                      cdq
:0041487A F7FF                    idiv edi
:0041487C 8B7D10                  mov edi, dword ptr [ebp+10]
:0041487F 8A4415B0                mov al, byte ptr [ebp+edx-50]
:00414883 02C1                    add al, cl
:00414885 324601                  xor al, byte ptr [esi+01]
:00414888 8806                    mov byte ptr [esi], al

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00414846(C)
|
:0041488A 83FF3C                  cmp edi, 0000003C
:0041488D 7D71                    jge 00414900
:0041488F 8BC1                    mov eax, ecx

* Possible Reference to String Resource ID=00005: "ULTRAEDT.MAC"
                                  |
:00414891 6A05                    push 00000005
:00414893 99                      cdq
:00414894 5B                      pop ebx
:00414895 F7FB                    idiv ebx
:00414897 8BDA                    mov ebx, edx
:00414899 85DB                    test ebx, ebx
:0041489B 895DF0                  mov dword ptr [ebp-10], ebx
:0041489E 740A                    je 004148AA
:004148A0 83FB02                  cmp ebx, 00000002
:004148A3 7405                    je 004148AA
:004148A5 83FB04                  cmp ebx, 00000004
:004148A8 751A                    jne 004148C4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041489E(C), :004148A3(C)
|
:004148AA 0FB606                  movzx eax, byte ptr [esi]

* Possible Reference to String Resource ID=00026: "Run Windows Program"
                                  |
:004148AD 6A1A                    push 0000001A
:004148AF 99                      cdq
:004148B0 5B                      pop ebx
:004148B1 F7FB                    idiv ebx
:004148B3 8B5DF0                  mov ebx, dword ptr [ebp-10]
:004148B6 80C241                  add dl, 41
:004148B9 88943D30FFFFFF          mov byte ptr [ebp+edi-000000D0], dl
:004148C0 47                      inc edi
:004148C1 897D10                  mov dword ptr [ebp+10], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004148A8(C)
|
:004148C4 83FF3C                  cmp edi, 0000003C
:004148C7 7D37                    jge 00414900
:004148C9 83FB01                  cmp ebx, 00000001
:004148CC 7405                    je 004148D3
:004148CE 83FB03                  cmp ebx, 00000003
:004148D1 7517                    jne 004148EA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004148CC(C)
|
:004148D3 0FB606                  movzx eax, byte ptr [esi]

* Possible Reference to String Resource ID=00010: "
  Thank you for supporting Shareware."
                                  |
:004148D6 6A0A                    push 0000000A
:004148D8 99                      cdq
:004148D9 5E                      pop esi
:004148DA F7FE                    idiv esi
:004148DC 80C230                  add dl, 30
:004148DF 88943D30FFFFFF          mov byte ptr [ebp+edi-000000D0], dl-->計算所得的註冊碼.
:004148E6 47                      inc edi
:004148E7 897D10                  mov dword ptr [ebp+10], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004148D1(C)
|
:004148EA 83FF3C                  cmp edi, 0000003C
:004148ED 7D11                    jge 00414900
:004148EF 83FB04                  cmp ebx, 00000004-->檢查是否每組註冊碼的第5位.
:004148F2 750C                    jne 00414900
:004148F4 C6843D30FFFFFF2D        mov byte ptr [ebp+edi-000000D0], 2D-->蓬5後面插"-".
:004148FC 47                      inc edi
:004148FD 897D10                  mov dword ptr [ebp+10], edi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041488D(C), :004148C7(C), :004148ED(C), :004148F2(C)
|
:00414900 85C9                    test ecx, ecx
:00414902 7E1F                    jle 00414923
:00414904 3B4DF4                  cmp ecx, dword ptr [ebp-0C]
:00414907 7D1A                    jge 00414923
:00414909 3B7DF4                  cmp edi, dword ptr [ebp-0C]
:0041490C 7D15                    jge 00414923
:0041490E 8B4508                  mov eax, dword ptr [ebp+08]
:00414911 0FBE5401FF              movsx edx, byte ptr [ecx+eax-01]
:00414916 0FBE0407                movsx eax, byte ptr [edi+eax]
:0041491A 0FAFD0                  imul edx, eax
:0041491D 011554C85000            add dword ptr [0050C854], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00414902(C), :00414907(C), :0041490C(C)
|
:00414923 41                      inc ecx
:00414924 83F93C                  cmp ecx, 0000003C----->檢查是否夠60位?
:00414927 0F8C0DFFFFFF            jl 0041483A
:0041492D 33D2                    xor edx, edx
  上面的這段演算法就是註冊碼的演算法,程式的演算法也不算是很複雜,有興趣可以研究上面的演算法,它主要是用
用註冊名的ASC碼和與0-----3C(前面幾位是用註冊名代替)之間的ASC碼值再加上查表作數學運算,每算一位
得一位註冊碼,名字>=6個,註冊碼>15個(後面可見到),註冊碼形式:AAAAA-BBBBB-XXXXX-YYYYY.


* Possible Reference to String Resource ID=00006: "Load Macro"
                                  |
:0041498A 6A06                    push 00000006
:0041498C 8065BF00                and byte ptr [ebp-41], 00
:00414990 80A547FFFFFF00          and byte ptr [ebp+FFFFFF47], 00--->此處選定所需的註冊碼位數.
:00414997 59                      pop ecx
:00414998 8D8570FFFFFF            lea eax, dword ptr [ebp+FFFFFF70]
:0041499E 50                      push eax
:0041499F 8DBD70FFFFFF            lea edi, dword ptr [ebp+FFFFFF70]--->此處要放的就是假註冊碼.
:004149A5 FF750C                  push [ebp+0C]
:004149A8 C68537FFFFFF30          mov byte ptr [ebp+FFFFFF37], 30--->真碼第8位置為0;
:004149AF F3                      repz
:004149B0 A5                      movsd
:004149B1 80658700                and byte ptr [ebp-79], 00
:004149B5 C68577FFFFFF30          mov byte ptr [ebp+FFFFFF77], 30--->假碼第8位置為0.
:004149BC C6857CFFFFFF30          mov byte ptr [ebp+FFFFFF7C], 30--->假碼第13位置為0.
:004149C3 C6458630                mov [ebp-7A], 30------------------>假碼最後一位置為0.
:004149C7 C6853CFFFFFF30          mov byte ptr [ebp+FFFFFF3C], 30--->真碼第13位置為0.
:004149CE C68546FFFFFF30          mov byte ptr [ebp+FFFFFF46], 30--->真碼最後一位置為0.
:004149D5 E8E65A0800              call 0049A4C0
:004149DA 59                      pop ecx
:004149DB 59                      pop ecx
:004149DC 5E                      pop esi
:004149DD 85C0                    test eax, eax
:004149DF 7523                    jne 00414A04
:004149E1 8D8570FFFFFF            lea eax, dword ptr [ebp+FFFFFF70]
:004149E7 50                      push eax
:004149E8 FF750C                  push [ebp+0C]
:004149EB E8D05A0800              call 0049A4C0
:004149F0 59                      pop ecx
:004149F1 85C0                    test eax, eax
:004149F3 59                      pop ecx
:004149F4 7554                    jne 00414A4A
:004149F6 FF750C                  push [ebp+0C]
:004149F9 E8B2430800              call 00498DB0
:004149FE 83F80C                  cmp eax, 0000000C
:00414A01 59                      pop ecx
:00414A02 7446                    je 00414A4A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004149DF(C)
|
:00414A04 8D45B0                  lea eax, dword ptr [ebp-50]
:00414A07 50                      push eax
:00414A08 8D8570FFFFFF            lea eax, dword ptr [ebp+FFFFFF70]
:00414A0E 50                      push eax
:00414A0F E8AC5A0800              call 0049A4C0
:00414A14 59                      pop ecx
:00414A15 85C0                    test eax, eax
:00414A17 59                      pop ecx
:00414A18 7429                    je 00414A43
:00414A1A 8D8530FFFFFF            lea eax, dword ptr [ebp+FFFFFF30]
:00414A20 50                      push eax
:00414A21 8D8570FFFFFF            lea eax, dword ptr [ebp+FFFFFF70]
:00414A27 50                      push eax
:00414A28 E8935A0800              call 0049A4C0----->此CALL為真假碼相比較.
:00414A2D 59                      pop ecx
:00414A2E 85C0                    test eax, eax----->註冊碼相等則EAX==0.
:00414A30 59                      pop ecx
:00414A31 7410                    je 00414A43
:00414A33 C70558C8500001000000    mov dword ptr [0050C858], 00000001---->未註冊標誌.

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0041479C(C), :004147A5(C), :004147BD(C)
|
:00414A3D 33C0                    xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00414A4D(U)
|
:00414A3F 5F                      pop edi
:00414A40 5B                      pop ebx
:00414A41 C9                      leave
:00414A42 C3                      ret
  注意上面這段程式碼,它選擇要比較的註冊碼,此處只比較20位,就是第8,13和最後一位不作比較,形式如下:
                    A A A A A - B B B B B - X X X X X - Y Y Y Y Y
                                  |_________|___________________|
                                 
                                        這三位不作比較.
如果你到此處就收工大吉了的話,那麼恭喜你了! ^O^ 下次起動後它不會叫你註冊了,但是它在關閉的時候會
會把的你的Uedit32.reg給刪掉,再下次的話,你又得.......! 呵呵!
                                       

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046D830(C)
|
:0046D839 66813D28535100D007      cmp word ptr [00515328], 07D0
:0046D842 0F8656010000            jbe 0046D99E
:0046D848 66833D2A53510001        cmp word ptr [0051532A], 0001
:0046D850 0F8648010000            jbe 0046D99E
:0046D856 6854C75000              push 0050C754
:0046D85B 8D4DE4                  lea ecx, dword ptr [ebp-1C]
:0046D85E E8E83E0400              call 004B174B
:0046D863 FF75E4                  push [ebp-1C]
:0046D866 895DFC                  mov dword ptr [ebp-04], ebx
:0046D869 E842B50200              call 00498DB0
:0046D86E A154C85000              mov eax, dword ptr [0050C854]
:0046D873 FF3548C75000            push dword ptr [0050C748]
:0046D879 8945F0                  mov dword ptr [ebp-10], eax
:0046D87C E82FB50200              call 00498DB0
:0046D881 59                      pop ecx
:0046D882 83F80F                  cmp eax, 0000000F----------->檢查註冊碼的位數(>=15).
:0046D885 59                      pop ecx
:0046D886 0F8206010000            jb 0046D992
:0046D88C 391DB4525100            cmp dword ptr [005152B4], ebx--->此處為註冊標誌.
:0046D892 0F85FA000000            jne 0046D992
:0046D898 391DB8525100            cmp dword ptr [005152B8], ebx
:0046D89E 0F84EE000000            je 0046D992
:0046D8A4 0FB645F0                movzx eax, byte ptr [ebp-10]---->計算引數(4D).

* Possible Reference to String Resource ID=00025: "Dos Command"
                                  |
:0046D8A8 6A19                    push 00000019
:0046D8AA 8B3D48C75000            mov edi, dword ptr [0050C748]
:0046D8B0 99                      cdq
:0046D8B1 59                      pop ecx
:0046D8B2 F7F9                    idiv ecx
:0046D8B4 0FBE4716                movsx eax, byte ptr [edi+16]-->註冊碼最後一位.
:0046D8B8 83C241                  add edx, 00000041
:0046D8BB 3BC2                    cmp eax, edx
:0046D8BD 7530                    jne 0046D8EF
:0046D8BF 0FB645F0                movzx eax, byte ptr [ebp-10]

* Possible Reference to String Resource ID=00009: "
This copy of UltraEdit-32 is licensed to :"
|
:0046D8C3 6A09                    push 00000009
:0046D8C5 99                      cdq
:0046D8C6 59                      pop ecx
:0046D8C7 F7F9                    idiv ecx
:0046D8C9 0FBE4707                movsx eax, byte ptr [edi+07]-->註冊碼第8位.
:0046D8CD 83C230                  add edx, 00000030
:0046D8D0 3BC2                    cmp eax, edx
:0046D8D2 751B                    jne 0046D8EF
:0046D8D4 0FB645F0                movzx eax, byte ptr [ebp-10]
:0046D8D8 8A4F0C                  mov cl, byte ptr [edi+0C]------>註冊碼第13位.

* Possible Reference to String Resource ID=00013: "Mod: "
                                  |
:0046D8DB 6A0D                    push 0000000D
:0046D8DD 99                      cdq
:0046D8DE 5F                      pop edi
:0046D8DF F7FF                    idiv edi
:0046D8E1 0FBEC1                  movsx eax, cl
:0046D8E4 83C241                  add edx, 00000041
:0046D8E7 3BC2                    cmp eax, edx
:0046D8E9 0F84A3000000            je 0046D992--------------->這是最後一次機會了!!!

  上面的程式碼則為程式在關閉時最後一次檢測註冊碼,如不等,則幹掉你的Uedit32.reg檔案,使你又變成未
註冊版本,實際上也是它比較起動時沒檢查的三位註冊碼,利用計算引數D(44)分別除以Ox19,Ox9,OxD的餘數
再加上30或41所得的值來作為註冊碼.如何才能在程式關閉時中斷得到上面的程式碼? 呵呵,見到上面的註冊
標誌了麼? 用它設斷就行了.Good Luck!!!

相關文章