一是使用ASCII碼來當成重要資訊的編碼,ASCII碼請讀者自行上網搜尋它是什麼,以及它的編碼方式。這個是最粗淺的保護機制,因為我們知道MT4編譯之後會產生16進位的機器碼,如果有人想更改程式版權,使用一個可閱讀16進位機器碼的編輯器,例如UltraEditor,程式裡面的標註英文字母很容易被更改。當我們使用ASCII碼來代替資訊時,至少它會變成一個煙霧彈,讓比較不懂電腦基礎知識的人要更改程式資訊就變得不知如何下手。例如下面的例子:
//+-----------------------------------------------------------------+
//| Check for Copy Right |
//+-----------------------------------------------------------------+
Comment("Copyright © 2010, Ganapati Institute");
一般大抵上就只是如上的寫法而已,不過如果我們想以ASCII碼來編同樣的文字,程式的寫法會變成如下所示:
//+-----------------------------------------------------------------+
//| Check for Copy Right |
//+-----------------------------------------------------------------+
string CRChar[256]; int i; //Copy Right Character
for (i = 0; i < 256; i++) CRChar[i] = CharToStr(i);
Comment
(
/* Copyright c 2010, Ganapati Institute */
CRChar[67] + CRChar[111] + CRChar[112] + CRChar[121] + CRChar[114] + CRChar[105] + CRChar[103] +
CRChar[104] + CRChar[116] + CRChar[32] + CRChar[169] + CRChar[32] + CRChar[50] + CRChar[48] +
CRChar[49] + CRChar[48] + CRChar[44] + CRChar[32] + CRChar[71] + CRChar[97] + CRChar[110] +
CRChar[97] + CRChar[112] + CRChar[97] + CRChar[116] + CRChar[105] + CRChar[32] + CRChar[73] +
CRChar[110] + CRChar[115] + CRChar[116] + CRChar[105] + CRChar[116]+ CRChar[117] + CRChar[116] +
CRChar[101]
);
又例如程式允許使用者是用到某個時間為止,我們就必須鎖時間來限制使用者試用的時間期限,以ASCII碼來鎖時間限制的寫法如下所示:
bool ValidDate()
{
string TMchar[256]; int i;
for (i = 0; i < 256; i++) TMchar[i] = CharToStr(i);
int LastAllowedDate = StrToTime(
// 2010.12.31 23:59:00
TMchar[50]+TMchar[48]+TMchar[49]+TMchar[48]+TMchar[46]+TMchar[49]+TMchar[50]+TMchar[46]+TMchar[51]+
TMchar[49]+TMchar[32]+TMchar[50]+TMchar[51]+TMchar[58]+TMchar[53]+TMchar[57]+TMchar[58]+TMchar[48]+TMchar[48]
);
if (TimeCurrent() >= LastAllowedDate)
{
Print("Demo period has expired " + TimeToStr(LastAllowedDate,TIME_DATE|TIME_SECONDS));
return(false);
}
return (true);
}
又例如程式僅允許單一帳號的使用者來使用時,我們就必須以鎖密碼的方式來限制使用者。一般是以使用者帳號再加上一個有公式計算的序號來當成密碼,這裡我們簡單的以使用者帳號來當密碼,再以ASCII碼來編碼方式用以鎖定限制「單一的使用者帳戶」,寫法如下所示:
//+-----------------------------------------------------------------+
//| Check Password Function |
//+-----------------------------------------------------------------+
bool PasswordCheck()
{
string PWchar[256]; int i;
for (i = 0; i < 256; i++) PWchar[i] = CharToStr(i);
// AllowedAccountNo = Accountnumber
// Account number, on which expert is allowed to work
/* If password is 999999 */
int AllowedAccountNo = StrToInteger(PWchar[57]+PWchar[57]+PWchar[57]+PWchar[57]+PWchar[57]+PWchar[57]);
if(AccountNumber() != AllowedAccountNo) return(False);
return(true);
}
接下來比較難防的就是該如何防程式被反組譯。網路上有一位名叫Sergey Kravchuk的網友寫了一套程式叫做MQLEnigma的免費編碼程式提供給程式開發者使用。但到目前為止,我個人的感覺是不好用。
常常無法編碼成功,這種編碼程式我認為資工科系的人應該都可以寫得出來,只是品質好壞而已,所以我相信未來將有類似的商品將會在市場上出現。除了編碼程式將原始碼先編碼之後再Compile之外,其實還是有其他方法來防止智慧財產權被掠奪。
例如將程式之重要資訊放在Include檔,或Library檔裡。例如Library檔案夾裡面使用DLL檔呼叫也是一種很難被破解的方法。