古詩詞大全網 - 藝術簽名 - 如何用java程序實現加密序列號

如何用java程序實現加密序列號

Java是壹種跨平臺的解釋性語言。Java源代碼編譯中的“字節碼”存儲在類文件中。類文件是字節碼形式的中間代碼,包含了大量的源代碼信息,比如變量名、方法名等等。因此,Java中間代碼的反編譯變得非常容易。目前市面上有很多免費的、商業化的反編譯軟件,可以生成高質量的反編譯源代碼。因此,如何保護Java程序已經成為開發者面臨的壹個非常重要的挑戰。本文首先討論了保護Java程序的基本方法,然後對代碼混淆進行了深入的研究。最後,結合壹個實際應用分析了如何在實踐中保護Java程序。反編譯已經成為保護Java程序的最大挑戰。通常用C、C++等編程語言開發的程序被編譯成目標代碼,都是本機的二進制可執行代碼。通常所有的源文件都被編譯並鏈接成壹個可執行文件。在這些可執行文件中,編譯器會刪除程序中的變量名、方法名等信息,這些信息往往用內存地址來表示。例如,如果需要使用壹個變量,通常通過變量的地址來訪問它。因此,反編譯這些局部目標代碼是非常困難的。Java語言的出現使得反編譯變得非常容易和有效。原因如下:1。由於跨平臺的要求,Java的指令集相對簡單、通用,更容易得到程序的語義信息;2.Java編譯器將每個類編譯成壹個單獨的文件,這也簡化了反編譯工作;三分鐘後。Java的類文件,所有的方法名和變量名還是保留的,變量和方法都是通過這些名字來訪問的。這些符號通常帶有大量的語義信息。由於Java程序的特點,對於未經處理的Java程序進行反編譯的效果非常好。目前市面上有很多Java反編譯工具,包括免費工具、商業工具和開源工具。這些工具的反編譯速度和效果都很好。好的反編譯軟件可以反編譯出非常接近源代碼的程序。因此,通過反編譯程序,黑客可以改變這些程序或重用它們。因此,如何保護Java程序不被反編譯是壹個非常重要的問題。由於Java字節碼的高度抽象,常見的保護技術很容易被反編譯。本節介紹了幾種保護Java字節碼不被反編譯的常用方法。通常這些方法並不能絕對防止程序被反編譯,只是增加了反編譯的難度,因為這些方法都有各自的使用環境和弱點。隔離Java程序最簡單的方法就是阻止用戶訪問Java類程序,這是最根本的方法,可以通過多種方式實現。比如開發者可以把關鍵的Java類放在服務器端,客戶端通過訪問服務器的相關接口而不是直接訪問類文件來獲取服務。所以黑客無法反編譯類文件。目前,通過接口提供服務的標準和協議越來越多,如HTTP、Web Service、RPC等。但是很多應用並不適合這種保護,比如Java程序對於單機運行的程序是無法隔離的。這種保護模式如圖1所示。圖1隔離Java程序原理圖加密類文件為了防止類文件被直接反編譯,很多開發者會對壹些關鍵的類文件進行加密,比如與註冊碼、序列號管理相關的類。在使用這些加密的類之前,程序需要首先解密它們,然後將它們加載到JVM中。這些類別的解密可以通過硬件或軟件來完成。在實現中,開發人員通常通過定制ClassLoader類來加載加密類(註意,出於安全原因,Applet不支持定制的ClassLoader)。自定義類加載器首先找到加密的類,然後解密它,最後將解密的類加載到JVM中。在這種保護方式中,自定義類加載器是壹個非常重要的類。因為沒有加密,所以可能是黑客的第壹目標。如果相關的解密密鑰和算法被攻克,加密的類可以很容易地被解密。這種保護模式的原理圖如圖2所示。圖2加密類文件並將程序轉換成本地代碼的示意圖也是防止反編譯的有效方法。因為本地代碼往往很難反編譯。開發人員可以選擇將整個應用程序轉換為本地代碼,也可以選擇轉換關鍵模塊。如果只轉換關鍵模塊,Java程序在使用這些模塊時需要使用JNI技術。當然,在利用這種技術保護Java程序的同時,也犧牲了Java的跨平臺特性。對於不同的平臺,我們需要維護不同版本的本地代碼,這將增加軟件支持和維護的工作。但是,對於壹些關鍵模塊,有時這種方案往往是必要的。為了確保這些本地代碼不能被修改和替換,通常需要對這些代碼進行數字簽名。在使用這些本地代碼之前,通常需要對這些本地代碼進行認證,以確保這些代碼沒有被黑客更改。如果簽名檢查通過,則調用相關的JNI方法。這種保護模式的原理圖如圖3所示。代碼混淆圖3轉換成局部代碼圖。代碼混淆是對類文件進行重新組織和處理,使處理後的代碼和預處理後的代碼完成相同的功能(語義)。而對於混淆的代碼,很難進行反編譯,即反編譯後得到的代碼非常難以理解和晦澀,所以反編譯者很難知道程序的真實語義。理論上,如果黑客有足夠的時間,混淆的代碼仍然可能被破解,甚至有人在開發反混淆工具。但從實際情況來看,由於混淆技術的多元化發展和混淆理論的成熟,混淆後的Java代碼仍然可以很好地防止反編譯。下面我們將詳細介紹混淆技術,因為混淆是保護Java程序的重要技術。圖4是代碼混淆的示意圖。圖4代碼混淆圖中幾種技術的總結以上技術都有不同的應用環境和各自的弱點。表1是相關特性的對比。混淆技術介紹表1不同保護技術對比表到目前為止,混淆技術仍然是Java程序最基本的保護方式。還有很多Java混淆工具,包括商業的,免費的,開源的。Sun也提供了自己的混淆工具。大部分是混淆類文件,少數工具先處理源代碼,再處理類,加大了混淆處理的力度。目前商業上比較成功的混淆工具有JProof公司的1stBarrier系列,Eastridge公司的JShrink,4thpass.com的SourceGuard等。根據混淆目標的不同,主要的混淆技術可以分為以下幾種,分別是符號混淆、數據混淆、控制混淆和防止變換。符號混亂類中有很多與程序執行本身無關的信息,比如方法名和變量名。這些符號的名字往往有壹定的含義。例如,如果壹個方法名為getKeyLength(),那麽這個方法可能用於返回鍵的長度。符號混淆就是把這些信息混淆起來,變成無意義的表示,比如從vairant_001開始對所有變量進行編號;所有方法從method_001開始編號。這會給反編譯帶來壹些困難。對於私有函數和局部變量,通常可以在不影響程序運行的情況下改變它們的符號。但是,對於壹些接口名、公共函數和成員變量,如果其他外部模塊需要引用這些符號,我們往往需要保留這些名稱,否則外部模塊無法找到具有這些名稱的方法和變量。因此,大多數混淆工具為符號混淆提供了豐富的選項,允許用戶選擇是否以及如何混淆符號。數據混淆圖5更改數據訪問數據混淆是對程序使用的數據進行混淆。混淆的方法也很多,主要可以分為改變數據存儲和編碼變換和改變數據訪問變換。更改數據存儲和編碼會破壞程序使用的數據存儲方法。比如壹個有10個成員的數組,被拆解成10個變量,這些變量的名字被打亂;將二維數組轉換成壹維數組等。對於壹些復雜的數據結構,我們會打亂它們的數據結構,比如用多個類代替壹個復雜的類。另壹種方法是改變數據訪問。例如,當訪問數組的下標時,我們可以進行壹些計算,圖5就是壹個例子。在實際混淆處理中,通常綜合使用這兩種方法,不僅打亂了數據存儲,而且打亂了數據訪問。混淆數據後,程序的語義變得復雜,增加了反編譯的難度。控制混淆控制混淆就是混淆壹個程序的控制流,使程序的控制流更難反編譯。通常控制流的改變需要增加壹些額外的計算和控制流,所以會給程序的性能帶來壹些負面影響。有時候,在程序的性能和混亂程度之間有壹個權衡。控制混亂的技術最復雜,技巧最多。這些技術可以分為以下幾類:添加混淆控制可以通過添加額外的復雜的控制流來隱藏程序原有的語義。例如,對於順序執行的兩個語句A和B,我們可以添加壹個控制條件來確定B的執行..這樣,拆卸起來就比較困難了。但是所有的幹擾控制都不應該影響b的執行。圖6顯示了向該示例添加混淆控制的三種方式。圖6添加混淆控制的三種方式控制流重組控制流也是重要的混淆方法。比如壹個程序調用壹個方法,混淆後可以將方法代碼嵌入到調用程序中。反之,程