使用KERNEL32.DLL破解???(譯文) (8千字)

看雪資料發表於2000-08-29

原標題:
Cracking using KERNEL32.DLL??
Amazing how things don't change!

原文:http://208.50.16.104/madmasu.htm

作者: madmax    翻譯  DDXia[CCG]


丁丁蝦有話說:(那還用問,肯定有是廢話啦^_*)===如果你是高手,請使用暴力,JMP過去^_^

      Crack也有段時間了,老是在想,一天到晚的Crack,(這小子開始吹牛,踞我所知,已有
3個月沒有發市啦:) 什麼嘛!我可是天天都到看雪論壇報到的哦)有沒有好的辦法能提高自己的
功力?很多人都關心。畢竟外國的CrAcK發展比較快,所以經常去外國網站,洋為中用嘛?
今天無意中看到一篇文章,有比較大的啟發。好的東東,大家分享嘛!!!順便說一聲,英語不
是俺的母語(好象tKC也說過),也比較菜,翻譯內容大概的意思應該都對吧!哈哈~~~~ :)

英文的原文:http://208.50.16.104/madmasu.htm

標題:使用KERNEL32.DLL破解???


介紹:

在Internet上有一個非常出色的遊戲。。。Subspace,by VIE(Virgin),(DDXia:好象沒有聽過)
最近剛拿到它的零售版,。。。。 零售版程式中含有CRC檢查和記憶體駐留(時時檢查)(DDXia:好怕怕哦)
我們應該如何CrAck???


工具:
Winice 3.22
Hiew 5.66
W32Dasm 8.9 (Regged helps)
API 知識 (有Win32.Hlp 就行)


遊戲的 URL/FTP 
http://subspace.vie.com/


教學
SubSpace,是一個已經發布了一段時間的線上遊戲。在玩遊戲過程很難作弊。。。這就是執行它的樂趣,
但不會玩這個遊戲。現在遊戲發行了零售版,在其中加入了CD-Check。。。啊哦!!來,坐下來開始CRACK,
如果你有零售版,你會發現遊戲提示"請插入CD....",並帶有時間限制....哈哈~~~~~~....但有點我懂啦....
於是進入Winice。(DDXia:真是聰明!!)
BPX GetDriveTypeA (DDXia:一般,尋找CDROM都是使用這個API)


捕獲、進入SubSpace的程式碼中....這個程式的CDCHEK步驟如下:(DDXia:重點之一,具有普遍性)

查CDROM的驅動器號-----------------------------GetDriveTypeA
獲取CD的空間--------------------------------------GetDiskSpaceFreeA
如果等於零,那肯定是CD。
獲取CD的標籤 -------------------------------------GetVolumeInformationA
如果標籤=='SUBSPACE' 那麼 CD OK
開啟 CD根目錄的'INTRO.FLC'。 ---------------CreateFileA
如果存在, 那麼 CD OK
獲取INTRO.FLC的大小---------------------------GetFileSize?
比較它的大小
如果相等,就設一個標誌。

既然大多數人讀了這篇文章也不會去CRACK它,所以對原始碼不會在這裡貼出來。但最有趣的部分,也就是關鍵,
是如何繞過檢測部分。我們可以透過HIEW來修改跳過,但有CRC 校驗檢測會中斷程式,那麼再補丁CRC檢測,
可是記憶體中的還有動態校驗....真的很難debug,在Winice中需要修改的斷點就有0CCh(DDXia:換算過來就是204處,
哇!!我倒。。。。。。).....該怎麼辦呢??恩,考慮一下API Hooking,看來沒有什麼希望。再想一想,
.......TSR Crack!但是這可不是DOS環境啊!在Window中沒有 AX=25XX, INT 21h功能,那麼哪裡是突破口呢?
.......YEAH !Windows的本身。

