所有軟件都可以被破解嗎?為什麼 開發者不阻止破解版的產生?

首先看看破解版是如何產生的:

使用調試器創建軟件的破解版本。 (調試器是一種特殊類型的軟件,它允許程序員將軟件分解成不同的組成部分,以便發現錯誤,從而消除錯誤。 此外,調試器可以用於逆向工程,或者查看軟件內部的內容,以瞭解其邏輯。 後一種方法主要被惡意軟件研究人員用來研究惡意軟件(或計算機病毒)的內部。 但是它也可以被攻擊者用來“破解”(或者繞過)合法的軟件註冊,或者有時候用來改變軟件的正常行為,例如向其中注入惡意代碼。)

對於這個示例,假設正在被“破解”的軟件被編譯成本機代碼,而不是基於 .NET 或 JavaScript 的應用程序。 (否則查看它的源代碼就顯得有些瑣碎了。) 編譯後的本機代碼要研究起來有點棘手。 (本機意味著代碼直接由 CPU、 GPU 或其他硬件執行。)

因此,讓我們假設攻擊者的目標是繞過軟件中的註冊邏輯,這樣他就不必為此付費。

為了簡單起見,讓我們假設檢查軟件註冊的原始邏輯是用 c + + 編寫的,類似於下面的代碼片段:


所有軟件都可以被破解嗎?為什麼 開發者不阻止破解版的產生?


在本代碼示例中,“ RegistrationName”和“ RegistrationCode”是合法軟件用戶在付費購買許可證後將收到的特殊文本字符串。 (名字通常是那個人的真實姓名或者他的電子郵件地址,代碼是一些與名字相關的特殊字符串。)

在上面的邏輯中,名為“ isRegistrationCodeGood ()”的函數將檢查“ RegistrationName”和“ RegistrationCode”是否被某些專有方法接受。 如果是的話,它將返回 true。 否則就是錯誤的。 該外部代碼將指定執行將遵循的分支(或範圍)。

因此,上面的邏輯要麼顯示註冊失敗或退出:


所有軟件都可以被破解嗎?為什麼 開發者不阻止破解版的產生?


或者,如果註冊代碼和名稱匹配,它將使用名為“ rememberRegistrationParameters ()”的功能將註冊詳細信息保存在持久存儲中(如文件系統或系統註冊中心) ,然後顯示感謝用戶註冊的消息:


所有軟件都可以被破解嗎?為什麼 開發者不阻止破解版的產生?


“破解者”顯然希望為他輸入的任何註冊代碼獲得第二個結果。 但是他們有一個問題。 他們沒有 c++ 源代碼。

因此,攻擊者唯一的辦法就是反彙編二進制代碼(總是以 .exe 和 .dll 文件,並且大部分是 Unix 可執行文件的應用程序包) 然後,攻擊者將使用調試器來研究二進制代碼,並試圖找到我上面提到的註冊邏輯。

接下來,您可以看到我在 c + + 中展示的代碼片段的流程圖,該代碼片段是通過低級調試器提供的。 或者,代碼在編譯後將以二進制形式讀取:

(為了可讀性,我在右邊添加了帶有函數和變量名的註釋。 它們不會出現在攻擊者可以看到的代碼中。)


所有軟件都可以被破解嗎?為什麼 開發者不阻止破解版的產生?


(要理解上面顯示的內容,攻擊者必須對本機代碼的彙編語言指令有很好的瞭解。)

我還需要指出,對於攻擊者來說,擁有上面這樣的反彙編代碼片段是最終的結果。 對他來說,主要的困難是如何在數以百萬計的其他類似代碼行中找到它。 這就是他們面臨的主要挑戰。 沒有多少人能做到這一點,這就是為什麼軟件“破解”是一種特殊技能。

因此,在軟件二進制文件中找到上面的代碼片段之後,“黑客”有兩個選擇:

1)修改(或修補)二進制文件。

2)對“ isRegistrationCodeGood ()”函數進行逆向工程,並複製其邏輯以創建所謂的“ KeyGen”或“ Key Generator”

讓我們回顧一下:

第一個選擇很簡單。 因為攻擊者已經到了這一步,所以他對 Intel x64指令集非常瞭解。 因此,他們只需將地址00007FF645671418(在屏幕截圖中用紅色圈出)的“ jnz short loc 7ff645671430”的條件跳轉為無條件跳轉,或“ jmp short loc 7ff645671430”。 這將有效地刪除任何失敗的註冊代碼條目,任何用戶類型將被接受為一個有效的註冊。

還要注意,這種修改可以通過將二進制代碼中的一個字節從0x75改為0xEB 來實現:


所有軟件都可以被破解嗎?為什麼 開發者不阻止破解版的產生?


但是這種方法帶來了修改原始二進制文件的“代價”。 為此,攻擊者需要編寫他自己的“修補程序”(或者一個小的可執行程序,它將應用我上面描述的修改) 對於攻擊者來說,這種方法的缺點是修補原始可執行文件會破壞其數字簽名,這可能會警告終端用戶或供應商。 此外,攻擊者製造的“修補程序”可以很容易地被終端用戶的防病毒軟件標記和阻止,或者引導犯罪調查人員找到攻擊者的身份。

