對幻影1.5b3加殼的程式中各種註冊相關程式碼的一點分析 ---這是一篇寫了很舊的東東了,一直沒發,這次充數吧 (10千字)

看雪資料發表於2000-09-13

對幻影1.5b3加殼的程式中各種註冊相關程式碼的一點分析

【宣告】
我寫文章以交流為主,希望大家在轉載時能保持文章的完整性。

【前言】
跟蹤分析幻影加密的程式實在很痛苦,在我的愛機被他超度了N次之後,終於讓我下定決心去詳細分析一下他的加密方法。
經過數天艱苦卓絕的戰鬥,終於讓我有了一點收穫,現在我可以很快獲取Serial No和脫殼。這可能是我最下功夫去了解的一個加殼程式了。

作者:        ljttt
寫作日期:    2000-08-25

這裡說一說幻影中各種註冊相關程式碼的內容。首先我們來看看幻影加密中的用到的幾種方法:
1、Start Message        你可以由此加入一些程式啟動時的歡迎之類的資訊
2、Restrictive Date        你可以由此設定程式的過期日期
3、Restrictive Time        你可以由此設定程式的未註冊限制使用次數
4、Pass Word            你可以由此設定程式啟動時的口令
5、Register Key            你可以由此設定程式加密用的 Key (此 Key 用於程式碼還原,所以這裡就不分析他了)
6、Register Cue            你可以由此設定程式

以上有五類註冊相關的設定(第 5 項除外),實際上還有一處,就是如果你用未註冊版的幻影去加密程式,那麼程式在使用時會隨機顯示該程式是被未註冊版幻影加密的資訊。所以共有六類,現在我們來看一下相關的程式碼。

第一段:判斷程式是否被註冊版幻影加密
00412574: 53                        push ebx
00412575: 6A64                      push 00000064
00412577: 6A63                      push 00000063
00412579: 6A00                      push 00000000
0041257B: FF9508BC4000              call dword ptr [ebp+0040BC08]        <--SetTimer()
00412581: 61                        popad 
00412582: 6A00                      push 00000000
00412584: FF95C3BB4000              call dword ptr [ebp+0040BBC3]        <--GetModuleHandle()
0041258A: 89855FBD4000              mov dword ptr [ebp+0040BD5F],eax
00412590: 80BDC8B2400001            cmp byte ptr [ebp+0040B2C8],01        <--標誌,可能是用來標識是否被註冊版幻影加密的
00412597: 7435                      jz 004125CE                        <--註冊版加密的,就會跳轉。否則將隨機顯示資訊
00412599: BEE1B94000                mov esi,0040B9E1
0041259E: 03F5                      add esi,ebp
004125A0: 56                        push esi
004125A1: FF959FBB4000              call dword ptr [ebp+0040BB9F]        <--GetSystemTime()
004125A7: 668B85EFB94000            mov ax,word ptr [ebp+0040B9EF]        <--取其中的毫秒時間
004125AE: 240F                      and al,0F
004125B0: 3C02                      cmp al,02
004125B2: 731A                      jnb 004125CE                        <--判斷結果隨機,用來隨機顯示未註冊版加密。
004125B4: B8BEB94000                mov eax,0040B9BE                    <--如果沒有跳走,將會顯示該程式被未註冊版的幻影加密

EAX指向的其預設顯示內容如下:
****************************************************************
          本軟體由 幻影v1.5 未註冊版本加密         

This program protected by DBPE v1.5  Unregistered version



Homepage: http://fsdb.yeah.net    E-mail: D.Boy@126.com
*****************************************************************

004125B9: 03C5                      add eax,ebp
004125BB: BB11B24000                mov ebx,0040B211
004125C0: 03DD                      add ebx,ebp
004125C2: 6A30                      push 00000030
004125C4: 50                        push eax
004125C5: 53                        push ebx
004125C6: 6A00                      push 00000000
004125C8: FF9500BC4000              call dword ptr [ebp+0040BC00]        <--MessageBoxA

第二段:判斷程式是否被註冊。
.......(前面的省略)
004125EF: E87C030000                call 00412970                        <--獲取硬體資訊並計算比較登錄檔資訊來檢測軟體是否已經註冊
004125F4: 6689857DB44000            mov word ptr [ebp+0040B47D],ax <--儲存軟體是否已經註冊的資訊。將來程式還會以此來作點脫殼的小障礙。