有了這個想法,於是到IRC中發表(DDXia:外國的Cracker非常喜歡到IRC中交流),但是這個想法就好象
自己準備去修理一顆核彈,和核心玩簡直就是發瘋了(DDXia:呵呵~~~~~我還是非常欣賞他的冒險精神和創
造力)我們知道在SubSpace保護程式中,第一次呼叫的API是 GetDriveTypeA,這個API返回一個數值,
2代表軟碟機,3代表硬碟,5代表CDROM,(至於其他的數值,我們不關心).....實際上,我們要象FAKECD
程式那樣攻擊它的保護....當用TSR模擬一個CD的時候,我們在硬碟中模擬那些必需的檔案。


在Winice中,輸入:
U GetDriveTypeA    (DDXia:俺孤漏寡聞,可是第一聽說這樣用U命令啊!!!牢記在心!哈哈~~~~,
        又學到一招)
將看到API被反彙編過的程式碼......下面的程式碼是其中的一部分,也可以靜態反彙編kernel32.dll。但你看到的程式,
會有些莫名其妙的比較後,使用JMP跳轉到其他的API:
(DDXia:也許程式碼部分會有不一樣,那是因為kernel32.dll版本不同)

:BFF777C4 57                      push edi
:BFF777C5 6A21                    push 00000021
:BFF777C7 2BD2                    sub edx, edx
:BFF777C9 68EFE2F9BF              push BFF9E2EF
:BFF777CE 64FF32                  push dword ptr fs:[edx]
:BFF777D1 648922                  mov dword ptr fs:[edx], esp
:BFF777D4 8B7C2414                mov edi, dword ptr [esp+14]
:BFF777D8 0BFF                    or edi, edi
:BFF777DA 7407                    je BFF777E3
:BFF777DC 2BC0                    sub eax, eax
:BFF777DE 8D48FF                  lea ecx, dword ptr [eax-01]
:BFF777E1 F2                      repnz
:BFF777E2 AE                      scasb

* Referenced by a Jump at Address:BFF777DA(C)
|
:BFF777E3 648F02                  pop dword ptr fs:[edx]
:BFF777E6 83C408                  add esp, 00000008
:BFF777E9 5F                      pop edi
:BFF777EA E9E5D4FFFF              jmp BFF74CD4


在這個程式中,我們如何放入自己的程式碼呢?!?在JE處設BPX,結果是它會不斷被中斷。所以
BPX BFF777DA,然後執行 Explorer或者某些程式就會被BPX中斷。你將看到什麼都不做,也會中斷!
所以我們敢肯定(這主要因為是微軟寫的程式碼)這段程式有點垃圾......讓我們修改和最佳化它:
(遊戲中第一次呼叫是檢查C:)

:BFF777C4 57                      xor  edx,edx      ;  標誌位
:BFF777C5 6A21                    mov  eax,[esp]    ;  得到正在呼叫的程式的地址
:BFF777C7 2BD2                    cmp  eax,413e6e  ; 是否是遊戲的CD-CHECK
:BFF777C9 68EFE2F9BF              jnz  BFF777EA    ; 如果不是,繼續
:BFF777CE 64FF32                  mov  [esp+4],eax  ;  儲存返回地址
:BFF777D1 648922                  pop  eax          ;        ESP+4
:BFF777D4 8B7C2414                mov  eax,5        ; 返回5,表示我們是CDROM
:BFF777D8 0BFF                    ret
:BFF777DA 7407                    je BFF777E3      ; 微軟程式碼
:BFF777DC 2BC0                    sub eax, eax      ; 這裡!
:BFF777DE 8D48FF                  lea ecx, dword ptr [eax-01]
:BFF777E1 F2                      repnz
:BFF777E2 AE                      scasb

* Referenced by a Jump at Address:BFF777DA(C)
|
:BFF777E3 648F02                  pop dword ptr fs:[edx]
:BFF777E6 83C408                  add esp, 00000008
:BFF777E9 5F                      pop edi
:BFF777EA E9E5D4FFFF              jmp BFF74CD4

