Visual CHM 4.0的演算法“特別破解” (8千字)

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

標 題:Visual CHM 4.0的演算法“特別破解” (8千字)

發信人:NewHand 

時 間:2004-02-10 16:48:48

詳細資訊:



Visual CHM 4.0的演算法“特別破解”

【軟體名稱】:Visual CHM 4.0

【軟體簡介】:執行於多種 Windows 平臺,包括 Windows 95/98/Me/NT 4.0/2000/XP。一款不錯的CHM製作和反編譯於一身的利器! 
              Features of Visual CHM:

                Compile and decompile HTML help files 

                Add a batch of HTML files at one time 

                Integrate with windows explorer 

                WYSIWYG (What you see is what you get)

                Easily edit HTML files
                Support multiple language (Include English, Chinese, German, Spanish, and more)
【軟體大小】:1570 KB    主程式:407KB

【軟體主頁】:http://www.wekasoft.com/vchm

    【作者】:NewHand[BCG]

【作者宣告】:只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教! 

【除錯環境】:Win98、OllDBG、PEiD、Aspackdie1.4

――――――――――――――――――――――――――――――――― 
【過程】: 請出PEiD,偵得是Aspack,那就先用Aspackdie1.4脫殼,雖然手脫很容易,但用此工具脫會C身些!會知編寫語言是:Borland Delphi 6.0 - 7.0,軟體說有編輯15個標題的限制,就執行軟體試試,然後知道軟體在你匯入編輯標題時進行數量統計,如你沒註冊,則統計到數量為16時就彈出提示;若你註冊假碼則不會提示你。並且“編譯”的選單和按鈕會變灰,在Language的中文.ini裡發現:
[RegForm]
Caption=註冊
LabelReg.Caption=註冊成功!
Label1.Caption=機器碼:
Label2.Caption=使用者名稱:
Label3.Caption=註冊碼:
ButtonOK.Caption=確定
ButtonCancel.Caption=退出
ButtonBuyNow.Caption=購買
ButtonBuyNow.Hint=線上時點選
Error=使用者名稱的長度必須在 6 到 32 個字元之間!
Over=請重新啟動本軟體,檢查註冊!

Dede的使用我還不行,好了就用OD調戲它!
既然“匯入編輯標題時進行數量統計,如你沒註冊,則統計到數量為16時就彈出提示”,即有會使用Messageboxa對話方塊函式:有了OD,又豈用在這函式下斷,用OD載入主程式或Attach它,匯入標題,使其彈出提示對話方塊,然後在OD裡暫停並在當前指令下斷點,回主程式點“確定”,會提示OD攔截成功,點return按鈕或“Ctrl+F9”,按一下F8,是否返回了主程式領空?爽嗎?那麼你會想到判斷的地方多數在附近吧,於是你就要向上翻找找Cmp register,(fh,10h)+Jmp類的指令了,懷疑的就斷來看看改改的^_^
改了(參:☆★☆:***爆破①)後就是為了避開檢測註冊資訊同時也使程式省省力氣--太過疲勞不好^_^;再來驗證是否成功了,結果是“編譯”按鈕和選單沒再變灰,但點“編譯”時標題的數量在某程度上會不工作,呵呵,看來是有暗樁的,有人說Delph程式很清晰條理,果然,我們查詢一下“字串參考”,看看有沒有“Compile”的傢伙,發現了嗎:
004E3577   .  68 2C394E00   PUSH VCHM.004E392C                         ASCII "Start Building ... "
004E357C   .  8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
004E357F   .  50            PUSH EAX
004E3580   .  A1 00164F00   MOV EAX,DWORD PTR DS:[4F1600]
004E3585   .  8B00          MOV EAX,DWORD PTR DS:[EAX]
004E3587   .  B9 48394E00   MOV ECX,VCHM.004E3948                      ASCII "BeginCompile"
004E358C   .  BA 60394E00   MOV EDX,VCHM.004E3960                      ASCII "MainForm"
同樣也是向上找找一些關鍵的比較、跳轉作分析,然後跟蹤看看改改的^_^(參:☆★☆:***爆破②),你也完全可以在點按下“編譯”前,下斷一些你認為能夠中斷的函式……進行你自己的跟蹤^_^

輸入的“使用者名稱:”和“註冊碼:”只檢測使用者名稱長度,並會分別儲存到登錄檔"SoftWare\XgSoft\Visual CHM 3.0\"的"Email"和"RegisterCode",在重啟才計算註冊碼和使用者名稱》
004D46A9  |.  E8 1628FAFF   CALL VCHM.00476EC4
004D46AE  |.  B1 01         MOV CL,1
004D46B0  |.  BA 28484D00   MOV EDX,VCHM.004D4828                      ASCII "SoftWare\XgSoft\Visual CHM 3.0\"
……
004D46ED  |.  83F8 21       CMP EAX,21
004D46F0  |.  7E 2B         JLE SHORT VCHM.004D471D
004D46F2  |>  68 50484D00   PUSH VCHM.004D4850                         ASCII "The length of the user name must range from 6 to 32"
……
004D4755  |. /74 26         JE SHORT VCHM.004D477D                     
004D4757  |> |68 B0484D00   PUSH VCHM.004D48B0                         ASCII "Please restart the progamme and make sure of the successful registration !"

004D40BB  |.  BA F0434D00   MOV EDX,VCHM.004D43F0                      ASCII "RegForm"
004D40C0  |.  8BC3          MOV EAX,EBX                                註冊對話方塊標題
……
004D40E1  |.  B1 01         MOV CL,1                                   下面是對“註冊對話方塊”輸入內容進行讀取
004D40E3  |.  BA 00444D00   MOV EDX,VCHM.004D4400                      ASCII "SoftWare\XgSoft\Visual CHM 3.0\"
004D40E8  |.  8BC6          MOV EAX,ESI
004D40EA  |.  E8 392EFAFF   CALL VCHM.00476F28
004D40EF  |.  8D4D FC       LEA ECX,DWORD PTR SS:[EBP-4]
004D40F2  |.  BA 28444D00   MOV EDX,VCHM.004D4428                      ASCII "Email"
……
004D4107  |.  E8 80B8F7FF   CALL VCHM.0044F98C
004D410C  |.  8D4D F8       LEA ECX,DWORD PTR SS:[EBP-8]
004D410F  |.  BA 38444D00   MOV EDX,VCHM.004D4438                      ASCII "RegisterCode"

004E3071   .  8338 00       CMP DWORD PTR DS:[EAX],0                   是否匯入了*.VCM
004E3074   .  75 10         JNZ SHORT VCHM.004E3086
004E3076   .  8B15 70144F00 MOV EDX,DWORD PTR DS:[4F1470]              VCHM.004F2C3C
004E307C   .  8B12          MOV EDX,DWORD PTR DS:[EDX]
004E307E   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
004E3081   .  E8 3EAEFFFF   CALL VCHM.004DDEC4                         詢問儲存位置和型別
004E3086   >  A1 04124F00   MOV EAX,DWORD PTR DS:[4F1204]
004E308B   .  8338 00       CMP DWORD PTR DS:[EAX],0                   是否點按了“取消”
004E308E   .  0F84 21080000 JE VCHM.004E38B5
--往後有一段段驗證算碼的,呵呵這裡就不貼了……

☆★☆:
多次跟蹤,發現重啟只對註冊碼和使用者名稱進行計算,而不作比較,驗證會放在匯入標題數目過15、點選“編譯”標題數目超過52項、和開啟註冊對話方塊。
那麼光解除功能限制,只需爆破兩處地方:
004E430A  |.  83F8 10       CMP EAX,10                                 限制編譯15個標題跳向驗證的地方
004E430D  |.  7D 34         JGE SHORT VCHM.004E4343                    ***爆破①:將這句指令改成nop***

004E3433   .  83F8 34       CMP EAX,34                                 比較是否超過 52 項跳向驗證的地方
004E3436   .  7E 0A         JLE SHORT VCHM.004E3442                    ***爆破②:將Jle改成Jmp***
004E3438   .  807D EF 00    CMP BYTE PTR SS:[EBP-11],0                 [EBP-11]=[77FA23]值關鍵比較之一

004E335A      32C0          XOR AL,AL                                  ***爆破②:關鍵點之一 改成XOR AL,DL***
004E335C   .  74 04         JE SHORT VCHM.004E3362
004E335E   >  33C0          XOR EAX,EAX
004E3360   .  EB 02         JMP SHORT VCHM.004E3364
004E3362   >  B0 01         MOV AL,1                                   標誌位之一
004E3364   >  8845 EF       MOV BYTE PTR SS:[EBP-11],AL

★☆★:
改演算法(有侷限性:只支援等於10位長度的使用者名稱):
由於計碼實在太長,要看個清清楚楚明明白白實在折磨人(烤你耐性),有機會再搞出來,偶只是找出生成關鍵比較碼的某地方!
004E6F5D  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]                 啟動檢測
004E6F5F  |.  BA EC874E00   MOV EDX,VCHM.004E87EC                      ASCII "Email"
004E6F64  |.  E8 B702F9FF   CALL VCHM.00477220
004E6F69  |.  8B85 28FEFFFF MOV EAX,DWORD PTR SS:[EBP-1D8]             使用者名稱
……往後有一大段檢測和算碼的,這裡就不貼了……
004E771E  |.  E8 B1D9F1FF   |CALL VCHM.004050D4
004E7723  |.  885C30 FF     |MOV BYTE PTR DS:[EAX+ESI-1],BL            ***這裡產生最終之一計算使用者名稱(與使用者名稱長度相等)關鍵比較碼的地方***
……
004E7B26  |.  E8 A9D5F1FF   |CALL VCHM.004050D4
004E7B2B  |.  8B55 E0       |MOV EDX,DWORD PTR SS:[EBP-20]
004E7B2E  |.  885C10 FF     |MOV BYTE PTR DS:[EAX+EDX-1],BL            ***這裡生成10位關鍵對比碼的地方 ***

在驗證比較時,會取和,如果的長度不為10,就會再度進行計算,這會令比較碼又變來變去了,但好像始終沒變,呵呵,偶就想了個偷懶的辦法(使用者名稱要求必須10位長度,使用者名稱、註冊碼任意!)

……
004E770C      83FB 61       CMP EBX,61                                 改成:"MOV BL,41"+"Nop"
004E770F      7D 05         JGE SHORT VCHM.004E7716                    改成:JMP SHORT 004E7716
……
004E7AD5      48            DEC EAX                                    改成:Nop去
004E7AD6      83F8 00       CMP EAX,0
004E7AD9  |.  7C 60         JL SHORT VCHM.004E7B3B
……
004E7B14      83FB 61       CMP EBX,61                                 改成: "MOV BL,41"+"Nop"
004E7B17      7D 05         JGE SHORT VCHM.004E7B1E                    改成: JMP SHORT 004E7B1E

這樣改了:輸入特定長度使用者名稱後重啟開啟註冊對話方塊時,就發現了“註冊成功!”字樣和“購買”按鈕不見了,同時註冊填寫處鎖死了、功能開放了,應該跟真正註冊差不多吧!

相關文章