對幻影1.5b3加殼的程式中各種註冊相關程式碼的一點分析 ---這是一篇寫了很舊的東東了,一直沒發,這次充數吧 (10千字)
對幻影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 ,難道幻影中加了瑪啡?
相關文章
- 哈哈,我又上來了,cd-check的文章不知有沒有人看?.......這次改貼一篇有關注冊碼的譯文吧!
(3千字)2000-09-09
- 很久沒來這了,上一篇美萍反黃專家2.0註冊碼破解 (8千字)2001-07-19
- 這些年一直是寫程式碼的命2013-09-09
- 分析家v4.01註冊核心程式碼---幻影的殼 (635字)2001-11-02
- 對Crunch v1.1加殼程式的手動脫殼及反跟蹤程式碼的一點分析
(15千字)2000-10-02
- 對PECompact加殼的DLL脫殼的一點分析 (7千字)2000-08-17
- 脫殼----對用Petite2.2加殼的程式進行手動脫殼的一點分析
(5千字)2000-07-27
- 對不起,我錯了,這程式碼不好寫2022-06-01
- 實現呼叫加殼的外殼中的子程式的一點見解。。 (1千字)2002-10-21
- 對幻影v1.5b3中Anti-Debug程式碼的一點分析 (2千字)2000-08-25
- 大牛的程式碼是這樣寫的2019-05-11
- 【Spring註解驅動開發】AOP核心類解析,這是最全的一篇了!!2020-09-03Spring
- 13 年來,我寫了這些糟糕的遊戲程式碼2017-06-09遊戲
- iOS路徑相關的, 都在這了2017-07-21iOS
- 一種非明碼比較程式的註冊------NS-SHAFT註冊碼破解 (9千字)2015-11-15
- legato networker又停了,這次居然是由於nmo的註冊碼不對(solaris的client用了windows的註冊碼)2007-09-28clientWindows
- 這些手寫程式碼會了嗎?少年2020-08-03
- C#練習,編寫一個擲篩子100次的程式,並列印出各種點數的出現次數。2018-10-16C#
- 這一次,解決Flutter Dialog的各種痛點!2021-11-03Flutter
- Fragment 相關知識點都在這裡了2019-03-25Fragment
- 漫畫 | 夜深了,程式設計師的電腦卻沒關,發生了這樣的故事…2021-01-14程式設計師
- 我見過最有趣的程式碼註釋,都在這裡了(1)2016-09-16
- 40 歲了還在寫程式碼,是一種幸福,還是一種悲哀?2014-10-22
- 這是一篇關於程式設計師學習的文章2019-12-10程式設計師
- 利用COM元件實現對WORD書籤各種操作大全,看這一篇就夠了2020-12-25元件
- ORB 相關的次程式碼2009-12-28ORB
- [這段程式碼很Pythonic]相見恨晚的itertools庫2017-03-12Python
- 驚歎!這個盲人程式設計師是這樣寫程式碼的2017-09-14程式設計師
- 如果40歲了還在寫程式碼,是一種幸福,還是一種悲哀?2016-11-21
- 如果40歲了還在寫程式碼 是一種幸福 還是一種悲哀?2014-09-05
- 又被node的eventloop坑了,這次是node的鍋2019-01-16OOP
- 瞭解Java中的鎖,看這一篇就夠了!2020-04-04Java
- IDEA中的Git操作,看這一篇就夠了!2020-11-29IdeaGit
- 微信小程式上手體驗:沒有比這個更全的了2017-01-13微信小程式
- 小甜餅 --- 有關新版Asprotect加殼程式的脫殼的又一種思路
(798字)2000-09-10
- 關於SwiftUI,看這一篇就夠了2020-06-24SwiftUI
- 關於MyBatis框架這一篇就夠了2021-05-21MyBatis框架
- 脫殼----對用pecompact加殼的程式進行手動脫殼
(1千字)2000-07-30