SuperDic32的破解

看雪資料發表於2015-11-15

標 題:SuperDic32的破解

發信人:ylw

時 間:2003年9月25日 11:43 

詳細資訊:



《SuperDic32的破解》
【軟體簡介】:超級字典生成器是一個十分好用的字典生成工具,速度很快。不僅可以生成  使用者自定義的字典,還可以對現有的字典進行修改等。
【軟體限制】:不能定義特殊字元,同時還禁止了一些特殊功能。
【破解者】:ylw
【破解工具】:Ollydbg1.09,W32Dasm10,PEid,WinHex
【破解步驟】:
    首先用PEid開啟superdic.exe,分析軟體是否加殼。“Microsoft Visual C++ 6.0”,沒有加殼。
    執行superdic.exe,選擇註冊頁,在註冊密碼處填入“78787878787878787878”(習慣用法)。這時會彈出一對話方塊:“感謝您註冊易優超級字典生成器!!!”,“請重啟本程式,如果您輸入的註冊碼正確,將能使用本軟體的全部功能,並可享受後續版本的免費升級。”
    好了,這就是我們要破解的軟體。在動手之前先要分析問題,這一點很重要,大家別忙著一上來就設斷、跟蹤。從提示資訊可以看出它並不是對輸入的註冊碼立即進行比對,而是在重新啟動軟體時作比對,就象Flash Get的手法一樣。當然它肯定先把申請號和註冊密碼放在某個地方,以便再次啟動時進行讀取。本軟體是將註冊碼及申請號放在登錄檔HKEY_CURRENT_USERSoftwareEUsoftsuperdic中,這方面可以用FileMon和RegMon來跟蹤,我是用Ollydbg跟蹤得到的,跟蹤過程就不寫啦!大家可以自己試一下。
    開始我認為它在啟動時要讀取登錄檔,於是就下斷點在RegQueryValueExA和RegOpenKeyA,沒想到這個軟體對登錄檔的呼叫是如此頻繁,以至於我不可能一個一個的進行篩選。參照破Flash Get的方法使用W32Dasm,在W32Dasm中查詢字串:“user”和“password”,很快有了結果。0040197D (user)、0040199D(password)這兩個地址是在你點選註冊按鈕後寫入登錄檔時用到的,這是前面跟蹤得到的結果。既然上面的程式碼是把註冊碼寫入登錄檔中,那麼它肯定還有一段程式碼是申請號和註冊碼從登錄檔中讀出來的,於是我繼續向下查詢,果然又找到了00401A2B(user)和00401A5E(password)。
    用Ollydbg載入superdic.exe,在00401A2B處設斷,執行後,中斷在00401A2B,按F8單步執行至004030B7,此處將申請號壓入棧後呼叫Call,有點可疑應該查一下,跟進後執行至0040280D,此時EAX中為申請號,並壓入棧,繼續跟進,在0040273A處跟進,原因是分析這裡的程式碼只有這個Call起主要作用。跟蹤到0040276E,這個Call的作用是將從地址0012EFAC開始寫入0123456789ABCDEFFEDCBA9876543210(不是字串),可能是用來幫助生成註冊碼的,記下來。在00401C50處跟下去(跟蹤的詳細過程就不寫了,只寫主要的地方),你會發現EAX:67452301,EBX:98BADCFE,EBP:10325476,EDI:EFCDAB89,這正是前面見到的可疑串。接下來的Call 004025D0將地址0012EFC4開始的64個長的內容寫到0012EEEC處(後面算註冊碼時用),從這個Call返回後(圖五),從00401C7B―0040257F這一大段程式碼為註冊碼的生成過程,大家跟蹤到這裡可以看到有大量的邏輯運算和移位運算,我對加密演算法瞭解很少,也許是軟體作者自創的演算法。限於篇幅在此不詳細分析,大家在實踐時要仔細分析。
    Call 00402760將一串字元“a8f57789bf462d48b31fafb13347499e”寫到以0012F031開始的地址,若想寫序號產生器,就得跟進去仔細分析,這裡將這一段省略。
    繼續走到00402818(這是跟進來的),在這裡將會對上述字串進行處理,每隔一個取一個進行判斷,若是數字,則減30存入EDI所指的地址;若非數字,則減56存入EDI所指的地址。EDI從0012F058開始以4遞增,ESI每次遞增1,結束迴圈條件是ESI不小於10(十進位制為16)。
    在接下來的0040286E處的迴圈及004028BC處的迴圈對資料進行處理,在0012F114處寫入“LngNr9YXp4WPyryk”,程式碼如下:
