推箱子V2.5完美破解法

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

學習了Win32Asm彙編,終覺心癢癢,拿幾個程式開刀玩玩,這只是個人心得,寫得不好請不要笑本生。
此前破了幾個程式,計有玄奧四柱推命V3.2、紫微斗數V3.5、起名嚮導V5.3、ACCESS 密碼剋星、
Filter Solutions Ver 10.0濾波器設計、Smith V2.01史密斯圓圖工具,此次又拿蔣剛的推箱子
V2.5開刀(主要看不慣“禁止破解,否則後果自負!”字樣),先前看過CrackerABC[BCG]的推
箱子V1.9的破解,終覺不完美,現寫出我的破解方法供參考。
此程式有自校驗,採用暴破法還需破掉自校驗程式碼。為此我採用完美破解法,即不修改原程式。
用IDA反彙編後分析,找出讀檔案的地方,發現讀cargador.cfg檔案的地方比較可疑(這裡用
Ollydbg反彙編代替)。
0040162A  |. B8 38244000    MOV EAX,cargador.00402438           ;  ASCII "cargador.cfg"
0040162F  |. E8 D4A20500    CALL cargador.0045B908
00401634  |. 84C0           TEST AL,AL
00401636  |. 0F84 75010000  JE cargador.004017B1    ; 如果AL=0則檔案不存在
好,在磁碟上程式執行目錄建立一cargador.cfg長度為10個位元組的二進位制檔案(全部填充FF),再執行程式,
提示檔案已經end of file。
用Ollydbg跟蹤,到
0040165F  |. C745 FC 010000>MOV DWORD PTR SS:[EBP-4],1    ; 存放讀取位元組初值
00401666  |> 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00401669  |> 8D9405 C4FCFFF>LEA EDX,DWORD PTR SS:[EBP+EAX-33C]
00401670  |. B8 88744A00    MOV EAX,OFFSET cargador.@Regist@SaveFile
00401675  |. E8 7A380600    CALL cargador.00464EF4    ; 讀檔案
0040167A  |. E8 290D0600    CALL cargador.004623A8    ; 檢查異常
0040167F  |. FF45 FC        INC DWORD PTR SS:[EBP-4]    ; 下一個位元組
00401682  |. 817D FC 010200>CMP DWORD PTR SS:[EBP-4],201  ; 讀取201H-1個位元組
00401689  |.^75 DB          JNZ SHORT cargador.00401666
0040168B  |. C745 FC 010000>MOV DWORD PTR SS:[EBP-4],1
00401692  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
00401695  |. 8D9405 C4FCFFF>|LEA EDX,DWORD PTR SS:[EBP+EAX-33C]
0040169C  |. B8 88744A00    |MOV EAX,OFFSET cargador.@Regist@SaveFil>
004016A1  |. E8 4E380600    |CALL cargador.00464EF4
004016A6  |. E8 FD0C0600    |CALL cargador.004623A8
004016AB  |. FF45 FC        |INC DWORD PTR SS:[EBP-4]
004016AE  |. 837D FC 11     |CMP DWORD PTR SS:[EBP-4],11  ; 讀取11H-1個位元組
004016B2  |.^75 DE          \JNZ SHORT cargador.00401692
004016B4  |. C745 FC 010000>MOV DWORD PTR SS:[EBP-4],1
004016BB  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
004016BE  |. 8D90 E3754A00  |LEA EDX,DWORD PTR DS:[EAX+4A75E3]
004016C4  |. B8 88744A00    |MOV EAX,OFFSET cargador.@Regist@SaveFil>
004016C9  |. E8 26380600    |CALL cargador.00464EF4    ; 注意這個迴圈有兩次讀檔案!
004016CE  |. E8 D50C0600    |CALL cargador.004623A8
004016D3  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]
004016D6  |. 8D9405 C4FCFFF>|LEA EDX,DWORD PTR SS:[EBP+EAX-33C]
004016DD  |. B8 88744A00    |MOV EAX,OFFSET cargador.@Regist@SaveFil>
004016E2  |. E8 0D380600    |CALL cargador.00464EF4
004016E7  |. E8 BC0C0600    |CALL cargador.004623A8
004016EC  |. FF45 FC        |INC DWORD PTR SS:[EBP-4]
004016EF  |. 837D FC 05     |CMP DWORD PTR SS:[EBP-4],5    ; 讀取2*(5-1)個位元組
004016F3  |.^75 C6          \JNZ SHORT cargador.004016BB
004016F5  |. C745 FC 010000>MOV DWORD PTR SS:[EBP-4],1
004016FC  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
004016FF  |. 8D9405 C4FCFFF>|LEA EDX,DWORD PTR SS:[EBP+EAX-33C]
00401706  |. B8 88744A00    |MOV EAX,OFFSET cargador.@Regist@SaveFil>
0040170B  |. E8 E4370600    |CALL cargador.00464EF4
00401710  |. E8 930C0600    |CALL cargador.004623A8
00401715  |. FF45 FC        |INC DWORD PTR SS:[EBP-4]
00401718  |. 837D FC 09     |CMP DWORD PTR SS:[EBP-4],9    ; 讀取9-1個位元組
0040171C  |.^75 DE          \JNZ SHORT cargador.004016FC
0040171E  |. C745 FC 010000>MOV DWORD PTR SS:[EBP-4],1
00401725  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
00401728  |. 8D90 E7754A00  |LEA EDX,DWORD PTR DS:[EAX+4A75E7]
0040172E  |. B8 88744A00    |MOV EAX,OFFSET cargador.@Regist@SaveFil>
00401733  |. E8 BC370600    |CALL cargador.00464EF4
00401738  |. E8 6B0C0600    |CALL cargador.004623A8
0040173D  |. FF45 FC        |INC DWORD PTR SS:[EBP-4]
00401740  |. 837D FC 07     |CMP DWORD PTR SS:[EBP-4],7    ; 讀取7-1個位元組
00401744  |.^75 DF          \JNZ SHORT cargador.00401725
00401746  |. C745 FC 010000>MOV DWORD PTR SS:[EBP-4],1
0040174D  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
00401750  |. 8D9405 C4FCFFF>|LEA EDX,DWORD PTR SS:[EBP+EAX-33C]
00401757  |. B8 88744A00    |MOV EAX,OFFSET cargador.@Regist@SaveFil>
0040175C  |. E8 93370600    |CALL cargador.00464EF4
00401761  |. E8 420C0600    |CALL cargador.004623A8
00401766  |. FF45 FC        |INC DWORD PTR SS:[EBP-4]
00401769  |. 837D FC 0B     |CMP DWORD PTR SS:[EBP-4],0B  ; 讀取0BH-1個位元組
0040176D  |.^75 DE          \JNZ SHORT cargador.0040174D
0040176F  |. C745 FC 010000>MOV DWORD PTR SS:[EBP-4],1
00401776  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
00401779  |. 8D9405 C4FCFFF>|LEA EDX,DWORD PTR SS:[EBP+EAX-33C]
00401780  |. B8 88744A00    |MOV EAX,OFFSET cargador.@Regist@SaveFil>
00401785  |. E8 6A370600    |CALL cargador.00464EF4
0040178A  |. E8 190C0600    |CALL cargador.004623A8
0040178F  |. FF45 FC        |INC DWORD PTR SS:[EBP-4]
00401792  |. 817D FC 010200>|CMP DWORD PTR SS:[EBP-4],201  ; 讀取201H-1個位元組
00401799  |.^75 DB          \JNZ SHORT cargador.00401776
.
.
.
(201H-1)+(11H-1)+(2*(5-1))+(9-1)+(7-1)+(0B-1)+(201-1)=430H=1072D
好,將cargador.cfg檔案數增加到1072個位元組(全部填FF),再試,OK。

