?? not_cre.htm
字號:
<br>
陷阱,一個我不太肯定,但聽說有程序使用的方法:用CRC校驗?zāi)愕腅XE文件,如果它被改變了,不要顯示典型錯誤信息,等一天,然后用意思含糊的錯誤代碼通知用戶,當(dāng)他們和你聯(lián)系并告之錯誤代碼時,你知道,是因為被破解了。記注:這樣的陷阱可能被病毒或下載錯誤所觸發(fā),當(dāng)你譴責(zé)可能是你未來的客戶前,先考慮所有可能性。<br>
<br>
不要依賴EXE壓縮程序,幾乎任何EXE壓縮程序(Shrinker, WWPack32, NeoLite
——和所有著名的壓縮軟件)都有反壓縮程序,所以,壓縮程序的保護能力至少支持可配置的編碼。以上(和其它)壓縮程序的反壓縮軟件并未廣泛流傳,但是,不要依賴那些軟件作為你程序僅有的一個“保護”。
<br>
--------------------------------------------------------------------------------<br>
高級技巧——從匯編來的奇想<br>
--------------------------------------------------------------------------------<br>
rcr/rcl 把戲<br>
如果RCR/RCL執(zhí)行某值,對于破解者來說是痛苦的——在不知道最初操作時轉(zhuǎn)送標(biāo)志(Carry
Flag)的值的情況下,你無法逆轉(zhuǎn)之或否定其作用,如果轉(zhuǎn)送標(biāo)志是由一些其它煩瑣的關(guān)鍵操作所產(chǎn)生的話,那么你幾乎勝利了。<br>
<br>
到處貼條件轉(zhuǎn)移<br>
條件跳轉(zhuǎn)對于反向工程來說并不有趣。沒有循環(huán),只是跳轉(zhuǎn),作為有條件的路障,包括你那些可愛的KEY處理代碼。這樣,沒有簡單的反向操作可以執(zhí)行。<br>
<br>
使用部分代碼作為奇妙的數(shù)字表。<br>
(更適合評論部分)如果你像多數(shù)的破解者或喜歡用SOFT-ICE(一個流行的破解工具)改東西,你無法想象這會有多惱人,
<br>
<br>
和破解者斗智<br>
這部分很有趣:-) 貼上連續(xù)的NOP,就像你在做自我代碼修改(天啊,什么亂七八糟的,NOP?哈!自我代碼修改!白癡會花三年去捉摸那些本來該是什么東西)。混亂的注釋代碼。把代碼分成小塊,把它們遍布在可執(zhí)行代碼中,在它們中間使用(最好是有條件的)跳轉(zhuǎn)。<br>
<br>
提早發(fā)現(xiàn)SoftIce.。<br>
現(xiàn)在搞垮計算機,你可以搞垮奔騰或奔騰MMX計算機甚至不需要VXD,可以用操作碼:
F0 0F C7 C8 (非法的帶鎖定前綴的 cmpxchg8b 指令). 處此之外,
我們必須采取真正的措施:使用VXD把CPU帶出保護模式。Windows
不喜歡那樣,奇跡?另一方面,不要浪費太多的時間去寫破壞反匯編程序或調(diào)試的代碼。那沒用,相信我,有人寫了那些東西,另一些人立刻會有辦法繞過它,所以,把你的興趣轉(zhuǎn)移到更重要的地方——那些容易且很快見效的措施,就像上面的技巧。<br>
--------------------------------------------------------------------------------<br>
針對DELPHI控件的破解<br>
--------------------------------------------------------------------------------<br>
讓我們了解一些關(guān)于Borland公司新開發(fā)工具的內(nèi)核吧。這些知識會使我們加快破解的速度,當(dāng)然也使那些共享軟件程序員更小心的使用Delphi,輕易的把他們的“秘密”暴露在那些好奇的目光下。<br>
VCL是指Visual Component Library(可視化組件庫),它近來被Borland的可視化編程工具所使用,比如Delphi和C++Builder。<br>
這些環(huán)境使用特有的資源格式,在Resource Workshop(Borland編輯資源的一個工具)中顯示為“RCDATA'”。這些資源中含有Delphi所謂的窗體(Forms),窗體是程序的窗口(Windows)。所有對窗口的設(shè)計的信息都包含內(nèi),當(dāng)一個典型的Delphi程序開始運行時,其初始化代碼建立這種窗體,并從資源中讀取所需要的信息。有時,這種讀取會被推遲——不常用的窗體在需要時才被建立和刪除。這樣的機制是Delphi的最大優(yōu)勢也是其最大的缺點。它大大提高了程序設(shè)計的速度,但是對于整個應(yīng)用程序,它減慢了程序被調(diào)用時的速度<br>
<br>
這部分中真正有趣的是:例程(被用來響應(yīng)用戶界面的窗體的元素)的地址是按名字邦定的。所以只要知道這些名字,我們就可以知道所需要的地址。<br>
如果你曾經(jīng)破解過我的Delphi程序,你一定對那些煩瑣的庫之間的調(diào)用,比如API調(diào)用斷點(breakpoint)和類似“do
xx”的代碼。<br>
[討論一個十分有名的用Delphi寫的應(yīng)用程序]
就像你將見到的那樣,我徹底的破解了它,而且十分輕松。我第一次安裝以后一個星期后,我發(fā)現(xiàn)了一條令人厭惡的信息——“你的測試已經(jīng)過期”。<br>
首先要做的是使用資源或窗體探測(SPY)工具收集有關(guān)目標(biāo)EXE文件的有關(guān)信息。你也許會想到去查看TVALIDATORDLG——很明顯,用戶名和注冊碼是由此輸入的。但是你會發(fā)現(xiàn)那只是一個簡單的對話盒,真正的工作是由其調(diào)用者TSPLASHFORM來完成的。這是個惱人的窗口,它在程序關(guān)閉、按“關(guān)于”按鈕和程序開始部分不斷出現(xiàn)。<br>
你可以選擇TsplashForm并且以文本格式觀察之。關(guān)于按鈕(Button)和標(biāo)簽(Label)的許多信息都將被很清楚的顯示。讓我們注意以下部分(接近最后):
<br>
<br>
object RegButton: TButton<br>
Left = 200<br>
Top = 176<br>
Width = 97<br>
Height = 25<br>
Caption = 'Register'<br>
TabOrder = 1<br>
OnClick = RegButtonClick<br>
end<br>
<br>
這是什么?這是帶有“注冊”標(biāo)題的按鈕。你可以看到它的大小,位置......和一個有啟發(fā)性的名字——“OnClick”。
“OnClick”告訴我們當(dāng)用戶按注冊按鈕時所調(diào)用的例程,當(dāng)我們有了名字(Name),我們可以搜索例程的地址。這是因為例程是和按鈕以名字(Name)邦定的。<br>
使用一個十六進制編輯器觀察"RegButtonClick",我發(fā)現(xiàn)了兩次,第二個是資源本身,第一個是在地址表(Address
Table)中的。<br>
<br>
000A4990 ____ ____ ____ BC57 4A00 0E52 6567 4275 ______.WJ..RegBu<br>
<br>
000A49A0 7474 6F6E 436C 6963 6B__ ____ ____ ____ ttonClick_______<br>
<br>
現(xiàn)在,觀察名字(Name)前那寫神奇的數(shù)字,有一個字節(jié)('0E')指出了"RegButtonClick"
的長度(14 個字符)。而且,在此之前有其地址:004ABC57。<br>
<br>
有的反匯編程序會以為文件太長,并且不能正確反匯編這部分——然而,使用特殊的工具,我們可以在此停止,對了,就停在我們按按鈕的部分。<br>
這些會使你發(fā)現(xiàn)一個調(diào)用(CALL)。跟蹤之,你會在44ECC8發(fā)現(xiàn)一個“標(biāo)準(zhǔn)棧框架(standard
stack frame)”:<br>
<br>
0044ECC8 55 push ebp<br>
0044ECC9 8BEC mov ebp, esp<br>
這是一種程序員所寫的,在高級例程開始部分所需要的東西。我們已經(jīng)避開了一長串由Windows通知(Notification)所產(chǎn)生的VCL庫調(diào)用,來到了正確的位置。<br>
在此,你可以方便的用設(shè)置斷點的方法來測試一些調(diào)用——你會發(fā)現(xiàn)它們是用來顯示要求輸入用戶名和口令的對話盒。然后,注冊碼是由用戶名和用戶的輸入比較所產(chǎn)生的。你可以輸入你所選擇的用戶名,和任何東西作為注冊碼,在BPX到44ED69之后,一個調(diào)用一個例程用來比較兩個字符串。D
EDX會顯示你輸入(冒牌)的注冊碼,EAX會顯示正確的注冊碼,簡單吧?初學(xué)者只需10分鐘就可以完成,<br>
如何避免被類似的程序破解?<br>
閱讀我以上的技巧。最基本的是不要用由雙擊按鈕或有屬性監(jiān)視器(Object
inspector.)生成默認(rèn)的方法,在程序的其它部分寫代碼,最好是在另外的模板中,然后用類似以下的代碼與按鈕關(guān)聯(lián):<br>
<br>
RegButton.OnClick := RegButtonClick;<br>
<br>
當(dāng)然你需要在窗體建立時(被調(diào)用前)執(zhí)行這段代碼,最好是被一些無關(guān)的例程所調(diào)用,當(dāng)然這遠(yuǎn)遠(yuǎn)不能防止你的程序被破解,但至少不會像你剛才看到的那樣容易。<br>
<br>
--------------------------------------------------------------------------------<br>
關(guān)于注冊碼的提示<br>
(如果你無法避免它) <br>
--------------------------------------------------------------------------------<br>
在安全,可行性,可編程性和最終用戶的頭痛間尋求平衡。 <br>
太長的,無字母的注冊碼可能造成連續(xù)的輸入錯誤。考慮要求輸入確認(rèn)域(多數(shù)是口令),或者至少提供一個“不固定”的注冊碼輸入域,以便用戶可以每次重寫注冊碼,也許最后正確的輸入了。許多人會僅僅“瞥一眼”以比較輸入的注冊碼和他們所收到E-Mail里的注冊好,他們最終認(rèn)為,他們輸入了正確的注冊碼。但是字體太小或者他們懶得注意到底“I”和“1”被交換了位置(就像'l83jjd_0)pH1lTe'
)。<br>
根據(jù)不同用戶的反饋,注冊碼輸入?yún)^(qū)必須無限制的接受任何長度的信息。不要讓破解者了解你的注冊碼的類型——如果你采取“在線確認(rèn)(online-verification)”并顯示它有10個字符長或只接受大寫字母將給予他們幫助——不要這樣做!<br>
計算潛在用戶的數(shù)量!沒有比這樣的事更壞的了:你把用戶數(shù)限制在9,999,你不希望有第10,000個用戶,因為如此你就必須升級你的注冊碼以滿足這第1,000個用戶。<br>
如果你的注冊碼有10位,可能有10^10個注冊碼。但是,你的應(yīng)用程序可能只允許10^4(10,000)個用戶,你必須采取某種算法使10^4個用戶每人一個得到10^10個注冊碼中一個。這保護了用戶和你的應(yīng)用程序本身受到窮舉攻擊(就像一個使用VXD的宏播放器那樣)。如果只有10^4個用戶,而你定義了10^9個合法的注冊碼,那么平均每試10次,就會有一個“合法”的注冊碼。然而,在預(yù)期只有10^4的情況下,平均每10^6次才會成功。即使是使用高速的計算機和極快的宏播放器(擊鍵模擬輸入注冊碼),要在10^6中尋找到需要的注冊碼所花費的時間也是無法計算的。<br>
從用戶名(User name)到注冊碼(Registeration code)不應(yīng)該只有簡單的運算,它必須是有既精通數(shù)學(xué)又精通匯編語言的人用匯編語言實現(xiàn)(記注,Delphi仍然允許你直接使用匯編(ASM)代碼)!然后,檢查你的操作,繪制流程圖,了解它是如何工作的。要徹底了解你自己的工作,特別是它的不足之處。<br>
要有創(chuàng)新意識,不要用任何看起來簡單、迅速、有效的東西,除非你信奉類似愛因斯坦的相對論的學(xué)說。你的方法的確是簡單,也的確是迅速,但是絕對不是有效,的確是容易被破解。我十分抱歉,我并非天才,沒有找到一種行之有效的保護方案能維持太長時間。<br>
<br>
只是些想法:)<br>
<br>
Richey<br>
<br>
如果你有這方面的技巧或建議,請給我發(fā)電子郵件!<br>
如果你想支持我在本頁上的工作,或簡單的說聲“謝謝”為了將我的財富與您分享,我將很高興,如果你能注冊我的一個程序<br>
在你的支持下,這將不斷更新,最后更新98年9月28日<br>
</td>
</tr>
</table>
</center></div>
</body>
</html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -