c# - obfuscator - confuserex




從反向工程保護.NET代碼? (20)

混淆是一種方式,但它不能防止打破應用程序的盜版保護安全。 如何確保應用程序未被篡改,以及如何確保註冊機制不能被反向設計?

此外,還可以將C#應用程序轉換為本地代碼, Xenocode代價過高。

C#提供了很多功能,並且是我的代碼的理想語言,所以再次用C ++編寫整個代碼庫是不成問題的。

.NET中的簽名程序集可以輕鬆地刪除安全證書。


如何確保應用程序不被篡改,以及如何確保註冊機制不能被反向設計。

兩者都有相同的非常簡單的答案:不要將目標代碼交給不可信任的各方,例如(顯然)你的客戶。 在您的機器上託管應用程序是否可行取決於它的功能。

如果它不是一個Web應用程序 ,也許你可以允許使用X轉發到應用程序服務器(或者遠程桌面連接 ,我猜,Windows)進行SSH登錄。

如果你給目標代碼給書呆子類型的人,並且他們認為你的程序可能很有趣,那麼它被破解。 沒有辦法繞過它。

如果你不相信我,請指出一個未被破解和盜版的高調應用。

如果你使用硬件鑰匙,它會使生產更加昂貴,並且你的用戶會恨你。 因為軟件製造商不相信你(我想),因此在地板上插拔並拔出27個不同的USB設備是一個真正的瑣事。

有些軟件包可以加密你的EXE,並在用戶被允許使用時將其解密

當然,解決這個問題的方法是破解“我可以使用它”測試,以便它始終返回true。

