《新劍俠情緣》光碟版變硬碟版

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

前天去買了一張單張光碟的《新劍俠情緣》(正版要幾張不知道),安裝時看見上面只有500多MB安裝檔案,心想可能是硬碟版,正在暗暗高興俺的光碟機可以不受罪啦!,安裝完畢,取出光碟,馬上啟動遊戲,咚!!!!“請插入《新劍俠情緣》的第一號光碟,再重新執行本程式。”!!我X,D盤也,嗨,只得自己想辦法!
   讀取光碟資訊的軟體(此類軟體多為遊戲軟體)一般要呼叫"GetDriveTypeA(判斷一個驅動器的型別)"以及"GetVolumeInformationA(返回卷標資訊)等相關API函式,所以只要反編譯成功後有針對性的分析這些函式所在位置的程式碼,並細心注意關鍵跳躍指令,往往起到事半功倍的效果。有時這些函式可能出現多個,也許單獨出現,也許混合出現,但80%以上都是對光碟進行校驗。
  這就動手!
  找到可執行檔案NewSword.exe,一看只有280多k,有點懷疑,就用fi檢查沒有加殼(可能讓D版者給脫了?!)。執行 W32dsm89 開啟NewSword.exe,反編譯成功後,單擊“Imports”檢視程式呼叫的相關函式,找到“KERNEL32.GetDriveTypeA”後雙擊將其開啟,我們可看到如下程式碼:


* Reference To: KERNEL32.SetErrorMode, Ord:0264h
                                 |
:0040A507 8B2D20B04300            mov ebp, dword ptr [0043B020]

* Reference To: KERNEL32.GetVolumeInformationA, Ord:0177h  0177h    <<----這裡是重點!!!!GetVolumeInformationA函式是獲得磁碟機代號卷標的,看看第一張光碟的卷標是什麼。
                                 |
:0040A50D 8B1D24B04300            mov ebx, dword ptr [0043B024]
:0040A513 C744241000000000        mov [esp+10], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A5A6(C)
|
:0040A51B 8D4C243C                lea ecx, dword ptr [esp+3C]
:0040A51F 51                      push ecx

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h     <<-----API函式標誌,判斷一個驅動器的型別
                                 |
