Java是一種跨平台的、解釋型語言。Java 源代碼編譯中間「位元組碼」存儲於class文件中。Class文件是一種位元組碼形式的中間代碼,該位元組碼中包括了很多源代碼的信息,例如變數名、方法名等。因此,Java中間代碼的反編譯就變得非常輕易。目前市場上有許多免費的、商用的反編譯軟體,都能夠生成高質量的反編譯後的源代碼。所以,對開發人員來說,如何保護Java程序就變成了一個非常重要的挑戰。本文首先討論了保護Java程序的基本方法,然後對代碼混淆問題進行深入研究,最後結合一個實際的應用程序,分析如何在實踐中保護Java程序。
反編譯成為保護Java程序的最大挑戰通常C、C++等編程語言開發的程序都被編譯成目標代碼,這些目標代碼都是本機器的二進制可執行代碼。通常所有的源文件被編譯、鏈接成一個可執行文件。在這些可執行文件中,編譯器刪除了程序中的變數名稱、方法名稱等信息,這些信息往往是由內存地址表示,例如假如需要使用一個變數,往往是通過這個變數的地址來訪問的。因此,反編譯這些本地的目標代碼就是非常困難的。
Java語言的出現,使得反編譯變得非常輕易而有效。原因如下:1.由於跨平台的需求,Java的指令集比較簡單而通用,較輕易得出程序的語義信息;2.Java編譯器將每一個類編譯成一個單獨的文件,這也簡化了反編譯的工作;3.Java 的Class文件中,仍然保留所有的方法名稱、變數名稱,並且通過這些名稱來訪問變數和方法,這些符號往往帶有許多語義信息。由於Java程序自身的特點,對於不經過處理的Java程序反編譯的效果非常好。
目前,市場上有許多Java的反編譯工具,有免費的,也有商業使用的,還有的是開放源代碼的。這些工具的反編譯速度和效果都非常不錯。好的反編譯軟體,能夠反編譯出非常接近源代碼的程序。因此,通過反編譯器,黑客能夠對這些程序進行更改,或者復用其中的程序。因此,如何保護Java程序不被反編譯,是非常重要的一個問題。
常用的保護技術由於Java位元組碼的抽象級別較高,因此它們較輕易被反編譯。本節介紹了幾種常用的方法,用於保護Java位元組碼不被反編譯。通常,這些方法不能夠絕對防止程序被反編譯,而是加大反編譯的難度而已,因為這些方法都有自己的使用環境和弱點。
隔離Java程序最簡單的方法就是讓用戶不能夠訪問到Java Class程序,這種方法是最根本的方法,具體實現有多種方式。例如,開發人員可以將要害的Java Class放在伺服器端,客戶端通過訪問伺服器的相關介面來獲得服務,而不是直接訪問Class文件。這樣黑客就沒有辦法反編譯Class文件。目前,通過介面提供服務的標准和協議也越來越多,例如 HTTP、Web Service、RPC等。但是有很多應用都不適合這種保護方式,例如對於單機運行的程序就無法隔離Java程序。這種保護方式見圖1所示。
圖1隔離Java程序示意圖對Class文件進行加密為了防止Class文件被直接反編譯,許多開發人員將一些要害的Class文件進行加密,例如對注冊碼、序列號治理相關的類等。在使用這些被加密的類之前,程序首先需要對這些類進行解密,而後再將這些類裝載到JVM當中。這些類的解密可以由硬體完成,也可以使用軟體完成。
在實現時,開發人員往往通過自定義ClassLoader類來完成加密類的裝載(注重由於安全性的原因,Applet不能夠支持自定義的ClassLoader)。自定義的ClassLoader首先找到加密的類,而後進行解密,最後將解密後的類裝載到JVM當中。在這種保護方式中,自定義的ClassLoader是非常要害的類。由於它本身不是被加密的,因此它可能成為黑客最先攻擊的目標。假如相關的解密密鑰和演算法被攻克,那麼被加密的類也很輕易被解密。這種保護方式示意圖見圖2。
圖2 對Class文件進行加密示意圖轉換成本地代碼將程序轉換成本地代碼也是一種防止反編譯的有效方法。因為本地代碼往往難以被反編譯。開發人員可以選擇將整個應用程序轉換成本地代碼,也可以選擇要害模塊轉換。假如僅僅轉換要害部分模塊,Java程序在使用這些模塊時,需要使用JNI技術進行調用。
當然,在使用這種技術保護Java程序的同時,也犧牲了Java的跨平台特性。對於不同的平台,我們需要維護不同版本的本地代碼,這將加重軟體支持和維護的工作。不過對於一些要害的模塊,有時這種方案往往是必要的。
為了保證這些本地代碼不被修改和替代,通常需要對這些代碼進行數字簽名。在使用這些本地代碼之前,往往需要對這些本地代碼進行認證,確保這些代碼沒有被黑客更改。假如簽名檢查通過,則調用相關JNI方法。這種保護方式示意圖見圖3。
代碼混淆圖3 轉換成本地代碼示意圖代碼混淆是對Class文件進行重新組織和處理,使得處理後的代碼與處理前代碼完成相同的功能(語義)。但是混淆後的代碼很難被反編譯,即反編譯後得出的代碼是非常難懂、晦澀的,因此反編譯人員很難得出程序的真正語義。從理論上來說,黑客假如有足夠的時間,被混淆的代碼仍然可能被破解,甚至目前有些人正在研製反混淆的工具。但是從實際情況來看,由於混淆技術的多元化發展,混淆理論的成熟,經過混淆的Java代碼還是能夠很好地防止反編譯。下面我們會具體介紹混淆技術,因為混淆是一種保護Java程序的重要技術。圖4是代碼混淆的示意圖。
圖4 代碼混淆示意圖幾種技術的總結以上幾種技術都有不同的應用環境,各自都有自己的弱點,表1是相關特點的比較。
混淆技術介紹表1 不同保護技術比較表到目前為止,對於Java程序的保護,混淆技術還是最基本的保護方法。Java混淆工具也非常多,包括商業的、免費的、開放源代碼的。Sun公司也提供了自己的混淆工具。它們大多都是對Class文件進行混淆處理,也有少量工具首先對源代碼進行處理,然後再對Class進行處理,這樣加大了混淆處理的力度。目前,商業上比較成功的混淆工具包括JProof公司的1stBarrier系列、Eastridge公司的JShrink和
4thpass.com
的SourceGuard等。主要的混淆技術按照混淆目標可以進行如下分類,它們分別為符號混淆(Lexical Obfuscation)、數據混淆(Data Obfuscation)、控制混淆(Control Obfuscation)、預防性混淆(Prevent Transformation)。
符號混淆在Class中存在許多與程序執行本身無關的信息,例如方法名稱、變數名稱,這些符號的名稱往往帶有一定的含義。例如某個方法名為getKeyLength(),那麼這個方法很可能就是用來返回Key的長度。符號混淆就是將這些信息打亂,把這些信息變成無任何意義的表示,例如將所有的變數從vairant_001開始編號;對於所有的方法從method_001開始編號。這將對反編譯帶來一定的困難。對於私有函數、局部變數,通常可以改變它們的符號,而不影響程序的運行。但是對於一些介面名稱、公有函數、成員變數,假如有其它外部模塊需要引用這些符號,我們往往需要保留這些名稱,否則外部模塊找不到這些名稱的方法和變數。因此,多數的混淆工具對於符號混淆,都提供了豐富的選項,讓用戶選擇是否、如何進行符號混淆。
數據混淆圖5 改變數據訪問數據混淆是對程序使用的數據進行混淆。混淆的方法也有多種,主要可以分為改變數據存儲及編碼(Store and Encode Transform)、改變數據訪問(Access Transform)。
改變數據存儲和編碼可以打亂程序使用的數據存儲方式。例如將一個有10個成員的數組,拆開為10個變數,並且打亂這些變數的名字;將一個兩維數組轉化為一個一維數組等。對於一些復雜的數據結構,我們將打亂它的數據結構,例如用多個類代替一個復雜的類等。
另外一種方式是改變數據訪問。例如訪問數組的下標時,我們可以進行一定的計算,圖5就是一個例子。
在實踐混淆處理中,這兩種方法通常是綜合使用的,在打亂數據存儲的同時,也打亂數據訪問的方式。經過對數據混淆,程序的語義變得復雜了,這樣增大了反編譯的難度。
控制混淆控制混淆就是對程序的控制流進行混淆,使得程序的控制流更加難以反編譯,通常控制流的改變需要增加一些額外的計算和控制流,因此在性能上會給程序帶來一定的負面影響。有時,需要在程序的性能和混淆程度之間進行權衡。控制混淆的技術最為復雜,技巧也最多。這些技術可以分為如下幾類:增加混淆控制 通過增加額外的、復雜的控制流,可以將程序原來的語義隱藏起來。例如,對於按次序執行的兩個語句A、B,我們可以增加一個控制條件,以決定B的執行。通過這種方式加大反匯編的難度。但是所有的干擾控制都不應該影響B的執行。圖6就給出三種方式,為這個例子增加混淆控制。
圖6 增加混淆控制的三種方式控制流重組 重組控制流也是重要的混淆方法。例如,程序調用一個方法,在混淆後,可以將該方法代碼嵌入到調用程序當中。反過來,程
㈡ 密鑰加密
簡單來說就是使用一把鑰匙進行加密,並且使用一把鑰匙進行解密
DES,3DES,AEC,等等
密鑰過多
密鑰分發,密鑰分發不安全
數據來源無法確認
數據使用公鑰加密但只能以私鑰進行解密,而由私鑰加密的數據僅僅只能以公鑰進行解密。
RSA,DSA,ECC
1,身份認證
2,數據加密
缺點:較為消耗CPU,加解密使用不同密鑰演算法過於復雜
一個PKI體系由終端實體、證書認證機構、證書注冊機構和證書/CRL存儲庫四部分共同組成。
接下來逐步進行解釋
什麼是終端實體?
終端可以是個人PC或WEB伺服器,我們可以簡單的理解為享受認證的客戶
證書認證機構,證書注冊機構和證書/CRL存儲庫可以理解為是一個證書伺服器用於頒發證書,可能是一台獨立的設備。
1,根證書的證書是由自己授權
2,從屬CA應該去尋找上級CA進行授權,如圖上所示RA應向CA進行證書授權
3,證書中包含版本,序列號,簽名演算法,頒發者,有效期,主體名,公鑰信息,擴展信息,簽名
4,以根CA的自簽名證書為例以及Alice證書為例
根CA證書:
Alice證書
SSH密鑰交換為例子:
最後雙方都得到3個密鑰,之後通訊都被加密
HTTPS加密過程
㈢ 有什麼軟體可對EXE文件加密,最好是識別計算機硬體物理序列號的
我至今沒在網上發現這種軟體``如果你找到的好可以告訴我``或我找到的話告訴你也行`` 不過你說對EXE文件加密我知道`` 文件夾加密超級大師 從這個地址上可以下載; http://lib131277.ku.8844.com/功能強大、安全高效,簡單易用的數據加密和保護軟體。 有超快和最強的文件夾,文件加密功能、數據保護功能,文件夾、文件的粉碎刪除以及文件夾偽裝等功能。 文件夾本機和隱藏加密功能可以瞬間加密你電腦里或移動硬碟上的文件夾,加密後在何種環境下通過其他軟體都無法解密。同時防止復制、拷貝和刪除。並且它不受系統影響,即使重裝、Ghost還原,加密的文件夾依然保持加密狀態。隱藏加密的文件夾不通過本軟體無法找到和解密。 把文件夾和文件直接加密成Exe可執行文件。你可以將重要的數據以這種方法加密後再通過網路或其他的方法在沒有安裝[文件夾加密超級大師]的機器上使用。並且速度也特快,每秒可加密25 — 50M的數據。 數據保護功能,可防止你的數據被人為刪除、復制、移動和重命名。 還支持加密文件夾的臨時解密,文件夾臨時解密後,可以自動恢復到加密狀態。 文件加密後,沒有正確的密碼無法解密。解密後,加密文件依然保持加密狀態。 文件夾和文件的粉碎刪除,可以把你想刪除但怕在刪除後被別人用數據恢復軟體恢復的數據徹底在電腦中刪除。 文件夾偽裝可以把文件夾偽裝成回收站、CAB文件夾、列印機或其他類型的文件等,偽裝後打開的是偽裝的系統對象或文件而不是你偽裝前的文件夾。 另外還有驅動器隱藏加鎖等一些系統安全設置的功能。 本軟體使用起來也十分簡單,在要加密的文件夾或文件上單擊右鍵選擇[加密],然後設輸入密碼再按一下回車就可以了。解密時只要雙擊加密的文件夾或文件,輸入正確密碼即可。 本軟體全面兼容所有基於NT內核的Windows系統,包括 NT/2000/XP/2003,支持FAT32 和 NTFS文件系統。
㈣ 怎麼把一個序列號限定一台電腦使用,如何破解
把電腦硬體的唯一標識號(象主板、硬碟、驅動器、CUP、內插卡等都有唯一性標識的)加上自己的加密演算法標識,全部再合成加密,得到只有該機可以使用的唯一性序列號。換個看似同品牌、同配置的機子也不管用。破解起來夠麻煩,但不是無解。所以只能在加密時盡量製造破解難度、麻煩度,讓破解者夠頭疼,花費大量時間卻體現不出價值。哈哈
㈤ VB 如何利用磁碟的序列號進行軟體加密
讀序列號可以做到,關於怎麼生成注冊碼,演算法就要自己搞定了你可以轉成16進制,再運算生成10進制再用ASCII碼轉出字元……方法很多讀序列號可以用別人寫的DLL,也可以用代碼 http://hi..com/superitman/blog/item/fb356eec1026d8d52e2e2165.html關於演算法,就不多說了,因為是你自己的程序,自己寫個演算法別人一般不容易知道如果你的程序不是很出名,也不用怕被人破解,別人沒空破解簡單的小程序如果你真怕被破解,幾乎沒有辦法防破解,因為再怎麼難的演算法都沒有最後都是用一個判斷語句來判斷是否是已經注冊的,會匯編的只要把True改成False,錯的注冊碼也能注冊最好是用資料庫加密,也就是你做的程序如果是有資料庫的,你不需要為程序加密只要把程序用到的資料庫用注冊碼加密,這樣別人就必須要用注冊碼,因為中間沒有判斷語句錯的注冊碼就不能為資料庫解密,就讀不出數據了 看我打字打得這么累,就麻煩認真看下,謝謝!
㈥ 如何實現對電腦EXE軟體進行加密,並授權使用時長
想要對電腦exe軟體進行加密,可以使用專門的加殼工具,這種工具有現成的軟體,可以設置序列號或者是使用日期的限制。
㈦ 如何在PB中通過讀取硬碟序列號實現軟體加密
您好,通過API函數GetVolumeInformationA可以獲取硬碟序列號一般的CS結構軟體加密可以參考以下方案1,客戶安裝完軟體,啟動軟體即判斷是否注冊,未注冊則顯示一條注冊相關信息(包含硬碟序列號)2,客戶將注冊相關信息提供給你,你在寫一
㈧ 序列號保護加密的原理和驗證方法
(1)序列號保護機制
數學演算法一項都是密碼加密的核心,但在一般的軟體加密中,它似乎並不太為人們關心,因為大多數時候軟體加密本身實現的都是一種編程的技巧。但近幾年來隨著序列號加密程序的普及,數學演算法在軟體加密中的比重似乎是越來越大了。
我們先來看看在網路上大行其道的序列號加密的工作原理。當用戶從網路上下載某個shareware——共享軟體後,一般都有使用時間上的限制,當過了共享軟體的試用期後,你必須到這個軟體的公司去注冊後方能繼續使用。注冊過程一般是用戶把自己的私人信息(一般主要指名字)連同信用卡號碼告訴給軟體公司,軟體公司會根據用戶的信息計算出一個序列碼,在用戶得到這個序列碼後,按照注冊需要的步驟在軟體中輸入注冊信息和注冊碼,其注冊信息的合法性由軟體驗證通過後,軟體就會取消掉本身的各種限制,這種加密實現起來比較簡單,不需要額外的成本,用戶購買也非常方便,在互聯網上的軟體80%都是以這種方式來保護的。
我們注意到軟體驗證序列號的合法性過程,其實就是驗證用戶名和序列號之間的換算關系是否正確的過程。其驗證最基本的有兩種,一種是按用戶輸入的姓名來生成注冊碼,再同用戶輸入的注冊碼比較,公式表示如下:
序列號 = F(用戶名)
但這種方法等於在用戶軟體中再現了軟體公司生成注冊碼的過程,實際上是非常不安全的,不論其換算過程多麼復雜,解密者只需把你的換算過程從程序中提取出來就可以編制一個通用的注冊程序。
另外一種是通過注冊碼來驗證用戶名的正確性,公式表示如下:
用戶名稱 = F逆(序列號) (如ACDSEE,小樓注)
這其實是軟體公司注冊碼計算過程的反演算法,如果正向演算法與反向演算法不是對稱演算法的話,對於解密者來說,的確有些困難,但這種演算法相當不好設計。
於是有人考慮到一下的演算法:
F1(用戶名稱) = F2(序列號)
F1、F2是兩種完全不同的的演算法,但用戶名通過F1演算法的計算出的特徵字等於序列號通過F2演算法計算出的特徵字,這種演算法在設計上比較簡單,保密性相對以上兩種演算法也要好的多。如果能夠把F1、F2演算法設計成不可逆演算法的話,保密性相當的好;可一旦解密者找到其中之一的反演算法的話,這種演算法就不安全了。一元演算法的設計看來再如何努力也很難有太大的突破,那麼二元呢?
特定值 = F(用戶名,序列號)
這個演算法看上去相當不錯,用戶名稱與序列號之間的關系不再那麼清晰了,但同時也失去了用戶名於序列號的一一對應關系,軟體開發者必須自己維護用戶名稱與序列號之間的唯一性,但這似乎不是難以辦到的事,建個資料庫就好了。當然你也可以根據這一思路把用戶名稱和序列號分為幾個部分來構造多元的演算法。
特定值 = F(用戶名1,用戶名2,...序列號1,序列號2...)
現有的序列號加密演算法大多是軟體開發者自行設計的,大部分相當簡單。而且有些演算法作者雖然下了很大的功夫,效果卻往往得不到它所希望的結果。其實現在有很多現成的加密演算法可以用,如RSADES,MD4,MD5,只不過這些演算法是為了加密密文或密碼用的,於序列號加密多少有些不同。我在這里試舉一例,希望有拋磚引玉的作用:
1、在軟體程序中有一段加密過的密文S
2、密鑰 = F(用戶名、序列號) 用上面的二元演算法得到密鑰
3、明文D = F-DES(密文S、密鑰) 用得到的密鑰來解密密文得到明文D
4、CRC = F-CRC(明文D) 對得到的明文應用各種CRC統計
5、檢查CRC是否正確。最好多設計幾種CRC演算法,檢查多個CRC結果是否都正確
用這種方法,在沒有一個已知正確的序列號情況下是永遠推算不出正確的序列號的。
(2)如何攻擊序列號保護
要找到序列號,或者修改掉判斷序列號之後的跳轉指令,最重要的是要利用各種工具定位判斷序列號的代碼段。這些常用的API包括GetDlgItemInt, GetDlgItemTextA, GetTabbedTextExtentA, GetWindowTextA, Hmemcpy (僅僅Windows 9x), lstrcmp, lstrlen, memcpy (限於NT/2000)。
1)數據約束性的秘訣
這個概念是+ORC提出的,只限於用明文比較注冊碼的那種保護方式。在大多數序列號保護的程序中,那個真正的、正確的注冊碼或密碼(Password)會於某個時刻出現在內存中,當然它出現的位置是不定的,但多數情況下它會在一個范圍之內,即存放用戶輸入序列號的內存地址±0X90位元組的地方。這是由於加密者所用工具內部的一個Windows數據傳輸的約束條件決定的。
2)Hmemcpy函數(俗稱萬能斷點)
函數Hmemcpy是Windows9x系統的內部函數,位於KERNEL32.DLL中,它的作用是將內存中的一塊數據拷貝到另一個地方。由於Windows9x系統頻繁使用該函數處理各種字串,因此用它作為斷點很實用,它是Windows9x平台最常用的斷點。在Windows NT/2K中沒有這個斷點,因為其內核和Windows9x完全不同。
3)S命令
由於S命令忽略不在內存中的頁面,因此你可以使用32位平面地址數據段描述符30h在整個4GB(0~FFFFFFFFh )空間查找,一般用在Windows9x下面。具體步驟為:先輸入姓名或假的序列號(如: 78787878),按Ctrl+D切換到SoftICE下,下搜索命令:
s 30:0 L ffffffff '78787878'
會搜索出地址:ss:ssssssss(這些地址可能不止一個),然後用bpm斷點監視搜索到的假注冊碼,跟蹤一下程序如何處理輸入的序列號,就有可能找到正確的序列號。
4)利用消息斷點
在處理字串方面可以利用消息斷點WM_GETTEXT和WM_COMMAND。前者用來讀取某個控制項中的文本,比如拷貝編輯窗口中的序列號到程序提供的一個緩沖區里;後者則是用來通知某個控制項的父窗口的,比如當輸入序列號之後點擊OK按鈕,則該按鈕的父窗口將收到一個WM_COMMAND消息,以表明該按鈕被點擊。
BMSG xxxx WM_GETTEXT (攔截序列號)
BMSG xxxx WM_COMMAND (攔截OK按鈕)
可以用SoftICE提供的HWND命令獲得窗口句柄的信息,也可以利用Visual Studio中的Spy++實用工具得到相應窗口的句柄值,然後用BMSG設斷點攔截。例:
BMSG 0129 WM_COMMAND
㈨ 求一種軟體加密辦法,可以限制軟體的使用時間,但是通過修改系統時間無效,到期了需要序列號進行解鎖。
可以加殼就行了,不過加殼不是很穩定建議使用加密狗,專業軟體視頻加密