HEdit 2.0 的註冊破解過程 <<-------可能過時了高手末入 (8千字)

看雪資料發表於2001-02-23

HEdit 2.0 的註冊破解過程
    Hedit 2.0 by Yuri Software
    cracck by PcRocker(本文不得用於任何商業用途,轉載時請保持完整性)
   
    功能:      檔案編輯器
    最新版本:  不詳
    下載地址:  不詳

    最近的破解沒什麼進展,主要是碰到的APP都是用上網註冊的方式,很難找到註冊碼,頭都大了 :-(
    無奈之下,只有挑軟柿子捏了,大家不要笑我。

    給程式打補丁當然少不了檔案編輯器,如果你只為修改檔案HEdit是相當好用的:優點是程式本身很小,不管檔案有多大,開啟的都非常快;缺點是執行一次以後,它會將自己作為所有的無程式關聯檔案的預設開啟方式。
    破解工具是SOFT-ICE,寫手記的工具嘛當然是 W32DASM。


    該APP的試用期到了之後,啟動時出現過期的對話方塊,要求輸入註冊碼,當註冊資訊錯誤時,就告訴你錯啦(還好,一聲不響的讓人心裡沒底)。話不多說,開始。

    在S―ICE中下 BPX MESSAGEBOXA,註冊失敗後按3次F12攔截如下:


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405047(C)
|
:00405064 B801000000              mov eax, 00000001
:00405069 5E                      pop esi
:0040506A C3                      ret


:0040506B 56                      push esi            <---- 這種“天外飛仙”的呼叫好象經常出現
:0040506C 57                      push edi
:0040506D 8BF1                    mov esi, ecx
:0040506F E808AE0200              call 0042FE7C
:00405074 8B7804                  mov edi, dword ptr [eax+04]
:00405077 6A01                    push 00000001
:00405079 8BCE                    mov ecx, esi
:0040507B E870890100              call 0041D9F0
:00405080 85C0                    test eax, eax
:00405082 7435                    je 004050B9
:00405084 FF7660                  push [esi+60]
:00405087 FF765C                  push [esi+5C]
:0040508A 8BCF                    mov ecx, edi
:0040508C E82DEFFFFF              call 00403FBE        <---- 這個CALL是關鍵,看下面的分析
:00405091 85C0                    test eax, eax        <---- EAX=0 表示失敗,比較少見
:00405093 7510                    jne 004050A5        <---- 如果不跳,讓你死的好看
:00405095 6AFF                    push FFFFFFFF
:00405097 6A00                    push 00000000

* Possible Reference to Dialog: DialogID_0088
                                  |

* Possible Reference to String Resource ID=00136: "The user name and/or registration number you entered are inc"
                                  |
:00405099 6888000000              push 00000088
:0040509E E8BCFC0100              call 00424D5F        <---- 顯示出錯的訊息框
:004050A3 EB14                    jmp 004050B9        <---- 你會停在這裡

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405093(C)
|
:004050A5 FF7660                  push [esi+60]
:004050A8 FF765C                  push [esi+5C]
:004050AB 8BCF                    mov ecx, edi
:004050AD E8CFEEFFFF              call 00403F81
:004050B2 8BCE                    mov ecx, esi
:004050B4 E86A5A0100              call 0041AB23

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00405082(C), :004050A3(U)
|
:004050B9 5F                      pop edi
:004050BA 5E                      pop esi
:004050BB C3                      ret


這裡是計算與比較註冊碼的 call 403FBE:

* Referenced by a CALL at Addresses:
|:00403A3D  , :00403CDE  , :00403E07  , :0040508C 
|
:00403FBE 55                      push ebp
:00403FBF 8BEC                    mov ebp, esp
:00403FC1 81EC00010000            sub esp, 00000100
:00403FC7 6800010000              push 00000100
:00403FCC 8D8D00FFFFFF            lea ecx, dword ptr [ebp+FFFFFF00]
:00403FD2 FF7508                  push [ebp+08]
:00403FD5 51                      push ecx
:00403FD6 E8054F0000              call 00408EE0            <---- 將註冊姓名放在 [EBP-100]
:00403FDB 83C40C                  add esp, 0000000C            <---- 到[EBP]的剩餘位元組以 00 填充
:00403FDE 8D8D00FFFFFF            lea ecx, dword ptr [ebp+FFFFFF00]
:00403FE4 51                      push ecx
:00403FE5 E856200100              call 00416040            <---- 將註冊姓名轉為大寫,見下面
:00403FEA 83C404                  add esp, 00000004
:00403FED B904000000              mov ecx, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404015(C)
|
:00403FF2 8BC1                    mov eax, ecx
:00403FF4 41                      inc ecx
:00403FF5 99                      cdq                <---- 相當於 MOV EDX,00
:00403FF6 33C2                    xor eax, edx            <----
:00403FF8 2BC2                    sub eax, edx            <----         
:00403FFA 83E003                  and eax, 00000003            <---- 這幾個語句使EAX按順序取0、1、2、3
:00403FFD 33C2                    xor eax, edx            <----
:00403FFF 2BC2                    sub eax, edx            <----
:00404001 8A940DFFFEFFFF          mov dl, byte ptr [ebp+ecx-00000101]    <---- 從第五個位元組開始取一個位元組
:00404008 30940500FFFFFF          xor byte ptr [ebp+eax-00000100], dl    <---- 與前四個位元組中的一個取異或
:0040400F 81F900010000            cmp ecx, 00000100            <---- 註冊姓名最長為255個位元組
:00404015 7CDB                    jl 00403FF2
:00404017 8B8500FFFFFF            mov eax, dword ptr [ebp+FFFFFF00]    <---- 結果送EAX
:0040401D 85C0                    test eax, eax
:0040401F 7D02                    jge 00404023
:00404021 F7D8                    neg eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040401F(C)
|
:00404023 39450C                  cmp dword ptr [ebp+0C], eax        <---- 與輸入的數字簡單的比較
:00404026 7509                    jne 00404031
:00404028 85C0                    test eax, eax
:0040402A B801000000              mov eax, 00000001
:0040402F 7502                    jne 00404033

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404026(C)
|
:00404031 33C0                    xor eax, eax            <---- EAX=0 就錯了

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040402F(C)
|
:00404033 8BE5                    mov esp, ebp
:00404035 5D                      pop ebp
:00404036 C20800                  ret 0008


這個CALL是將小寫字母轉為大寫,彙編很熟的就略過吧。

* Referenced by a CALL at Address:
|:00403FE5 
|
:00416040 83EC04                  sub esp, 00000004
:00416043 53                      push ebx
:00416044 56                      push esi
:00416045 57                      push edi
:00416046 55                      push ebp
:00416047 33ED                    xor ebp, ebp
:00416049 392D984C4400            cmp dword ptr [00444C98], ebp
:0041604F 752C                    jne 0041607D
:00416051 8B5C2418                mov ebx, dword ptr [esp+18]
:00416055 8BC3                    mov eax, ebx
:00416057 803B00                  cmp byte ptr [ebx], 00        <---- 註冊姓名是否為空
:0041605A 7417                    je 00416073

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00416071(C)
|
:0041605C 8A08                    mov cl, byte ptr [eax]
:0041605E 80F961                  cmp cl, 61                <---- 61 is 'a'
:00416061 7C0A                    jl 0041606D
:00416063 80F97A                  cmp cl, 7A                <---- 7a is 'z'
:00416066 7F05                    jg 0041606D
:00416068 80E920                  sub cl, 20
:0041606B 8808                    mov byte ptr [eax], cl

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00416061(C), :00416066(C)
|
:0041606D 40                      inc eax
:0041606E 803800                  cmp byte ptr [eax], 00
:00416071 75E9                    jne 0041605C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041605A(C)
|
:00416073 8BC3                    mov eax, ebx
:00416075 5D                      pop ebp
:00416076 5F                      pop edi
:00416077 5E                      pop esi
:00416078 5B                      pop ebx
:00416079 83C404                  add esp, 00000004
:0041607C C3                      ret

    用我名字的註冊碼----name:pcrocker(與大小寫無關)code:488048659
    該APP的註冊支援一個位元組:如‘a’<-----> 65,也支援漢字:‘我愛你’<-----> 1364184822(誰的手機號*_*)


    原理清楚後,寫序號產生器就很容易,我這裡WINDOWS下的編輯器只有VB,可惜我不願用也不會用,哪位有興趣就寫出序號產生器。

    感覺採用這種註冊形式的APP比較憨厚,最容易CRACCK,不要破的太過分。

                                                時間:2000-02-23

相關文章