0040286E  |> 8BD1                 MOV EDX,ECX
00402870  |. 81E2 0F000080              AND EDX,8000000F
00402876  |. 79 05                JNS SHORT superdic.0040287D
00402878  |. 4A                   DEC EDX
00402879  |. 83CA F0              OR EDX,FFFFFFF0
0040287C  |. 42                   INC EDX
0040287D  |> 8BC7                 MOV EAX,EDI
0040287F  |. 83C1 5B              ADD ECX,5B
00402882  |. 0FAF06               IMUL EAX,DWORD PTR DS:[ESI]
00402885  |. 83C6 04              ADD ESI,4
00402888  |. 8D1CC5 0000000>         LEA EBX,DWORD PTR DS:[EAX*8]
0040288F  |. 2BD8                  SUB EBX,EAX
00402891  |. 8D1C98               LEA EBX,DWORD PTR DS:[EAX+EBX*4]
00402894  |. 8B4494 48            MOV EAX,DWORD PTR SS:[ESP+EDX*4+48]
00402898  |. 03C3                 ADD EAX,EBX
0040289A  |. BB 3D000000                MOV EBX,3D
0040289F  |. 99                   CDQ
004028A0  |. F7FB                 IDIV EBX
004028A2  |. 47                   INC EDI
004028A3  |. 81F9 B0050000             CMP ECX,5B0
004028A9  |. 8956 FC              MOV DWORD PTR DS:[ESI-4],EDX
004028AC  |.^7C C0                JL SHORT superdic.0040286E
004028AE  |. 8BB424 D400000>              MOV ESI,DWORD PTR SS:[ESP+D4]
004028B5  |. 33C9                 XOR ECX,ECX
004028B7  |. 8D5424 48              LEA EDX,DWORD PTR SS:[ESP+48]
004028BB  |. 5B                   POP EBX
004028BC  |> 8B02                 MOV EAX,DWORD PTR DS:[EDX]
004028BE  |. 83F8 19              CMP EAX,19
004028C1  |. 7F 08                JG SHORT superdic.004028CB
004028C3  |. 85C0                 TEST EAX,EAX
004028C5  |. 7C 04                JL SHORT superdic.004028CB
004028C7  |. 04 41               ADD AL,41
004028C9  |. EB 1E                JMP SHORT superdic.004028E9
004028CB  |> 83F8 23              CMP EAX,23
004028CE  |. 7F 0B                JG SHORT superdic.004028DB
004028D0  |. 83F8 1A              CMP EAX,1A
004028D3  |. 7C 06                JL SHORT superdic.004028DB
004028D5  |. 8A02                 MOV AL,BYTE PTR DS:[EDX]
004028D7  |. 04 16                ADD AL,16
004028D9  |. EB 0E                JMP SHORT superdic.004028E9
004028DB  |> 83F8 3D              CMP EAX,3D
004028DE  |. 7D 0C                JGE SHORT superdic.004028EC
004028E0  |. 83F8 24              CMP EAX,24
004028E3  |. 7C 07                JL SHORT superdic.004028EC
004028E5  |. 8A02                 MOV AL,BYTE PTR DS:[EDX]
004028E7  |. 04 3D                ADD AL,3D
004028E9  |> 880431               MOV BYTE PTR DS:[ECX+ESI],AL
004028EC  |> 41                   INC ECX
004028ED  |. 83C2 04              ADD EDX,4
004028F0  |. 83F9 10              CMP ECX,10
004028F3  |.^7C C7                JL SHORT superdic.004028BC
    進一步跟蹤到00402935處,注意這裡將是對輸入的密碼進行處理,此處有一比較操作:CMP  ECX,14  所以我在輸入註冊碼時輸入了20(十六進位制的14)位數。
