線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4475
推到 Plurk!
推到 Facebook!

如何使破解你程式的人感到頭疼一點

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-06 14:48:44 IP:61.221.xxx.xxx 未訂閱
如何使破解你程式的人感到頭疼一點 當發現自己?之工作了好幾個月,甚至幾年的程式被人破解的時候,所受的傷害是難以形容的。 我作?一個共用軟體作者,並不是因?我在乎那幾塊錢而已(我不想在這裏做具體的計算,那會使我更加難過...),不,我總是使我的程式盡可能的便宜,使包括學生和自由軟體作者在內的每個人都能用得起。 然而,我知道破解軟體的魅力(如果你對程式破解者(Cracker)和黑客(Hacker)抱絕對的不寬容態度,那?請原諒。但是我的一位同學是心理學家,我們一直在尋找其原因)。破解一個受限制的軟體程式就像解一個(有時是很狡猾)的謎語,而你可能沈迷于這種解迷的感覺(當我發現我祖母在幾個月裏整天沈迷在玩字謎遊戲時想起這些的)。問題是(我們現在涉及到這種“遊戲”的非法部分):程式破解者不會僅僅滿足於只讓自己瞭解他的“天賦”。他必須傳播消息,發佈他的“破解” (Cracker)(看一下破解包,多數是由以下部分組成:1、破解工具;2、簡短的說明;3、一個巨大的文件,包含有似乎作者不亞于世界上任何偉人,或者被破解的程式像所有其他程式一樣無法用那脆弱的保護方式來阻止破解者破解程式的進程的資訊)。 但是現在,玩笑徹底結束了。發佈這些破解包(讓我們公正些:“研究其可能性“)給其他人,散佈到網站上,新聞組,郵件列表,匿名FTP,光碟,"abonnements"以及任何其他地方,他們明顯地破壞了所有那些花時間和精力在他們軟體?品上的收益。雖然沒有人可以說,所有收到或者下載破解程式的人永遠也不會購買。但是散佈破解程式的確是犯罪,就像有人在商場分發你車鑰匙的拷貝——他是否以此賺錢又有何分別呢? 早些日子,我沒有真正去花時間保護我的?品以防止被破解,但發現周圍有它們的數個破解之後。我對自己說:?什?讓它如此簡單? 作?一個程式師,我當然知道,不,決不!——程式不可能是破解不了的,而且我知道,每個有吸引力的程式都遲早會有破解(至少是盜版或非法複製品)出現,但至少,我可以避免最糟糕的錯誤。 多數的高階語言程式師不再懂得組合語言了,所以,他們使用的“保護措施“多數是很脆弱的。我對彙編懂得也不多,所以我決定開始仔細收集防破解(Anti-Crack)的技巧。我也努力“從另一方面努力學習”,你在這裏看到的許多技巧我都是從典型的破解技術中捉摸出來的,包括網上各種各樣的破解指南和閱讀甚至是由專業破解者給出程式保護技巧(他們給我們這些技巧以給自己更大的挑戰),我希望自己學得足夠好,也想把我的經驗在此與大家分享,有些技巧可能已經在其他文章中有所提及,但在此列出的最?完整。許多技巧都是針對Windows的,但他們可以被移植到其他作業系統中去。 這篇問答集是全新的,如果你覺得我遺漏了一些要點或者有用的、一個典型的Delphi程式師可以簡單的加入其程式,以加強對程式保護的技巧,請告訴我,如果你允許,我會把它加到這裏,否則我會告訴你我對它的體驗。 不要問我問題,我可能無法回答: 1) 我已經提到,我對底層的東西沒有什?研究; 2) 我不會把範例文件發給你,因?我沒有準備過發佈任何東西,如果我有一些,那?都在這裏了; 3) 最後,我不會提供任何人我發現這些技巧的連接,請記注,這是一個專注於編程的站點,而非提供可利用的破解程式。需要更多的保護程式的資訊,可以看我的DELPHI技巧頁。 -------------------------------------------------------------------------------- 最後,這裏是: 如何使破解你程式的人感到頭疼 (技巧未按其重要性排列) -------------------------------------------------------------------------------- 不要用有意義的過程名字,例如: function RegistrationOK: Boolean;//譯者按:註冊確認 無論你在函數中編碼多?奧妙和複雜,無論你相信於否一個有經驗的破解者都會在10-20秒內刪除之。 作?一種選擇,你可以把程式中需要的一部分代碼置入其內,如果破解者禁止了這個函數,你的程式將?生錯誤的結果。 不要用有意義的檔案名比如License.Dat.。 用類似Asymetric(美國軟體公司,代表軟體Toolbook)的加密. 僅僅不尋常的檔案名常常是不夠的,好的加密(編碼)可以讓破解者忙幾個月(如果他願意) 加上長時間延遲,當發現被自身被損壞時,不要發出警告,隨後開始等待,也許是一或兩天(破解者討厭者東西)。 加入短暫延遲,當輸入口令或做其他檢測時,停一到兩秒鐘,使窮舉無法繼續。簡單易行,但用處不大。 使用相互檢查,在DLL和EXE中互相檢查,這遠談不上安全,但可以使破解變得更困難。 在軟體中使用自我修復,你知道就像糾錯Modem和容錯硬碟,這技術已經有許多年了,怎?沒人用在保護軟體上?這方法最大的優點是:如果破解者使用反編譯工具,它會見到一串無用的列表。 修補你的軟體!把代碼變?每次調用不同的確認程式段,用“其人之道還治其人之身”。 把序列號放在不尋常的地方,比如資料庫欄位的屬性中,經常聽到或讀到,“用一個DLL的名字,然後把它放到系統目錄裏”,聽的太多了,不要用哦:) 把序列號放到不同的地方。 不要依靠系統時間,從一些文件取得時間,比如SYSTEM.DAT,SYSTEM.DA0和BOOTLOG.TXT,把它們和系統時間進行比較,要求它們比上次運行的時間晚(但是記住,許多用戶近來在捉千年蟲)。 不要用明文字串告訴用戶:"對不起,不過...(或類似的東西)"這些是首先尋找的目標,動態建立字串或者加密它們。 用?造的程式調用和字串來灌水。 不要使用一個確認函數,每次你確認用戶,把確認代碼寫在當前過程中。這樣只是讓破解者做更多的破解工作。 使用“保留字”,當使用硬密鑰或口令時,使它們看來像程式碼或者函數調用 (比如., "73AF" 或 "GetWindowText")。這確實工作的很不錯,可以迷惑一些反編譯工具。 沒有“禁止”特徵,如果你的程式有不保存資料版本(Crapware Version),不要包含“灰”色功能表項。沒有保存項等於沒有保存,就那?簡單。 避免不必要的提示資訊,唯一提醒用戶他尚未註冊的只是“關於”對話盒,此對話盒要動態建立,以便保密。這有兩個原因:許多程式師有這樣的觀點:多餘的提示資訊會在他們的顧客中?生敵人,這是愚蠢的。一個可能是更重要的原因是:多餘提示資訊會引導對你代碼的反向工程而且經常直接引導至你的程式保護代碼。 經常更新,頻繁的更新指:經常更換代碼,典型(簡單)的破解只修改你的硬位元組代碼位置,這可能當它還未面市已經過期了。並且保證上載到公共伺服器,使你可以更好的控制程式,人們無法找到破解所針對的舊版本。是的,這樣無法防止包括舊版本和破解包盜版,如果他們那?做了,你至少可以?把他們的硬碟擠滿而做點貢獻。 最後,花點時間考慮保護你自己的軟體。它是否值得保護?它是否更應該改進你的軟體?如果沒人用你的軟體,保護也就沒有意義了,不要過高估計你軟體“對世界的重要性”。 -------------------------------------------------------------------------------- 你可以考慮到的更多技巧 -------------------------------------------------------------------------------- 用一個連續的幾KB長的數學公式使任何想破解它的人精神崩潰。這使用一個密碼生成器幾乎無效——阻止窮舉攻擊也是有效的。 小心運行時刻庫!當寫BETA版時,完全使用之,在正式版中重寫部分函數,這至少可以使破解者的生活更艱苦些。 毀壞結果,毀壞結果有時是保護程式的有效措施。 例如:想象一個圖表程式,或者類似的程式,只是禁止列印然後根據一些註冊碼恢復列印是最常見的毀壞結果的程式。允許你列印。當?生要列印資料結構時,用某種方式破壞之,在列印前根據註冊碼或其他東西恢復。甚至,讓破壞更奧妙,假設你有一個餅形圖要列印,不改變任何東西,但加入一些不大的亂數值在你的資料中——這樣就破壞了。圖表看上去“不是很糟”,但是無論如何將無法使用(比如,如果是按20%的隨機次序改變的)發現這樣的保護,如果這和註冊碼相關聯,無疑會使破解需要更對的時間,一是必須深入你內部的資料結構並找到可怕的破壞和恢復資料代碼。 陷阱,一個我不太肯定,但聽說有程式使用的方法:用CRC校驗你的EXE文件,如果它被改變了,不要顯示典型錯誤資訊,等一天,然後用意思含糊的錯誤代碼通知用戶,當他們和你聯繫並告之錯誤代碼時,你知道,是因?被破解了。記注:這樣的陷阱可能被病毒或下載錯誤所觸發,當你譴責可能是你未來的客戶前,先考慮所有可能性。 不要依賴EXE壓縮程式,幾乎任何EXE壓縮程式(Shrinker, WWPack32, NeoLite ——和所有著名的壓縮軟體)都有反壓縮程式,所以,壓縮程式的保護能力至少支援可配置的編碼。以上(和其他)壓縮程式的反壓縮軟體並未廣泛流傳,但是,不要依賴那些軟體作?你程式僅有的一個“保護”。 -------------------------------------------------------------------------------- 高級技巧——從彙編來的奇想 -------------------------------------------------------------------------------- rcr/rcl 把戲 如果RCR/RCL執行某值,對於破解者來說是痛苦的——在不知道最初操作時轉送標誌(Carry Flag)的值的情況下,你無法逆轉之或否定其作用,如果轉送標誌是由一些其他煩瑣的關鍵操作所?生的話,那?你幾乎勝利了。 到處貼條件轉移 條件跳轉對於反向工程來說並不有趣。沒有迴圈,只是跳轉,作?有條件的路障,包括你那些可愛的KEY處理代碼。這樣,沒有簡單的反向操作可以執行。 使用部分代碼作?奇妙的數位表。 (更適合評論部分)如果你像多數的破解者或喜歡用SOFT-ICE(一個流行的破解工具)改東西,你無法想象這會有多惱人, 和破解者鬥智 這部分很有趣:-) 貼上連續的NOP,就像你在做自我代碼修改(天啊,什?亂七八糟的,NOP?哈!自我代碼修改!白癡會花三年去捉摸那些本來該是什?東西)。混亂的注釋代碼。把代碼分成小塊,把它們遍佈在可執行代碼中,在它們中間使用(最好是有條件的)跳轉。 提早發現SoftIce.。 現在搞垮電腦,你可以搞垮奔騰或奔騰MMX電腦甚至不需要VXD,可以用操作碼: F0 0F C7 C8 (非法的帶鎖定字首的 cmpxchg8b 指令). 處此之外, 我們必須採取真正的措施:使用VXD把CPU帶出保護模式。Windows 不喜歡那樣,奇??另一方面,不要浪費太多的時間去寫破壞反組合語言程式或調試的代碼。那沒用,相信我,有人寫了那些東西,另一些人立刻會有辦法繞過它,所以,把你的興趣轉移到更重要的地方——那些容易且很快見效的措施,就像上面的技巧。 -------------------------------------------------------------------------------- 針對DELPHI控制項的破解 -------------------------------------------------------------------------------- 讓我們瞭解一些關於Borland公司新開發工具的內核吧。這些知識會使我們加快破解的速度,當然也使那些共用軟體程式師更小心的使用Delphi,輕易的把他們的“秘密”暴露在那些好奇的目光下。 VCL是指Visual Component Library(視覺化元件庫),它近來被Borland的視覺化編程工具所使用,比如Delphi和C Builder。 這些環境使用特有的資源格式,在Resource Workshop(Borland編輯資源的一個工具)中顯示?“RCDATA'”。這些資源中含有Delphi所謂的表單(Forms),表單是程式的視窗(Windows)。所有對視窗的設計的資訊都包含內,當一個典型的Delphi程式開始運行時,其初始化代碼建立這種表單,並從資源中讀取所需要的資訊。有時,這種讀取會被推遲——不常用的表單在需要時才被建立和刪除。這樣的機制是Delphi的最大優勢也是其最大的缺點。它大大提高了程式設計的速度,但是對於整個應用程式,它減慢了程式被調用時的速度 這部分中真正有趣的是:常式(被用來回應用戶介面的表單的元素)的位址是按名字邦定的。所以只要知道這些名字,我們就可以知道所需要的地址。 如果你曾經破解過我的Delphi程式,你一定對那些煩瑣的庫之間的調用,比如API調用中斷點(breakpoint)和類似“do xx”的代碼。 [討論一個十分有名的用Delphi寫的應用程式] 就像你將見到的那樣,我徹底的破解了它,而且十分輕鬆。我第一次安裝以後一個星期後,我發現了一條令人厭惡的資訊——“你的測試已經過期”。 首先要做的是使用資源或表單探測(SPY)工具收集有關目標EXE文件的有關資訊。你也許會想到去查看TVALIDATORDLG——很明顯,用戶名和註冊碼是由此輸入的。但是你會發現那只是一個簡單的對話盒,真正的工作是由其調用者TSPLASHFORM來完成的。這是個惱人的視窗,它在程式關閉、按“關於”按鈕和程式開始部分不斷出現。 你可以選擇TsplashForm並且以文本格式觀察之。關於按鈕(Button)和標簽(Label)的許多資訊都將被很清楚的顯示。讓我們注意以下部分(接近最後): object RegButton: TButton Left = 200 Top = 176 Width = 97 Height = 25 Caption = 'Register' TabOrder = 1 OnClick = RegButtonClick end 這是什??這是帶有“註冊”標題的按鈕。你可以看到它的大小,位置......和一個有?發性的名字——“OnClick”。 “OnClick”告訴我們當用戶按註冊按鈕時所調用的常式,當我們有了名字(Name),我們可以搜索常式的地址。這是因?常式是和按鈕以名字(Name)邦定的。 使用一個十六進位編輯器觀察"RegButtonClick",我發現了兩次,第二個是資源本身,第一個是在地址表(Address Table)中的。 000A4990 ____ ____ ____ BC57 4A00 0E52 6567 4275 ______.WJ..RegBu 000A49A0 7474 6F6E 436C 6963 6B__ ____ ____ ____ ttonClick_______ 現在,觀察名字(Name)前那寫神奇的數位,有一個位元組('0E')指出了"RegButtonClick" 的長度(14 個字元)。而且,在此之前有其地址:004ABC57。 有的反組合語言程式會以?文件太長,並且不能正確反彙編這部分——然而,使用特殊的工具,我們可以在此停止,對了,就停在我們按按鈕的部分。 這些會使你發現一個調用(CALL)。跟蹤之,你會在44ECC8發現一個“標準棧框架(standard stack frame)”: 0044ECC8 55 push ebp 0044ECC9 8BEC mov ebp, esp 這是一種程式師所寫的,在高級常式開始部分所需要的東西。我們已經避開了一長串由Windows通知(Notification)所?生的VCL庫調用,來到了正確的位置。 在此,你可以方便的用設置中斷點的方法來測試一些調用——你會發現它們是用來顯示要求輸入用戶名和口令的對話盒。然後,註冊碼是由用戶名和用戶的輸入比較所?生的。你可以輸入你所選擇的用戶名,和任何東西作?註冊碼,在BPX到44ED69之後,一個調用一個常式用來比較兩個字串。D EDX會顯示你輸入(冒牌)的註冊碼,EAX會顯示正確的註冊碼,簡單吧?初學者只需10分鐘就可以完成, 如何避免被類似的程式破解? 閱讀我以上的技巧。最基本的是不要用由雙擊按鈕或有屬性監視器(Object inspector.)生成默認的方法,在程式的其他部分寫代碼,最好是在另外的模板中,然後用類似以下的代碼與按鈕關聯: RegButton.OnClick := RegButtonClick; 當然你需要在表單建立時(被調用前)執行這段代碼,最好是被一些無關的常式所調用,當然這遠遠不能防止你的程式被破解,但至少不會像你剛才看到的那樣容易。 -------------------------------------------------------------------------------- 關於註冊碼的提示 (如果你無法避免它) -------------------------------------------------------------------------------- 在安全,可行性,可編程性和最終用戶的頭痛間尋求平衡。 太長的,無字母的註冊碼可能造成連續的輸入錯誤。考慮要求輸入確認域(多數是口令),或者至少提供一個“不固定”的註冊碼輸入域,以便用戶可以每次重寫註冊碼,也許最後正確的輸入了。許多人會僅僅“瞥一眼”以比較輸入的註冊碼和他們所收到E-Mail裏的註冊好,他們最終認?,他們輸入了正確的註冊碼。但是字體太小或者他們懶得注意到底“I”和“1”被交換了位置(就像'l83jjd_0)pH1lTe' )。 根據不同用戶的反饋,註冊碼輸入區必須無限制的接受任何長度的資訊。不要讓破解者瞭解你的註冊碼的類型——如果你採取“在線確認(online-verification)”並顯示它有10個字元長或只接受大寫字母將給予他們幫助——不要這樣做! 計算潛在用戶的數量!沒有比這樣的事更壞的了:你把用戶數限制在9,999,你不希望有第10,000個用戶,因?如此你就必須升級你的註冊碼以滿足這第1,000個用戶。 如果你的註冊碼有10位,可能有10^10個註冊碼。但是,你的應用程式可能只允許10^4(10,000)個用戶,你必須採取某種演算法使10^4個用戶每人一個得到10^10個註冊碼中一個。這保護了用戶和你的應用程式本身受到窮舉攻擊(就像一個使用VXD的宏播放器那樣)。如果只有10^4個用戶,而你定義了10^9個合法的註冊碼,那?平均每試10次,就會有一個“合法”的註冊碼。然而,在預期只有10^4的情況下,平均每10^6次才會成功。即使是使用高速的電腦和極快的巨集播放器(擊鍵類比輸入註冊碼),要在10^6中尋找到需要的註冊碼所花費的時間也是無法計算的。 從用戶名(User name)到註冊碼(Registeration code)不應該只有簡單的運算,它必須是有既精通數學又精通組合語言的人用組合語言實現(記注,Delphi仍然允許你直接使用彙編(ASM)代碼)!然後,檢查你的操作,繪製流程圖,瞭解它是如何工作的。要徹底瞭解你自己的工作,特別是它的不足之處。 要有創新意識,不要用任何看起來簡單、迅速、有效的東西,除非你信奉類似愛因斯坦的相對論的學說。你的方法的確是簡單,也的確是迅速,但是絕對不是有效,的確是容易被破解。我十分抱歉,我並非天才,沒有找到一種行之有效的保護方案能維持太長時間。
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-05-05 23:54:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!