004125FB: 663D0100                  cmp ax,0001
004125FF: 0F84BF000000              jz 004126C4                        <--已註冊,就跳轉到程式碼還原的地方,否則進入下一段

第三段:判斷是否顯示 StartMessage 資訊
00412605: 83BD5DB7400000            cmp dword ptr [ebp+0040B75D],00000000 <--標誌
0041260C: 7426                      jz 00412634                        <--為0,則跳走。去顯示 StartMessage 資訊。

0041260E: 83BD61B7400001            cmp dword ptr [ebp+0040B761],00000001 <--標誌
00412615: 751D                      jnz 00412634                        <--不等於1,則跳走,去顯示 StartMessage 資訊。
00412617: E80A060000                call 00412C26                        <--顯示 Try 對話方塊,其中有 Try 和 Register 按鈕選擇。
0041261C: 6689857FB44000            mov word ptr [ebp+0040B47F],ax
00412623: BBC9B24000                mov ebx,0040B2C9
00412628: 03DD                      add ebx,ebp                        <--EBX指向要顯示的內容,如果為"||"則表示不顯示。
0041262A: 663D0200                  cmp ax,0002                        <--2,表示選擇了Register按鈕
0041262E: 0F8444010000              jz 00412778                        <--相等,則跳轉到註冊輸入處。

00412634: 6681BDF1B440007C7C        cmp word ptr [ebp+0040B4F1],7C7C    <--判斷是否為"||"
0041263D: 741A                      jz 00412659                        <--相等則表示不顯示任何資訊,跳走到口令輸入處
0041263F: B8BEB94000                mov eax,0040B9BE
00412644: 03C5                      add eax,ebp
00412646: BBF1B44000                mov ebx,0040B4F1
0041264B: 03DD                      add ebx,ebp
0041264D: 6A30                      push 00000030
0041264F: 50                        push eax
00412650: 53                        push ebx
00412651: 6A00                      push 00000000
00412653: FF9500BC4000              call dword ptr [ebp+0040BC00]        <--MessageBoxA(),此處為顯示 StartMessage 資訊

第四段:判斷口令
00412659: E8A0020000                call 004128FE                        <--彈出口令輸入框接受輸入的口令並返回判斷結果。
0041265E: BB91B84000                mov ebx,0040B891    
00412663: 03DD                      add ebx,ebp                        <--EBX指向 Invalid  PassWord 資訊
00412665: 663D0000                  cmp ax,0000                        <--判斷口令是否輸入正確
00412669: 0F8409010000              jz 00412778                        <--口令錯,跳走到註冊輸入處。

第五段:判斷是否過期
0041266F: E882010000                call 004127F6                        <--檢查使用是否過期,並返回判斷結果
00412674: BB1DB64000                mov ebx,0040B61D
00412679: 03DD                      add ebx,ebp                        <--EBX指向"試用期已過"等資訊
0041267B: 663D0000                  cmp ax,0000                        <--判斷是否過期
0041267F: 0F84F3000000              jz 00412778                        <--過期,則跳走到註冊輸入處
00412685: E8C3010000                call 0041284D                        <--沒有過期,則在登錄檔中查詢註冊資訊,第一次使用則在登錄檔建立相關資訊。
0041268A: BB1DB64000                mov ebx,0040B61D
0041268F: 03DD                      add ebx,ebp                        <--EBX指向"試用期已過"等資訊
00412691: 663D0000                  cmp ax,0000
00412695: 0F84DD000000              jz 00412778                        <--過期,則跳轉去顯示資訊,否則繼續下面的判斷
0041269B: 6683BD7DB4400000          cmp word ptr [ebp+0040B47D],0000    <--此標誌前面已有說明,判斷是否已經成為正版使用者
004126A3: 751F                      jnz 004126C4                        <--已註冊,則跳轉到程式碼還原處
004126A5: 83BD5DB7400000            cmp dword ptr [ebp+0040B75D],00000000    <--此標誌前面已有說明
004126AC: 7416                      jz 004126C4                        <--為0,則跳走到程式碼還原處
004126AE: 6683BD7FB4400001          cmp word ptr [ebp+0040B47F],0001    <--此標誌前面已有說明,表示你在 Try 框中按下的按鈕
004126B6: 740C                      jz 004126C4                        <--按的是Try按鈕而不是Register按鈕,則跳到程式碼還原處
004126B8: BBC9B24000                mov ebx,0040B2C9
004126BD: 03DD                      add ebx,ebp                        <--EBX指向要顯示的資訊,如果為"||"則不顯示
004126BF: E9B4000000                jmp 00412778                        <--跳到顯示資訊處

