天天看點

防破解問答集 (轉)

防破解問答集 (轉)[@more@]防 破解問答集 當發現自己為之工作了好幾個月,甚至幾年的 程式被人破解的時候,所受的傷害是難以形容的。 我作為一個共享 軟體作者,并不是因為我在乎那幾塊錢而已(我不想在這裡做具體的計算,那會使我更加難過...),不,我總是使我的程式盡可能的便宜,使包括學生和自由軟體作者在内的每個人都能用得起。 然而,我知道破解軟體的魅力(如果你對程式破解者( cracker)和 黑客( hacker)抱絕對的不寬容态度,那麼請原諒。但是我的一位同學是心理學家,我們一直在尋找其原因)。破解一個受限制的軟體程式就像解一個(有時是很狡猾)的謎語,而你可能沉迷于這種解迷的感覺(當我發現我祖母在幾個月裡整天沉迷在玩字謎遊戲時想起這些的)。問題是(我們現在涉及到這種“遊戲”的 非法部分):程式破解者不會僅僅滿足于隻讓自己了解他的“天賦”。他必須傳播消息,釋出他的“破解” (Cracker)(看一下破解包,多數是由以下部分組成:1、破解工具;2、簡短的說明;3、一個巨大的 檔案,包含有似乎作者不亞于世界上任何偉人,或者被破解的程式像所有其它程式一樣無法用那脆弱的保護方式來阻止破解者破解程式的程序的資訊)。 但是現在,玩笑徹底結束了。釋出這些破解包(讓我們公正些:“研究其可能性“)給其他人,散布到網站上,新聞討論區, 郵件清單,匿名 FTP,CD光牒,"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。 這些環境使用特有的資源格式,在Re source 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)代碼)!然後,檢查你的操作,繪制流程圖,了解它是如何工作的。要徹底了解你自己的工作,特别是它的不足之處。 要有創新意識,不要用任何看起來簡單、迅速、有效的東西,除非你信奉類似愛因斯坦的相對論的學說。你的方法的确是簡單,也的确是迅速,但是絕對不是有效,的确是容易被破解。我十分抱歉,我并非天才,沒有找到一種行之有效的保護方案能維持太長時間。 隻是些想法:) Richey

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988371/,如需轉載,請注明出處,否則将追究法律責任。

轉載于:http://blog.itpub.net/10752043/viewspace-988371/