繼續往下走可看見
00401EEA  |> C605 84744A00 >MOV BYTE PTR DS:[@Regist@Registered],0
搜尋字元@Regist@Registered來到
00402087  |. C685 CCFEFFFF >MOV BYTE PTR SS:[EBP-134],0
0040208E  |. C605 84744A00 >MOV BYTE PTR DS:[@Regist@Registered],1 ; 先置為成功
00402095  |. A1 80744A00    MOV EAX,DWORD PTR DS:[@Regist@Reg_Form]
0040209A  |. 8B80 F4020000  MOV EAX,DWORD PTR DS:[EAX+2F4]
004020A0  |. C740 0C 020000>MOV DWORD PTR DS:[EAX+C],2
004020A7  |. C745 FC 010000>MOV DWORD PTR SS:[EBP-4],1
004020AE  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
004020B1  |. 8A8405 C5FEFFF>|MOV AL,BYTE PTR SS:[EBP+EAX-13B]
004020B8  |. 8B55 FC        |MOV EDX,DWORD PTR SS:[EBP-4]
004020BB  |. 3A8415 2AFFFFF>|CMP AL,BYTE PTR SS:[EBP+EDX-D6]  ; 與0012ADB7處的內容比較
004020C2  |. 74 23          |JE SHORT cargador.004020E7    ; 不等就完蛋
                ; (@Regist@Registered=0)
004020C4  |. C605 84744A00 >|MOV BYTE PTR DS:[@Regist@Registered],0
004020CB  |. C605 EE754A00 >|MOV BYTE PTR DS:[@Regist@ReadReg],0
004020D2  |. A1 80744A00    |MOV EAX,DWORD PTR DS:[@Regist@Reg_Form]
004020D7  |. 8B80 F4020000  |MOV EAX,DWORD PTR DS:[EAX+2F4]
004020DD  |. 33D2           |XOR EDX,EDX
004020DF  |. 8950 0C        |MOV DWORD PTR DS:[EAX+C],EDX
004020E2  |. E9 1D030000    |JMP cargador.00402404
004020E7  |> FF45 FC        |INC DWORD PTR SS:[EBP-4]
004020EA  |. 837D FC 07     |CMP DWORD PTR SS:[EBP-4],7    ; 比較6次(從1開始)
004020EE  |.^75 BE          \JNZ SHORT cargador.004020AE

檢視0012AD52處的記憶體情況
0012AD52  46 4E 56 60 6A 77 00 56 3F 3D 3B 39 37 35 00 00  FNV`jw.V?=;975..
0012AD62  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0012AD72  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0012AD82  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0012AD92  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0012ADA2  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0012ADB2  00 00 00 00 06 9B 9B 9B 9B 9B 9B 00 00 00 00 00  ....FNV`jw.....
記下0012AD52處的連續6個位元組(這裡為46 4E 56 60 6A 77)。
注意看到0012ADB7處的連續6個位元組為9B,就是我們的FF-64H。
經過實驗改變cargador.cfg檔案的00000220H處的連續6個位元組可以看到0012ADB7處的內容發生了相應的變化。
(可先將頭一半位元組改為AA試試,看是否變為46H,否則改後一半,只要經過幾次實驗即可判斷出來!)
好了,到這裡就結束了。最後將這6個位元組(46 4E 56 60 6A 77)加64H(這裡即為AA B2 BA C4 CE DB)
將這計算出的6個資料寫入cargador.cfg檔案中的00000220H處的連續6個位元組儲存即完美破解!
程式下方顯示為“謝謝您使用這個遊戲,祝你早日通關!”
有興趣的可寫出記憶體序號產生器。


相關文章