你能看到,我們非常暴力的擷取了這個API........每一次呼叫,我們都去 檢查是否是被遊戲呼叫.......非常簡單!
現在我們欺騙它C:就是CDROM,我們再到磁碟剩餘空間的檢查:
(原程式和上面的很相相似,但也是很多垃圾....誰能解決?因為這段程式是大了點.....下面是新的改良過的
程式!)
(DDXia:不過在NT中就沒有怎麼多的程式廢話了,比較緊湊,WIN98沒有看過是如何的?)

:BFF778C5 2BD2                    xor  edx,edx      ; 好象所有的微軟都喜歡這程式碼呢?
:BFF778C7 68B8E2F9BF              mov  eax,[esp]    ;  得到正在呼叫的程式地址
:BFF778CC 64FF32                  cmp  eax,491E22  ;是否是 SubSpace?
:BFF778CF 648922                  jnz  BFF77900    ;如果不是,繼續
:BFF778D2 8B4C240C                add  esp,14h      ;  修改堆疊,保證返回正常
:BFF778D6 E302                    mov  [esp],eax    ; 返回指標
:BFF778D8 8A01                    mov  [esp+18],eax ; 這裡是空間大小返回。(DDXia:我覺應該是edx,
                                                                                    而不是eax,也許是筆誤)
:BFF778DA 8B4C2410                ret              ; 返回
:BFF778DE E302                    jcxz BFF778EA    ; 剩下的程式碼不變
:BFF778E0 8B01                    mov eax, dword ptr [ecx]
:BFF778E2 8B4C2414                mov ecx, dword ptr [esp+14]
:BFF778E6 E302                    jcxz BFF778EA
:BFF778E8 8B01                    mov eax, dword ptr [ecx]
:BFF778EA 8B4C2418                mov ecx, dword ptr [esp+18]
:BFF778EE E302                    jcxz BFF778F2
:BFF778F0 8B01                    mov eax, dword ptr [ecx]
:BFF778F2 8B4C241C                mov ecx, dword ptr [esp+1C]
:BFF778F6 E302                    jcxz BFF778FA
:BFF778F8 8B01                    mov eax, dword ptr [ecx]
:BFF778FA 648F02                  pop dword ptr fs:[edx]
:BFF778FD 83C404                  add esp, 00000004
:BFF77900 E954D5FFFF              jmp BFF74E59


這樣看來,我們截獲這段程式,同時強迫它返回磁碟剩餘空間為零,C:象個CDROM.......現在剩下的就是標籤檢
查和檔案檢查.......這樣簡單,修改C:的標籤為SUBSPACE,和還使用一小段ASM編的程式,我們編個大小為
37,433,486的檔案..然後修改KERNEL32.DLL,重新啟動。不停的畫十字架吧,企求不要系統崩潰吧!!

後語:
這是非常有趣的CRACK的一種方法.....不過我從來沒有看見任何一個人使用這種方法,也許是因為它太
冒險,同時還有一個相容性的問題。我主要是想交流我發現的想法,(DDXia:YEAH!Crack的精神
所在,不斷的探索和傳播)也許在未來會考慮這種技術.....這主要的問題是修改了 KERNEL32.DLL,因為
它有許多的版本。如果Patch 所有的版本那簡直就是發瘋了。

非常驚奇的是無論DOS走多遠, its roots still follow us in cracking!(DDXia:這句太難翻譯了)

丁丁蝦再說幾句:(暴力法-----Crack第一式,牢記 EB----JMP,跳過、跳過、再跳過)
    的確,有些瘋狂,但他思考的方式和他的自創力都是值得學習!翻譯的目的是希望大家能比較深層
的思考問題。
                  (丁丁蝦長長地、長長地吐了一口氣)終於完成翻譯了!請多多指教!拜託啦!好久好久都沒有
寫過什麼東東了!就當給大家的一份小小小的禮吧!!!現在凌晨1:00 還差10分鐘。該收工了!

                              DDXia[CCG]
                            2000.8.29  01:50

相關文章