第二個選擇有點棘手。 攻擊者必須研究“ isRegistrationCodeGood ()”功能,然後將其複製到自己的小程序中,這個程序可以有效地複製原始軟件中實現的邏輯,並讓他根據任何名稱生成註冊代碼,從而使該軟件的任何肆無忌憚的用戶無需支付費用即可註冊該軟件。

許多主要軟件產品的供應商瞭解第二種方法的潛在影響,並試圖通過要求所謂的“身份驗證”來防止這種影響。這基本上是註冊後的第二步,軟件向公司的網絡服務器提交註冊名稱,該服務器返回對軟件的響應,判斷代碼是否合法。 這是微軟在購買 Windows (他們稱之為“激活 Windows”)時做的,也是 Adobe 和許多其他公司做的。 第二步可以在軟件運行時在幕後進行,如果是非法獲得的,通常會導致先前的註冊被取消。

現在你知道軟件是如何“破解”的了。

現在來回答為什麼不可能防止它。 歸根結底,任何軟件代碼都需要由 CPU (如果是二進制本機代碼)或由解釋器或 JIT 編譯器(如果是 JavaScript 或 Net 代碼) 這意味著,如果有一種方法可以閱讀 / 解釋某些內容,不管它有多麼複雜或令人費解,具有足夠知識和持久性的攻擊者也能夠閱讀它,從而破解它。

有一種觀點認為基於雲的軟件更安全,這是事實,因為它的(二進制)代碼保留在服務器上,最終用戶不能直接訪問它。 儘管基於雲的軟件無疑是未來的發展方向,但它也有一些主要的缺點,這些缺點使得它永遠無法完全取代傳統的軟件。 舉幾個例子:

不是每個人都有互聯網連接,或者願意上傳他們的數據。 此外,某人的互聯網連接可能非常昂貴或過於緩慢,使軟件運行差.

那麼就有一個問題了,分佈式計算.。例如,由於為每個玩家渲染每一個場景需要大量的計算資源,暴雪娛樂公司永遠不可能在他們的服務器上完全運行魔獸世界。 因此,讓每個用戶的計算機代替進行渲染是符合他們最大利益的

作為一個軟件開發者,我顯然不喜歡有人盜用軟件許可證。 但是不得不接受它。 好消息是,沒有多少人願意付出更多努力去尋找一個破解版本的軟件。 對於那些下載了修補程序的人來說,主要的問題是,通過下載修補程序、攻擊者的 KeyGen 或 Patcher,他們實際上是在“信任”攻擊者,不會在其中放入任何不是“在軟件包上做廣告”的“討厭的”東西(比如木馬、惡意軟件或鍵盤記錄器) 所以對於這些人來說,問題就變成了——用軟件許可證來潛在地感染你的系統,這值得嗎?

另一邊,一些開發人員對任何試圖竊取他們的軟件許可證的行為反應大。 他們試圖實現各種各樣的對策——從欺騙反向工程師,到在代碼中添加陷阱(如果代碼檢測到代碼正在被調試,可能會做一些討厭的事情) ,到模糊處理或擾亂代碼,到實施各種複雜的 DRM 方案,再到阻止來自某些國家的用戶。 我個人儘量避開所有這些措施。 原因如下:

A)任何類型的反逆向工程策略都可以被具有足夠持久性的攻擊者繞過。 那麼,既然我可以投入時間為我的軟件添加一些有用的東西,使其對合法用戶更有效率,為什麼還要浪費我的時間呢?

B) 一些代碼包可能會用防病毒軟件,這顯然不利於該軟件的市場營銷。 它還為開發人員調試軟件製造了不必要的複雜性。

C) 在代碼中添加陷阱也會對你的合法用戶造成“誤射” ,這真的會激怒他們,甚至可能導致法律訴訟。

D) 任何數字版權保護計劃都可能捕獲100個非法用戶,給10,000個合法用戶帶來極大的不便。 那麼為什麼要這樣對待你的好客戶呢?

E) 我們的統計數據顯示,大約75% 的非法許可證來自中國、俄羅斯、巴西等國家,這些國家的違法行為最為嚴重。 然而,對我們來說最主要的問題是,如果我們強制執行數字版權管理或者增加一些強大的註冊認證,許多想要繞過我們的註冊的人只會使用一個被盜的信用卡號碼。 我們無法控制它。 我們的系統將使用它發送給他們一個合法的許可證。 因此,我們將失去為許可證支付的錢,加上信用卡公司將徵收額外的扣款費用到我們的帳戶,這可能範圍從0.25美元到20美元,除了許可證成本。

F) 正如在評論中指出的,有些公司實際上可能從允許盜版他們的軟件中獲益。 例如,微軟從使用 Windows 操作系統的用戶那裡獲得了大量的免費宣傳,Adobe 的 Photoshop 也是如此。 我同意這個觀點。


分享到:


相關文章: