將Matlab的M檔案轉為P檔案和exe可執行檔案達到加密效果
在matlab中如果你的程式碼很重要,需要加密,目前我查到了兩種方法:一、生成p檔案;二、生成.exe檔案
matlab生成p檔案的方法很簡單,在command wondow裡面用
pcode yourfile.m
命令可以將M檔案轉化為對應的pcode檔案yourfile.p,據說是不會被反編譯的。
一、生成p檔案
P檔案是對應M檔案的一種預解析版本(preparsed version)。因為當你第一次執行M檔案時,Matlab需要將其解析(parse)一次(第一次執行後的已解析內容會放入記憶體作第二次執行時使用, 即第二次執行時無需再解析),這無形中增加了執行時間。所以我們就預先作解釋,那麼以後再使用該M檔案時,便會直接執行對應的已解析版本,即P檔案。但又 因為Matlab的解析速度非常快,一般不用自己作預解析。只有當一些程式要呼叫到非常多的M檔案時,如GUI應用程式時,才會作預解析,以增加以後的調 用速度。
如Matlab的當前目錄(Current Directory)有test.m檔案,其中a=1,b=2,作預解析後,又有test.p檔案。因為P檔案的呼叫優先順序比M檔案要高,所以當你呼叫test時,會作優先選 擇而呼叫了test.p。
可以修改test.m的程式碼為:
% ----------------------
% test.m
a = 3;
b = 4;
% ----------------------
再在Command Window裡呼叫test:
>> test
Warning: P-file C:\Program Files\MATLAB71\work\test.p is older than M-file C:\Program Files\MATLAB71\work\test.m.
C:\Program Files\MATLAB71\work\test.p may be obsolete and may need to be regenerated.
Type "help pcode" for information about generating P-files from M-files.
會出現一個Warning,警告你所呼叫的P檔案比同名的M檔案要舊,即表示M檔案已被修改了。儘管 如此,呼叫的還是舊的P檔案,即得出a = 1和 b = 2。
P檔案可以用來作保密程式碼之用,如果你給別人一個M檔案,別人可以開啟來看到你所 有的程式碼和演算法。如果你的程式碼不想被別人看到,那可以給他P檔案。
pcode函式也可以應用在M函式檔案。
p檔案是加密檔案,只能執行,不能還原成m檔案的。
二、生成.exe檔案加密
他的缺點是不能夠脫離Matlab單獨執行,必須還在command window裡面呼叫,可移植性不強。如果生成.exe檔案就可以解決這個問題。
生成.exe檔案的方法稍微複雜點:
1、首先要保證你的程式是函式型的,而不是指令碼形式的。如果是指令碼形式的也不要緊,只需要在指令碼檔案第一行新增 function []=name()即可。
2、然後,在command window裡用mcc -m -B sgl file.m命令生成.exe檔案,期間會讓你選擇編譯器(我的是VC6.0),會發現生成了一堆檔案。
3、將上步生成的那一堆檔案一起拷到待執行的機器。此時仍需matlab所必需的動態連線庫。將 <matlab path >/extern/lib/win32/mglinstallar.exe拷貝到到待執行機器上。
4.在待執行的機器上先執行mglinstallar.exe, 然後選擇解壓目錄,將在將在指定目錄下解壓縮出bin和toolbox兩個子目錄,其中在bin\win32目錄下就是數學庫和圖形庫脫離MATLAB執行所需的所有動態連線庫,共有n個。可以將這些.dll考入system32, 也可以直接放在應用程式目錄下(我把它拷在應用程式目錄下了)。而toolbox目錄則必須與應用程式同一目錄。
5.大功告成,雙擊.exe即可運行了。
總結:兩種方法都可以達到保護原始碼的目的,但是各有各的優缺點。生成p檔案的優點是方法簡單,生成檔案大小隻是原始碼的3倍左右,缺點是不能脫離matlab環境執行。生成.exe檔案的優點是可以脫離matlab單獨執行,缺點是生成的檔案大小是原來的幾千倍(5555555555,當然包含那些.dll檔案,體積最龐大的一部分)。就拿我的程式做個比較,原始碼是8.34K,生成p檔案22.6K,生成可執行檔案(含那些.dll)共30多兆。
參考資料:
2、對於MATLAB M檔案怎麼加密