程式開發者的自我保護(2)ganatrader5372



請  
APP收通知

發表時間 
+發文 換稿費

0

一是使用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檔呼叫也是一種很難被破解的方法。

0

York-紅財神外匯投資套利研究學院院長,GanaTrader外匯套利自動交易系統研發者。

紅財神外匯投資套利研究學院
http://ganapati.pixnet.net/blog


amibroker2

  回覆時間 2010/12/18 05:51:35

Gana大:
謝謝您的詳盡說明。
請問目前在程式交易的應用程式中,都無使用USB Key等硬體鎖
方式來保護嗎?
(軟體鎖總是會出現高手破解)

謝謝~


ganatrader

  回覆時間 2010/12/19 14:10:45


Hi 您好

"請問目前在程式交易的應用程式中,都無使用USB Key等硬體鎖方式來保護嗎?"

交易軟體要防止被破解真的很困難, 尤其是MT4的執行檔, 其實真的是防不勝防
硬體防護變成會要求使用者買 Key-Lock, 不切實際
軟體防護的方法 僅能由Source Code加上編碼
這需要藉助 Coding Theory 的理論
使其 即使破解了, 也是一堆亂碼!

其它, 軟體方面或許利用系統端可以解決這個問題

york

York-紅財神外匯投資套利研究學院院長,GanaTrader外匯套利自動交易系統研發者。

紅財神外匯投資套利研究學院
http://ganapati.pixnet.net/blog


amibroker2

  回覆時間 2010/12/19 17:06:18

謝謝York大的說明。

記得近廿年前,當時公司使用的Sun Unix工作站上的某用途軟體,
當時採用的是鎖 "網卡Mac address"方式,而當時網路在台灣尚在
由BBS 前進到Internet時代,所以較少聽聞破解。

但過沒多久,即出現於BIOS中修改MAC address方式破解。
(另有聽聞專門提供專用fireware的公司)

謝謝~


本主題只有一頁。
作者上一篇主題作者上一篇 作者下一篇作者下一篇主題

回上一頁回上一頁

回頁頂 回頁頂

聚財資訊股份有限公司 版權所有© wearn.com All Rights Reserved. TEL:02-82287755 商城客服時間:台北週一至週五9:00~12:00、13:00~18:00 [ 聯絡客服 ]