破解 Windows Commander 4.52
看了精華論壇II(感謝看雪及各位大俠的精彩文章)中
JOHNSON(C-Pen)大俠破解wincmd4.5的文章,手有些發癢,
於是就下載了WinCmd4.52版練習練習。
所用工具:Trw2000 1.22(註冊版),UltraEdit 8.0
一、脫殼
用FileInfo 2.43檢測是用ASPACK2.1加的殼,但
用UnAsPack1.0.9.1自動脫殼無效,(Why???,I don't know.),
按照JOHNSON大俠的方法,用Trw2K載入WinCMD32.exe下命令
pnewsec<Enter>
耐心地等一會兒,等trw2K跳出後,下命令
makepe<Enter>
這樣,就在WinCmd的目錄下生成了一個newpe.exe檔案,它
就是脫殼後的檔案。
二、去除CRC檢驗
程式發現自身被修改後,會提示有病毒,然後退出。
用MessageBoxa斷點攔截後,找不到跳轉點,這是和4.5版
不同之處,和4.0版倒是一樣(不知作者是出於什麼心理)。
估計一下,從程式啟動完成到彈出有病毒提示大約為5秒鐘,
因此,重新載入,下斷點
bpx settimer<Enter>
執行程式,攔下後,用pmodule命令返回,可以看到以下程式碼,
如果沒有看到,可以繼續執行,重複上面動作,一定能找到:
015F:004EF70C MOV EBX,EAX
015F:004EF70E CMP BYTE [EBX+051F],00
015F:004EF715 JNZ 004EF737 ;關鍵的跳轉,改成JMP就沒問題了
015F:004EF717 MOV BYTE [EBX+051F],01
015F:004EF71E PUSH BYTE +00
015F:004EF720 PUSH DWORD 1388 ;1388即十進位制的5000,即5000毫秒
015F:004EF725 PUSH DWORD 0541
015F:004EF72A MOV EAX,EBX
015F:004EF72C CALL 00421AB8
015F:004EF731 PUSH EAX
015F:004EF732 CALL `USER32!SetTimer`
如此改了之後,程式還會不定時的自動退出。還有陷井,問題是它沒有提示,
如何找到它呢,猜想不是使用的時鐘,大概是在執行具體功能時檢測的,
試一下,刪除一個檔案,結果自動退出,OK,有辦法了,載入後,下斷點
bpx messageboxa
全速執行,找一個沒有的檔案刪除,被攔下後,用pmodule(這個命令太COOL了)
返回,F10步步跟蹤,看到了如下程式碼:
015F:004F3BA0 JMP NEAR [ECX+00545298]
015F:004F3BA6 SUB EAX,23B9
015F:004F3BAB JZ 004F3BB7 ;關鍵的跳轉,改成JMP就OK
015F:004F3BAD MOV EAX,01
015F:004F3BB2 CALL 004044FC ;此CALL將退出程式
015F:004F3BB7 CALL 0044CD54
015F:004F3BBC XOR EAX,EAX
015F:004F3BBE POP EDX
015F:004F3BBF POP ECX
015F:004F3BC0 POP ECX
三、去除NAG,反覆看了johnson大俠的文章XX遍,還好找到了,
可讓我省了很多很多的力氣要先假造wincmd.key檔案
用createfilea斷點攔截,攔下後,d eax 看一下記憶體中的資料,
有Wincmd.key字眼就找到了,
015F:004D944B LEA EDX,[EBP+FFFFFE60]
015F:004D9451 MOV ECX,10
015F:004D9456 CALL 00402A24
015F:004D945B JZ 004D945F ;此處此處可改成JMP,
其實不跳也行,跳了會顯示亂碼,
015F:004D945D XOR EBX,EBX ;EBX為註冊標誌,盯住它,沒錯
015F:004D945F MOV EAX,[EBP+FFFFFEFC]
015F:004D9465 CALL 00402CBC
015F:004D946A MOV EAX,[EBP+FFFFFEF8]
015F:004D9470 CALL 00402CBC
015F:004D9475 MOV EAX,[EBP+FFFFFEF4]
015F:004D947B CALL 00402CBC
015F:004D9480 MOV [0054F6CC],BL
015F:004D9486 MOV EAX,[0054F6C8]
015F:004D948B NEG EAX
015F:004D948D IMUL EAX,EAX,BYTE +25
015F:004D9490 MOV [0054F6C8],EAX
將註冊標誌存入記憶體處為:
015F:004D9451 MOV ECX,10
015F:004D9456 CALL 00402A24 ;再次比較KEY檔案
015F:004D945B JZ 004D945F
015F:004D945D XOR EBX,EBX ;EBX被清則表示未註冊
015F:004D945F MOV EAX,[EBP+FFFFFEFC]
015F:004D9465 CALL 00402CBC
015F:004D946A MOV EAX,[EBP+FFFFFEF8]
015F:004D9470 CALL 00402CBC
015F:004D9475 MOV EAX,[EBP+FFFFFEF4]
015F:004D947B CALL 00402CBC
015F:004D9480 MOV [0054F6CC],BL ;存入註冊標誌此處不管有無KEY檔案都會走到
015F:004D9486 MOV EAX,[0054F6C8]
015F:004D948B NEG EAX
015F:004D948D IMUL EAX,EAX,BYTE +25
因此,我們不必假造KEY檔案,只要讓上面的BL值為1不就行了麼?
我找了下處
015F:004D8DBD JNZ 004D8DE0
015F:004D8DBF LEA EAX,[EBP+FFFFFEE2]
015F:004D8DC5 PUSH EAX
015F:004D8DC6 LEA EDX,[EBP+FFFFFA70]
015F:004D8DCC MOV CX,0400
015F:004D8DD0 MOV EAX,ESI
015F:004D8DD2 CALL 0043CF10
015F:004D8DD7 MOV EAX,ESI
015F:004D8DD9 CALL 0043CEA0
015F:004D8DDE JMP SHORT 004D8DEB
015F:004D8DE0 XOR EBX,EBX
015F:004D8DE2 MOV WORD [EBP+FFFFFEE2],00
015F:004D8DEB CMP WORD [EBP+FFFFFEE2],80
015F:004D8DF4 SETZ [0054F6CD]
015F:004D8DFB MOV BYTE [EBP+FFFFFEE1],01
015F:004D8E02 TEST BL,BL ;在此行上動手腳
改成 mov bl,01
015F:004D8E04 JZ NEAR 004D90F4 ;在此行上動手腳 改成
jmp 004d90f4,再補一個NOP
015F:004D8E0A LEA EAX,[EBP+FFFFF608]
015F:004D8E10 PUSH EAX
015F:004D8E11 CALL `KERNEL32!GetTimeZoneInformation`
015F:004D8E16 INC EAX
015F:004D8E17 JZ 004D8E35
另外再把015F:004D945D處改成2個NOP
當然具體改法很多,自己決定吧!
這樣,執行程式沒有NAG了,但標題欄顯示為Not Registered ,不管它了,
當然也可改掉,不過我很懶啦,反正已經達到目的了,至此為止!
透過分析,可以知道,第一次比較KEY檔案為判斷是否註冊,
第二次比較KEY檔案為判斷是否要出NAG。
這篇破文總算是寫完了,花了我很長時間,雖然沒有什麼新意,但也很累。
看了網上那麼多大俠的文章,我也把自己的一點體會寫出來,算佔一點回報吧。
如有遺漏可來E-mail聯絡,沒有時間作全面充分的測試(現在的軟體陷井多多)
再見吧!各位好運!!!!!
written by mjing E-mail:mjing@wx88.net 2001-2-19