防破解問答集 (轉)

worldblog發表於2007-12-04
防破解問答集 (轉)[@more@]防問答集 當發現自己為之工作了好幾個月,甚至幾年的被人破解的時候,所受的傷害是難以形容的。 我作為一個共享作者,並不是因為我在乎那幾塊錢而已(我不想在這裡做具體的計算,那會使我更加難過...),不,我總是使我的程式儘可能的便宜,使包括學生和自由軟體作者在內的每個人都能用得起。 然而,我知道破解軟體的魅力(如果你對程式破解者(er)和(er)抱絕對的不寬容態度,那麼請原諒。但是我的一位同學是心理學家,我們一直在尋找其原因)。破解一個受限制的軟體程式就像解一個(有時是很狡猾)的謎語,而你可能沉迷於這種解迷的感覺(當我發現我祖母在幾個月裡整天沉迷在玩字謎遊戲時想起這些的)。問題是(我們現在涉及到這種“遊戲”的部分):程式破解者不會僅僅滿足於只讓自己瞭解他的“天賦”。他必須傳播訊息,釋出他的“破解” (Cracker)(看一下破解包,多數是由以下部分組成:1、破解工具;2、簡短的說明;3、一個巨大的,包含有似乎作者不亞於世界上任何偉人,或者被破解的程式像所有其它程式一樣無法用那脆弱的保護方式來阻止破解者破解程式的程式的資訊)。 但是現在,玩笑徹底結束了。釋出這些破解包(讓我們公正些:“研究其可能性“)給其他人,散佈到網站上,新聞組,列表,匿名,光碟,"abonnements"以及任何其它地方,他們明顯地破壞了所有那些花時間和精力在他們軟體產品上的收益。雖然沒有人可以說,所有收到或者破解程式的人永遠也不會購買。但是散佈破解程式的確是犯罪,就像有人在商場分發你車鑰匙的複製——他是否以此賺錢又有何分別呢? 早些日子,我沒有真正去花時間保護我的產品以防止被破解,但發現周圍有它們的數個破解之後。我對自己說:為什麼讓它如此簡單? 作為一個程式設計師,我當然知道,不,決不!——程式不可能是破解不了的,而且我知道,每個有吸引力的程式都遲早會有破解(至少是或非法複製品)出現,但至少,我可以避免最糟糕的錯誤。 多數的高階語言程式設計師不再懂得語言了,所以,他們使用的“保護措施“多數是很脆弱的。我對彙編懂得也不多,所以我決定開始仔細收集防破解(Anti-Crack)的技巧。我也努力“從另一方面努力學習”,你在這裡看到的許多技巧我都是從典型的破解技術中捉摸出來的,包括網上各種各樣的破解指南和閱讀甚至是由專業破解者給出程式保護技巧(他們給我們這些技巧以給自己更大的挑戰),我希望自己學得足夠好,也想把我的在此與大家分享,有些技巧可能已經在其它文章中有所提及,但在此列出的最為完整。許多技巧都是針對的,但他們可以被移植到其它操作中去。 這篇問答集是全新的,如果你覺得我遺漏了一些要點或者有用的、一個典型的程式設計師可以簡單的加入其程式,以加強對程式保護的技巧,請告訴我,如果你允許,我會把它加到這裡,否則我會告訴你我對它的體驗。 不要問我問題,我可能無法回答: 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把帶出保護。Windows 不喜歡那樣,奇蹟?另一方面,不要浪費太多的時間去寫破壞反彙編程式或的程式碼。那沒用,相信我,有人寫了那些東西,另一些人立刻會有辦法繞過它,所以,把你的興趣轉移到更重要的地方——那些容易且很快見效的措施,就像上面的技巧。 -------------------------------------------------------------------------------- 針對DELPHI的破解 -------------------------------------------------------------------------------- 讓我們瞭解一些關於Borland公司新開發工具的核心吧。這些知識會使我們加快破解的速度,當然也使那些共享軟體程式設計師更小心的使用Delphi,輕易的把他們的“秘密”暴露在那些好奇的目光下。 VCL是指Visual Component Library(視覺化庫),它近來被Borland的視覺化程式設計工具所使用,比如Delphi和C++Builder。 這些環境使用特有的資源格式,在Re Workshop(Borland編輯資源的一個工具)中顯示為“RCDATA'”。這些資源中含有Delphi所謂的窗體(Forms),窗體是程式的視窗(Windows)。所有對視窗的設計的資訊都包含內,當一個典型的Delphi程式開始執行時,其初始化程式碼建立這種窗體,並從資源中讀取所需要的資訊。有時,這種讀取會被推遲——不常用的窗體在需要時才被建立和刪除。這樣的機制是Delphi的最大優勢也是其最大的缺點。它大大提高了的速度,但是對於整個應用程式,它減慢了程式被呼叫時的速度 這部分中真正有趣的是:例程(被用來響應使用者介面的窗體的元素)的地址是按名字邦定的。所以只要知道這些名字,我們就可以知道所需要的地址。 如果你曾經破解過我的Delphi程式,你一定對那些煩瑣的庫之間的呼叫,比如呼叫斷點(breakpoint)和類似“do xx”的程式碼。 [討論一個十分有名的用Delphi寫的應用程式] 就像你將見到的那樣,我徹底的破解了它,而且十分輕鬆。我第一次以後一個星期後,我發現了一條令人厭惡的資訊——“你的測試已經過期”。 首先要做的是使用資源或窗體探測(SPY)工具收集有關目標EXE檔案的有關資訊。你也許會想到去檢視TVALIDATORDLG——很明顯,使用者名稱和註冊碼是由此輸入的。但是你會發現那只是一個簡單的對話盒,真正的工作是由其呼叫者TSPLASHFORM來完成的。這是個惱人的視窗,它在程式關閉、按“關於”按鈕和程式開始部分不斷出現。 你可以選擇TsplashForm並且以文字格式觀察之。關於按鈕(Button)和標籤(Label)的許多資訊都將被很清楚的顯示。讓我們注意以下部分(接近最後): 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-裡的註冊好,他們最終認為,他們輸入了正確的註冊碼。但是字型太小或者他們懶得注意到底“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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章