一個令人討厭的技巧可能是使用操作代碼的字節值,這些操作代碼在程序中的其他地方以一種骯髒的方式執行測試,這會使得程序崩潰的概率很高,除非值恰到好處。 它使你鏈接到一個特定的架構,但:-(


.NET Reflector只能打開“託管代碼”,這基本上意味著“.NET代碼”。 所以你不能用它來反彙編COM DLL文件,本機C ++,經典的Visual Basic 6.0代碼等。編譯.NET代碼的結構使它非常方便,可移植,可發現,可驗證等。.NET反射器利用這讓你可以看到已編譯的程序集,但反編譯器和反彙編程序絕不是特定於.NET的,只要編譯器一直在使用它。

您可以使用混淆器來使代碼更難閱讀,但是您無法完全防止它被反編譯,同時也不會讓.NET無法讀取。 有一些products (通常很貴),聲稱將託管代碼應用程序“鏈接”到本機代碼應用程序中,但即使這些產品真的有效,確定的人也總會找到方法。

然而,當涉及混淆時,你會得到你所支付的。 因此,如果你的代碼是如此專有以至於你必須竭盡全力來保護它,那麼你應該願意投資於一個好的混淆器。

然而,在我15年左右的編寫代碼的經驗中,我意識到過度保護你的源代碼是浪費時間,沒有什麼好處。 只是嘗試閱讀原始源代碼而不支持文檔,評論等可能非常難以理解。 除此之外,反編譯器提供的無意義變量名稱和現代混淆器創建的意大利面代碼 - 您可能不必過多擔心盜取您知識產權的人。


一般來說,這裡有三組人。

  • 那些不會購買你的軟件並訴諸裂縫,或者如果他們沒有發現,根本不使用你的軟件的人。 不要指望從這個組裡賺錢。 他們要么依靠自己的技能,要么依賴於餅乾(他們傾向於根據自己的實際情況和觀眾的多大來優先考慮自己的時間,更有用的是,越早可以獲得)。

  • 無論您使用何種保護機制,合法用戶都將購買(付費)您的軟件。 不要使用精心設計的保護機制來為合法用戶生活,因為無論如何他們都會為此付費。 複雜的保護機制可能會輕易破壞用戶體驗,並且不希望發生這種情況。 就個人而言,我會投票反對任何硬件解決方案,這會增加軟件的成本。

  • 少數人不會訴諸於“不道德”的破解行為,並且會為您的軟件付費, 因為它的功能受許可機制的保護。 你可能不想讓這個小組很容易繞過你的保護。 但是,您花費在保護軟件上的所有努力將會得到回報,具體取決於這一群人有多大。 這完全取決於您正在構建的軟件類型。

鑑於你所說的話,如果你認為有足夠多的少數人可以被迫購買你的軟件,那就繼續實施某種形式的保護。 考慮一下你可以從這個少數群體中獲得多少錢,而不是你花費在保護上的時間,或者你花在第三方保護API /工具上的金額。

如果你想實現你自己的解決方案,使用公鑰密碼是一個很好的方法(與對稱算法相對),以防止輕鬆入侵。 例如,您可以對您的許可證(序列號或許可證文件)進行數字簽名。 解決這個問題的唯一方法就是反編譯,修改和重新編譯代碼(使用Simucal的答案中提出的技術可以使你更加努力)。


不可能完全保護應用程序,對不起。


任何在客戶端上運行的東西都可以被反編譯和破解。 混淆只會讓它更難。 我不知道你的申請,但99%的時間我不認為這是值得的。


你不能。

您可以採取一些步驟來使其更加困難,但最終本地計算機上的任何可執行文件都是可破解的。 最終,該代碼必須轉換為本地機器代碼,並且每個可運行的應用程序都易受攻擊。

你想做的只是讓它足夠難以破解,使它不值得人們的麻煩。

我有一些建議可以幫助您保護您的應用程序:

  • 混淆你的代碼。 Dotfuscator有免費版本,並附帶Visual Studio。
  • 使用公鑰/私鑰或非對稱加密來生成您的產品許可證。 這確保只有可以生成您的許可證代碼。 即使您的應用程序破解,您也可以確定它們不會為您的應用程序釋放密鑰生成器,因為不可能扭轉密鑰生成算法。
  • 使用第三方打包程序將.NET可執行文件打包到加密的Win32包裝應用程序中。 Themida是更好的之一。 這阻止了人們在.NET Reflector中反映你的應用程序,並且讓解包反轉變得很痛苦。
  • 寫你自己的定制打包機 。 如果第三方包裝商太貴,請考慮編寫自己的包裝。 有時候,定制包裝器可能會非常有效,因為關於如何解包它們的方法並不多。 本教程如何編寫自己的打包程序提供了大量有關編寫自己的Win32打包程序的信息。

但最終,如果人們希望你的應用程序破解,他們會。 看看那裡的所有商業軟件,它們都有大量的資源來保護他們的應用程序,然而在應用程序甚至公開發布之前它們都被破解了。

一個熟練的逆向工程師可以啟動IDA-Pro並且無論您做什麼,都可以像黃油一樣切入您的應用程序。 一個打包的應用程序可以解壓縮,混淆只會阻止它在公園散步。 您用複雜的許可證代碼所做的所有努力都可以通過單字節補丁來解決。

你只需要承認人們非常有可能會盜用你的軟件。 有些人永遠不會為你的申請付款,無論這些人是你不需要擔心的人。

然而,許多企業在那里永遠不會冒險提起訴訟,而且樂於購買軟件許可證,並且許多計算機用戶不願冒險,發現錯誤或不具備足夠的技術知識來剽竊他們。 這些都是您的真正客戶,您應該專注於為他們提供良好的用戶體驗,並忽視破解軟件的人員。

我之前有過盜版的申請,我認為這是個人冒犯。 在這裡,我是一個小時代的開發者,將我的心和靈魂傾注在應用程序中,這些人膽怯地從我身上偷盜?! 他們直接從我口袋裡拿錢!

我立即加入了一堆嚴厲的DRM代碼,並企圖用任何非法或破解的副本破壞任何人。 我當然應該努力使自己的應用程序更好,而不是試圖阻止不可避免的事情。 不僅如此,但是我傷害了我的真正客戶,我將投入所有這些額外的保護。

經過漫長的戰鬥之後,我意識到自己正在與潮汐作鬥爭,而這一切浪費都是徒勞的。 除了準系統許可證功能外,我拿出了所有的電話家庭代碼,並且從不回頭。


你與很多人分享的秘密不是秘密。 如果你的代碼中有秘密東西,混淆它就沒有保護; 它只需要一次去混淆。 如果你有一個秘密,你不想與你的客戶分享,那麼不要與你的客戶分享 。 將您的代碼編寫為Web服務,並將您的超級密碼保存在您自己的服務器上,只有您可以看到它。


只需添加警告:如果您要使用混淆,請檢查一切仍然有效! 混淆可能會改變類和方法名稱之類的東西。 因此,如果您使用反射來調用某些方法和/或類(如在插件體系結構中),則應用程序在混淆後可能會失敗。 此外,堆棧跟踪可能無法追查錯誤。


坦率地說,有時我們需要混淆代碼(例如,註冊許可證類等)。 在這種情況下,您的項目不是免費的。 國際海事組織,你應該支付一個好obfucator。

Dotfuscator隱藏您的代碼, .NET Reflector在嘗試反編譯時顯示錯誤。


如果你希望人們能夠運行你的代碼(如果你不這樣做,那你為什麼要把它寫在第一位?),那麼他們的CPU需要能夠執行你的代碼。 為了能夠執行代碼,CPU需要能夠理解它。

由於CPU笨拙,而人類不是,所以這意味著人類也可以理解代碼。

只有一種方法可以確保你的用戶沒有得到你的代碼:不要給他們你的代碼。

這可以通過兩種方式實現: 軟件即服務 (SaaS),即在服務器上運行軟件,並且只允許用戶遠程訪問它。 例如,這是使用的模型。 我很確定不會混淆他們的代碼,但是你不能反編譯它。

另一種方式是設備模型:不是給用戶提供代碼,而是給他們一台包含代碼的計算機。 這是遊戲機,大多數移動電話和TiVo使用的模型。 請注意,這僅適用於“擁有”整個執行路徑:您需要構建自己的CPU,自己的計算機,編寫自己的操作系統和自己的CLI實現。 然後, 只有這樣你才能保護你的代碼。 (但請注意,即使是最微小的錯誤也會使你的所有保護措施失效,微軟,蘋果,索尼,音樂行業和電影業都可以證明這一點)。

或者,您可能什麼也不做,這意味著您的代碼將受版權法自動保護。



您可以..

Microsoft SLP服務 InishTech的軟件潛能提供了幫助保護代碼而不影響應用程序功能的能力。

更新:(披露:我在Eazfuscator.NET上工作)是什麼讓微軟SLP服務軟件的潛力不同於虛擬化代碼的能力,所以你一定可以 。 自問題最初提出幾年後, 今天有更多的產品也可以在類似的基礎上工作,例如:



是。 這是真的。 如果代碼沒有被混淆,.NET代碼非常容易反向工程。

混淆會給試圖對軟件進行反向工程的人增加一層煩惱。 根據你獲得的版本,你會得到不同程度的保護。

Visual Studio包含一個Dotfuscator版本。 由於它是一個捆綁版本,你絕對不會得到最強烈的混淆。 如果你看看他們的功能列表,你會發現你錯過了什麼(以及應用程序將如何使你的代碼更安全)。

有一些其他免費或開源的.NET混淆器(但我不能評論它們的質量或使用的各種方法):

最後,沒有什麼是完美的。 如果有人真的想看看你的軟件如何工作,他們會。


根據我的經驗,讓您的應用程序或庫更難以破解會傷害您誠實的客戶,同時只會稍微拖延不誠實的客戶。 專注於製造優質,低摩擦的產品,而不是付出很大的努力來拖延不可避免的。



請記住,99%以上的用戶不會對檢查可執行文件感興趣,以了解其工作原理。

鑑於很少有人會打擾嘗試,而且大多數混淆器都可以解決,是否值得你花時間和精力?

您最好花時間改進產品,以便更多人使用它。


這裡有一個想法:你可以讓公司託管一台服務器,讓你的軟件的所有實例都需要連接到該服務器。 只需讓他們連接並驗證註冊密鑰是不夠的 - 他們只會刪除支票。 除了密鑰檢查之外,還需要服務器執行一些客戶端無法執行的重要任務,因此無法刪除。 這當然可能意味著你的服務器上有很多繁重的處理,但它會讓你的軟件難以竊取,並且假設你有一個好的密鑰方案(檢查所有權等),密鑰也很難偷。 這可能比您想要的更具侵入性,因為它會要求您的用戶連接到互聯網以使用您的軟件。


那麼,你不能充分保護你的產品不被破解,但是你可以最大化/提高安全級別,並使它有點太難以被新手和中間餅乾破解。

但要記住,沒有任何東西是不可破解的,只有服務器端的軟件得到很好的保護,不能被破解。 無論如何,為了提高應用程序的安全級別,你可以採取一些簡單的步驟來防止一些破解者“不是全部”破解你的應用程序。 這些步驟將使這些餅乾瘋狂,也許絕望:

  • 混淆你的源代碼,顯然這會讓你的源代碼看起來像一團糟,不可讀。
  • 在應用程序內觸發幾個隨機檢查例程,例如每兩小時,二十四小時,一天,一周等,或者可能在每次用戶採取的行動之後。
  • 在你的服務器上保存你的發布的應用程序的MD5校驗和,並實現一個例程,它可以檢查當前文件的MD5校驗和與你服務器端的真實校驗和,並使其隨機觸發。 如果MD5校驗和已被更改,表示此副本已被盜版。 現在你可以阻止它或發布一個更新來阻止它,等等。
  • 試著制定一個例程來檢查你的一些代碼(函數,類或特定例程)是否實際上已被修改或更改,甚至被刪除。 我稱之為(代碼完整性檢查)。
  • 使用免費的未知封裝器打包您的應用程序。 或者,如果您有這筆錢,可以選擇商業解決方案,如Thamida.NET Reactor 。 這些應用程序會定期更新,一旦破解程序解壓縮應用程序,您就可以從這些公司獲得新的更新,一旦您獲得新的更新,就可以打包您的程序並發布新的更新。
  • 定期發布更新並強制客戶下載最新更新。
  • 最後讓你的應用程序很便宜。 不要讓它太昂貴。 相信我,你會得到更多快樂的客戶,而餅乾只會離開你的應用程序,因為它不值得他們花時間去破解一個非常便宜的應用程序。

這些只是簡單的方法來防止新手和中間人破解你的應用程序。 如果你有更多的想法來保護你的應用程序,不要害羞地實施它們。 它只會使破解者生活得很艱難,他們會感到沮喪,最終他們會離開你的應用程序,因為這不值得他們的時間。

最後,您還需要考慮花時間編寫優質和高質量的應用程序。 不要浪費時間編寫複雜的安全層。 如果一個好的黑客想破解你的應用程序,他/她將會做,不管你做什麼......

現在去為餅乾實施一些玩具......


除了購買保護之外,您(或您的開發人員)可以學習複製保護。

這些是想法:

首先,嘗試編寫一個自己寫入控制台的程序。 這是一個著名的問題。 此任務的主要目的是練習編寫自引用代碼。

其次,您需要開發一種技術,以一種可靠的方式重寫某些代碼,這種方式可以依賴於其他方法的CIL

你可以編寫一個虛擬機(但是在.NET )。 並在那裡放一些代碼。 最終,虛擬機運行另一個運行代碼的虛擬機。 這是很少被稱為功能的一部分,因為它不會太慢地降低性能。

將一些邏輯重寫到C ++ / CLI中,並將託管代碼與非託管混合使用。 這將加劇拆解。 在這種情況下,不要忘記提供x64二進製文件。





reverse-engineering