00402935  |. 83F9 14              CMP ECX,14 <---------------------------------註冊碼最好為20位。
00402938  |. 74 03                JE SHORT superdic.0040293D
0040293A  |. 8845 00              MOV BYTE PTR SS:[EBP],AL
0040293D  |> 33D2                 XOR EDX,EDX
0040293F  |. 8D4C24 08            LEA ECX,DWORD PTR SS:[ESP+8]
00402943  |> 8A042A               MOV AL,BYTE PTR DS:[EDX+EBP]
00402946  |. 3C 39                CMP AL,39
00402948  |. 7F 0C                JG SHORT superdic.00402956
0040294A  |. 3C 30                CMP AL,30
0040294C  |. 7C 08                JL SHORT superdic.00402956
0040294E  |. 0FBEC0               MOVSX EAX,AL
00402951  |. 83E8 16              SUB EAX,16
00402954  |. EB 1E                JMP SHORT superdic.00402974
00402956  |> 3C 7A                CMP AL,7A
00402958  |. 7F 0C                JG SHORT superdic.00402966
0040295A  |. 3C 61                CMP AL,61
0040295C  |. 7C 08                JL SHORT superdic.00402966
0040295E  |. 0FBEC0               MOVSX EAX,AL
00402961  |. 83E8 3D              SUB EAX,3D
00402964  |. EB 0E                JMP SHORT superdic.00402974
00402966  |> 3C 5A                CMP AL,5A
00402968  |. 7F 0C                JG SHORT superdic.00402976
0040296A  |. 3C 41                CMP AL,41
0040296C  |. 7C 08                JL SHORT superdic.00402976
0040296E  |. 0FBEC0               MOVSX EAX,AL
00402971  |. 83E8 41              SUB EAX,41
00402974  |> 8901                 MOV DWORD PTR DS:[ECX],EAX
00402976  |> 42                   INC EDX
00402977  |. 83C1 04              ADD ECX,4
0040297A  |. 83FA 14              CMP EDX,14
0040297D  |.^7C C4                JL SHORT superdic.00402943
    仔細分析此處程式碼,若為數字,則減16,存入[ECX](表示ECX中的內容,此處為地址值);若為小寫字母,則減3D,存入[ECX];若為大寫字母,則減41,存入[ECX]。ECX從0012F088開始以4遞增,EDX每迴圈一次加1,迴圈結束條件是EDX不小於14(十進位制為20)。
    執行到00402A13( 省略了一些中間過程)時,註冊碼的前16位已被處理為“78787s787CHKP8X0”,繼續跟蹤,此時將進入最後的比較階段,勝利在望。
    執行到004030C8,004030C8―00403124為比較過程,經實驗跳向004031AC會失敗,跳向00403130就會成功。看到這裡,你肯定知道如何爆破了,我就不再多說了。其實透過對前面程式碼的分析,我們已經可以寫出其序號產生器,前面有些步驟省略了,大家自己試一下吧!
  “CRACKER最關心的是程式的保護方式和加密思想及其可能存在的漏洞。”雖然爆破比較簡單,但不是最終目的。我覺得還是做出序號產生器好,那樣不僅可以瞭解程式碼的執行以及學習軟體作者的方法,而且對自己也是個很好的鍛鍊,可以積累程式設計經驗。我剛學破解,經驗不足,如有錯誤還請諸位指正,謝謝!

相關文章