004126C4: ...................        (此處開始是程式碼還原部分。省略此段程式碼)
          ...................        (同上,省略)
00412773: E90F120000                jmp 00413987                        <--跳轉到最後的一段Anti-Debug程式碼處,那裡將不久就到了程式真正的入口了。不過那裡還有最後一關要過。這裡就不多說了。
00412778: 66813B7C7C                cmp word ptr [ebx],7C7C            <--判斷是否為""||"
0041277D: 7413                      jz 00412792                        <--是,則不顯示資訊,跳走
0041277F: B8C0B94000                mov eax,0040B9C0
00412784: 03C5                      add eax,ebp
00412786: 6A30                      push 00000030
00412788: 50                        push eax
00412789: 53                        push ebx
0041278A: 6A00                      push 00000000
0041278C: FF9500BC4000              call dword ptr [ebp+0040BC00]        <--MessageBoxA(),顯示資訊

第六段:彈出註冊輸入框,並判斷註冊是否成功
00412792: 83BD5DB7400000            cmp dword ptr [ebp+0040B75D],00000000 <--此標誌前面已有說明
00412799: 7446                      jz 004127E1                        <--為0,則跳走
0041279B: E810010000                call 004128B0                        <--這裡將彈出註冊輸入框(要求你輸入正確的Serial No)並返回判斷結果
004127A0: 6689857DB44000            mov word ptr [ebp+0040B47D],ax        <--儲存判斷結果,標誌
004127A7: 50                        push eax
004127A8: 663D0100                  cmp ax,0001                        <--判斷是否註冊成功
004127AC: 7507                      jnz 004127B5                        <--不等於1,註冊失敗,跳轉到顯示資訊處
004127AE: BBF5B84000                mov ebx,0040B8F5                    <--註冊成功了,EBX指向"Register Successfully"資訊處
004127B3: EB05                      jmp 004127BA                        <--去顯示資訊

004127B5: BB59B94000                mov ebx,0040B959
004127BA: 03DD                      add ebx,ebp                        <--EBX指向"Invalid Serial NO"資訊處
004127BC: 66813B7C7C                cmp word ptr [ebx],7C7C            <--判斷是否為"||"
004127C1: 7413                      jz 004127D6                        <--是,則表示不顯示資訊,跳轉
004127C3: B8C0B94000                mov eax,0040B9C0
004127C8: 03C5                      add eax,ebp
004127CA: 6A30                      push 00000030
004127CC: 50                        push eax
004127CD: 53                        push ebx
004127CE: 6A00                      push 00000000
004127D0: FF9500BC4000              call dword ptr [ebp+0040BC00]        <--MessageBoxA,顯示註冊成功或者註冊失敗

004127D6: 58                        pop eax
004127D7: 663D0100                  cmp ax,0001                        <--判斷是否註冊成功
004127DB: 0F84E3FEFFFF              jz 004126C4                        <--註冊成功,則重新回到程式碼還原處繼續正常工作

004127E1: C6855DBD400000            mov byte ptr [ebp+0040BD5D],00
004127E8: 8BC5                      mov eax,ebp
004127EA: 5B                        pop ebx
004127EB: 59                        pop ecx
004127EC: 5A                        pop edx
004127ED: 5E                        pop esi
004127EE: 5F                        pop edi
004127EF: 5D                        pop ebp
004127F0: 9D                        popfd 
004127F1: E991110000                jmp 00413987                        <--從這裡跳走到最後的Anti-Debug處,怕是凶多吉少,因為程式碼沒有還原,而最後的那段程式碼中還有一段Anti-Debug程式碼,雖然那裡就快到了程式真正的入口處,老天!死在那裡,可真悲哀。西天取經的最後一關,死在如來佛祖面前..........$#%^#。

【後記】
幻影在動態反跟蹤上設計得十分優秀,不過由於其沒有對動態反跟蹤程式碼進行更多的保護,以及在靜態反跟蹤上有些不足,才讓我能夠有此收穫。不過這些我已經給D.Boy提些建議,所以在新版幻影中我相信他的表現一定更加優秀。到那時不知道我的愛機還要被 k 多少次.....555555.......我的愛機啊..。------------- 怎麼我現在就想著被 k ,難道幻影中加了瑪啡?

相關文章