:0040A520 FF1538B04300            Call dword ptr [0043B038]
:0040A526 83F805                  cmp eax, 00000005    <<-----這是什麼!!!5代表是光碟機,3代表是硬碟,
:0040A529 7565                    jne 0040A590         <<-----不等於5就跳,關鍵的一跳,磁碟機代號檢查,跳幾次就玩完
:0040A52B 6A01                    push 00000001
:0040A52D FFD5                    call ebp
:0040A52F 8BF0                    mov esi, eax
:0040A531 6A00                    push 00000000
:0040A533 8D542418                lea edx, dword ptr [esp+18]
:0040A537 6A00                    push 00000000
:0040A539 8D442420                lea eax, dword ptr [esp+20]
:0040A53D 52                      push edx
:0040A53E 50                      push eax
:0040A53F 6A00                    push 00000000
:0040A541 8D4C2430                lea ecx, dword ptr [esp+30]
:0040A545 6A20                    push 00000020
:0040A547 8D542454                lea edx, dword ptr [esp+54]
:0040A54B 51                      push ecx
:0040A54C 52                      push edx
:0040A54D FFD3                    call ebx
:0040A54F 56                      push esi
:0040A550 8BF8                    mov edi, eax
:0040A552 FFD5                    call ebp
:0040A554 85FF                    test edi, edi
:0040A556 7438                    je 0040A590          <----關鍵的地方,卷標檢查,跳幾次就玩完! 此處以後會有用
:0040A558 8BB42490000000          mov esi, dword ptr [esp+00000090]
:0040A55F 8D44241C                lea eax, dword ptr [esp+1C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A581(C)
|
:0040A563 8A10                    mov dl, byte ptr [eax]
:0040A565 8ACA                    mov cl, dl
:0040A567 3A16                    cmp dl, byte ptr [esi]
:0040A569 751C                    jne 0040A587
:0040A56B 84C9                    test cl, cl
:0040A56D 7414                    je 0040A583              <----關鍵的一跳,必須跳
:0040A56F 8A5001                  mov dl, byte ptr [eax+01]
:0040A572 8ACA                    mov cl, dl
:0040A574 3A5601                  cmp dl, byte ptr [esi+01]
:0040A577 750E                    jne 0040A587
:0040A579 83C002                  add eax, 00000002
:0040A57C 83C602                  add esi, 00000002
:0040A57F 84C9                    test cl, cl
:0040A581 75E0                    jne 0040A563

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A56D(C)
|
:0040A583 33C0                    xor eax, eax
:0040A585 EB05                    jmp 0040A58C              <----無條件跳,跳向遊戲可以執行的地方!

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040A569(C), :0040A577(C)
|
:0040A587 1BC0                    sbb eax, eax
:0040A589 83D8FF                  sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A585(U)
|
:0040A58C 85C0                    test eax, eax
:0040A58E 7436                    je 0040A5C6          <----關鍵的必須跳,跳向遊戲可以執行的地方!

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040A529(C), :0040A556(C)
:0040A590 8A44243C                mov al, byte ptr [esp+3C]     <<----關鍵的的地方!
:0040A594 FEC0                    inc al
:0040A596 8844243C                mov byte ptr [esp+3C], al
:0040A59A 8B442410                mov eax, dword ptr [esp+10]
:0040A59E 40                      inc eax
:0040A59F 83F818                  cmp eax, 00000018      <-----將對24個英文字母(磁碟機代號)清掃一遍
:0040A5A2 89442410                mov dword ptr [esp+10], eax
:0040A5A6 0F8C6FFFFFFF            jl 0040A51B            <----又跳回,再來!跳幾次就玩完

* Possible StringData Ref from Data Obj ->"請插入《新劍俠情緣》的第一號光碟,再重新執行本"
                                       ->"程式。"
                                 |
:0040A5AC 689C0A4400              push 00440A9C

* Reference To: Sword.?g_MessageBox@@YAXPADZZ, Ord:0308h
                                 |
:0040A5B1 FF1558B14300            Call dword ptr [0043B158]
:0040A5B7 83C404                  add esp, 00000004
:0040A5BA 33C0                    xor eax, eax
:0040A5BC 5F                      pop edi
:0040A5BD 5E                      pop esi
:0040A5BE 5D                      pop ebp
:0040A5BF 5B                      pop ebx
:0040A5C0 83C47C                  add esp, 0000007C
:0040A5C3 C20400                  ret 0004



* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A58E(C)
|
:0040A5C6 5F                      pop edi      <<----遊戲可以執行的地方!
:0040A5C7 5E                      pop esi
:0040A5C8 5D                      pop ebp
:0040A5C9 B801000000              mov eax, 00000001
:0040A5CE 5B                      pop ebx
:0040A5CF 83C47C                  add esp, 0000007C
:0040A5D2 C20400                  ret 0004


:0040A5D5 90                      nop
:0040A5D6 90                      nop
:0040A5D7 90                      nop
:0040A5D8 90                      nop
:0040A5D9 90                      nop
:0040A5DA 90                      nop
:0040A5DB 90                      nop
:0040A5DC 90                      nop
:0040A5DD 90                      nop
:0040A5DE 90                      nop
:0040A5DF 90                      nop

* Referenced by a CALL at Address:
|:0040A449  
|
:0040A5E0 56                      push esi
:0040A5E1 57                      push edi
:0040A5E2 8BF9                    mov edi, ecx

    好了,讓這個遊戲不讀光碟的方法有很多。
⑴ 把“0040A526  cmp eax, 00000005”改為“cmp eax, 00000003”,
  用UltraEdit開啟NewSword.EXE檔案,
    找到:83 F8 05 75 65
    改為:83 F8 03 75 65  存檔,搞定!
或:找到:83 F8 05 75 65
    改為:83 F8 05 74 65  存檔,搞定!
 再把C:盤的卷標改成《新劍俠情緣》第一張光碟的卷標,
這個遊戲軟體不需要讀光碟上的某個檔案,只要卷標檢查透過就行。

⑵ 直接修改關鍵跳轉指令,直接繞過卷標檢查
 仔細觀察,跳向“0040A5C6 ”,可以直接繞過卷標檢查,遊戲可以執行。
 改什麼地方呢??
 這裡,跳向“0040A590”的地方,共有兩處
    :0040A529 7565                    jne 0040A590
  ②  :0040A556 7438                    je 0040A590
 把“0040A590”改為“0040A5C6”,用jumpgen算一下,①不行,②正好,運氣!!!
改0040A556 7438                    je 0040A590
為0040A556 746E                    je 0040A5C6
用UltraEdit開啟NewSword.EXE檔案,
   找到:85 FF 74 38
   改為:85 FF 74 6E  存檔,搞定!,只需改一個位元組就可以了。。。哈哈哈哈
不過,我有一疑問,只改以上跳轉指令直接繞過卷標檢查,就可以進入遊戲,那麼以下
  :0040A526 83F805                  cmp eax, 00000005    <<-----5代表是光碟機,3代表是硬碟,
  :0040A529 7565                    jne 0040A590         <<-----不等於5就跳
又有何用?請高手賜教!

  後記
  我寫這,是第一次,當然破解光碟遊戲也是第一次,真誠感謝看雪及他的《論壇精華Ⅲ》和《加密與解密--軟體保護技術與解決方案》一書,是他帶我上路。其實論起來,我還是看雪(段鋼)的師兄,而且我們曾同在一個校園待過(我1991年畢業於同濟大學,他1994年),我很以有此師弟為榮。


相關文章