簡體   English   中英

如何防止我的代碼被盜?

[英]How do i prevent my code from being stolen?

啟動.NET exe時會發生什么情況? 我知道C#已編譯為IL代碼,並且我認為生成的exe文件只是啟動器,用於啟動運行時並將IL代碼傳遞給它。 但是如何? 這個過程有多復雜?

IL代碼嵌入在exe中。 我認為它可以從內存中執行而無需將其寫入磁盤,而普通exe則不行(好的,是的,但是非常復雜)。

我的最終目標是提取IL代碼並編寫自己的加密啟動器,以防止腳本編寫者在Reflector中打開我的代碼,並輕松竊取我的所有類。 好吧,我無法完全防止逆向工程。 如果他們能夠檢查內存並捕獲將純IL傳遞給運行時的那一刻,那么它是否是.net exe都無關緊要,不是嗎? 我知道有幾種混淆器工具,但我不想弄亂IL代碼本身。

編輯:所以似乎不值得嘗試我想要的。 他們仍然會破解它...所以我將尋找一種混淆工具。 是的,我的朋友們也說過,將所有符號重命名為無意義的名稱就足夠了。 逆向工程畢竟不是那么容易。

如果您絕對堅持對程序集進行加密,那么最好的方法可能是將程序代碼放入類庫程序集中並對其進行加密。 然后,您將編寫一個小的存根可執行文件,將程序集解密到內存中並執行它們。

這是一個非常糟糕的主意,原因有兩個:

  1. 您將必須在存根中包含加密密鑰。 如果1337年的黑客可以有意義地使用您反映的程序集,則他可以輕松地竊取您的加密密鑰並自己解密。 (這基本上是模擬孔
  2. 沒人關心您的1337代碼。 對不起,那是艱難的愛情。 沒有人認為任何人的代碼都像作者一樣有趣。

與成千上萬的人共享的“秘密”不是秘密。 請記住,由於密鑰是正確的,因此攻擊者只需破壞一次瑣碎就可以了,因為“加密”方案只發生了一次。

如果您的代碼非常有價值,必須將其保密,則將其保密 只將代碼保留在您自己的服務器上; 將您的軟件編寫為Web服務。 然后保護服務器。

生成的exe文件只是啟動器,該啟動器啟動運行時並將IL代碼傳遞給它。

不完全是。 設置程序的方法有很多,但是通常IL代碼會編譯為在運行時進程中運行的本機代碼。

至於小子,如果您認為自己可以賣給他們或使用他們再分配產品的任何人,那就是在自欺欺人。 如果他們無法解鎖您的應用,他們會繼續前進,找到他們可以或不需要的應用。 它們的潛在銷售額恰好是$ 0; 花太多的精力去阻止它們是沒有意義的,因為您的投資沒有回報。 一個基本的混淆器可能很好,但不要超出此范圍。

實際上,大多數開發人員面臨的挑戰是默默無聞,而不是盜版。 您所做的任何阻止您對產品進行宣傳的行為都會比海盜造成的傷害更大。 這包括使人們付錢獲得它。 大多數情況下,更好的方法是擁有免費版本的應用程序,而孩子們甚至都無需解鎖。 對於他們來說已經足夠好的東西了,破解您的應用只會浪費他們的時間,而不僅僅是時間或功能有限的試用。 讓他們和盡可能多的其他人廣泛傳播。

現在我知道您最終確實需要一些付費客戶。 關鍵是現在要利用您從免費產品獲得的所有注意力來追加銷售或推廣其他更有利可圖的產品。 這里的一個選擇是也有一個高級版本,其附加功能主要針對商業受眾。 例如簡化部署到整個網絡並以這種方式進行管理。 企業財大氣粗,更有可能支付您的許可費用。 然后,您的免費版本可用來推廣您的產品,並為您的商業客戶提供合法性。

當然,還有其他模型,但是無論您做什么,都應該記住,晦澀難懂是更大的挑戰,盜版軟件永遠都不會轉化為銷售。 最終(當然,這取決於您的執行情況),您將能夠利用利用這些要點的商業模式賺取更多的錢,而不是嘗試與之抗衡。

“ ...防止腳本對象在Reflector中打開我的代碼,並輕松竊取我所有的類。”

不幸的是,無論您如何模糊啟動,調試器中的六個命令都可以將當前正在運行的程序集轉儲到用戶選擇的文件中。 因此,即使您可以按照Brian的建議啟動應用程序,也不難在運行該應用程序的組件后將其放入Reflector中(如果有人發現它很有趣,我可以從WinDbg發布示例)。

混淆工具是基於大量的技術經驗而創建的,通常設計成使調試器難以可靠地附加到進程或從進程中提取信息。 正如Brian所說:我不確定為什么要下決心保留IL,並且,如果您想對腳本小子提供任何有意義的保護,那么您可能必須改變主意。

“他們復制了他們可以遵循的一切,但他們無法復制我的想法,所以我讓他們流汗並偷竊了一年半。” -R.吉普林

我個人認為混淆是要走的路。 它很簡單並且很有效,特別是如果您的所有代碼都在exe中(我不確定“弄亂IL”到底要擔心什么)。

但是,如果您覺得這樣對您不起作用,則可以加密exe並將其作為資源嵌入到啟動器中。 處理它的最簡單方法是解密exe資源,並將其寫出並執行文件。 exe完成執行后,刪除文件。 您也許還可以通過Emit函數運行它。 我不知道這將如何工作,但是這里有一篇文章可以幫助您入門- 使用反射發射來緩存.NET程序集

當然,您的解密密鑰也可能必須嵌入到exe中,以便真正確定的人無論如何都可以解密您的程序集。 這就是為什么混淆可能是最好的方法的原因。

這個問題中復制我的答案(並非完全重復,但是可以用相同的答案來回答,因此是CW):

Windows EXE包含多個“部分”。 簡化后 ,.net代碼(= MSIL)只是EXE的一部分,並且EXE中還有一個“真實的”本機Windows部件,它充當.net Framework的某種啟動器,然后執行MSIL。

Mono將僅使用MSIL並執行它,而忽略本機Windows Launcher。

同樣,這是一個簡化的概述。

編輯:我擔心我對深入的depp詳細信息的理解不足以包含很多詳細信息(我大致了解什么是PE標頭,但不是真正的詳細信息),但是我發現這些鏈接很有幫助:

NET組裝結構–第二部分

.NET基礎-.NET程序集結構

附錄:如果您真的想更深入,請在Advanced .net Debugging上獲取一個副本。 第一章准確地解釋了Windows XP之前和之后如何加載.net程序集(從XP開始,Windows Loader就知道.net了,這從根本上改變了.net應用程序的啟動方式)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM