代碼難讀化

代碼難讀化係指攞住一段源碼或者機械碼，特登整到佢對人同電腦嚟講難讀。

概論

代碼難讀化係軟件工程同相關工作上成日要做嘅一段工序。想像家陣有班軟件工程師，佢哋寫好咗隻新軟件嘅源碼，而且乜測試都做好嗮，隻軟件夠嗮高質可以出街攞去賣。但喺呢個時候，佢哋又要閉翳一樣嘢：如果佢哋就噉畀隻軟件出街，啲人有可能會攞隻軟件嘅源碼去複製，用嚟整翻版；為咗保障佢哋嘅知識產權，班軟件工程師就會想做啲工夫，唔畀啲人隨便複製隻軟件嘅源碼；除此之外，源碼易改又表示啲正當嘅用家可能會貪玩亂咁改啲碼，改改吓搞軭隻軟件。

因為上述呢啲緣故，廿一世紀初嘅軟件工程師好多時都會使用代碼難讀化：佢哋會攞住隻軟件段源碼或者機械碼，將啲碼執吓佢，令到段碼變到對人類同電腦嚟講難讀難明。代碼難讀化做好咗之後，佢哋就畀隻軟件出街。舉個簡化例子，好似下面嘅 C 例子碼噉，就做咗難讀化：

int i;main(){for(i=0;i["]<i;++i){--i;}"];
read('-'-'-',i+++"hell\
o,world!\n",'/'/'/'));}read(j,i,p){
write(j/p+p,i---j,i/i);}

而一段比較整齊易讀嘅 C 碼望落比較似係噉嘅：

int i;

void write_char(char ch)
{
    printf("%c", ch);
}

int main()
{
    for (i = 0; i < 15; i++) {
        write_char("hello, world!\n"[i]);
    }
    return 0;
}

篇文跟住落嚟嘅內容，假設讀者已經有齊嗮程式編寫啲基本知識。

目標
代碼難讀化目的係要達致：
隱密：令到個程式嘅控制流程難以睇清楚。
成本要合理：同任何工程學上嘅工作一樣，做嘢嘅人唔淨只要達到想要嘅效果，仲需要個成本有返咁上下低，如果成本高得滯件產品就難以量產。
複雜度要高：代碼難讀化往往想令段碼嘅複雜度有咁高得咁高，同時又唔損害隻軟件嘅表現；表現包括「個程式做到佢嘅功能要嘥幾多時間，嘥嘅時間係愈少愈好」。
頑健：一套做難讀化嘅方法，有必要能夠抵抗啲自動化嘅拆解技術。亦可以睇吓密碼學講到嘅密碼分析。

技巧
要做難讀化，軟件工程師有好多技巧可以用，比較簡單嘅有：
死碼：指一段碼永遠唔會行得到或者就算行咗段碼，段碼嘅 output 唔會畀個程式嘅任何部份攞嚟用；做代碼難讀化嘅人，有陣時會加少少死碼落段源碼度，用意係想擾亂嘗試解讀段碼嘅人。
  int a = 0;
  if (a > 1000) { // 如果 a 數值永遠冇可能超過 1000，噉呢個 if 下嘅碼就永世都唔會行。
    // [省略...]
  }
最佳化：做最佳化嘅過程，成日都會搞到段碼變得冇咁易睇；數學上最有效率嘅演算法，往往唔多合乎人腦直覺嘅諗嘢方式。
軟件工程師可以將啲碼嘅次序掉轉，甚至加啲 goto 落去令到段碼行起上嚟會「跳嚟跳去」，同時一路  住個程式嘅行為唔變。
... 呀噉。

加密：密碼學成日用嘅一種技巧；簡化講，加密做嘅嘢如下－攞住一段符號，將段符號做轉化，轉化會變咗好似語無倫次噉嘅樣，而且淨係得寫符號嗰一方同埋有權睇串符號嗰一方先至知密匙，知密匙先可以解讀到串符號，最後達致「唔畀任何外人得知串符號講乜」噉嘅效果；視像遊戲嘅製作過程，出嗮名成日會同啲遊戲嘅源碼做加密。
惡意程式：整惡意程式嘅人，好興用代碼難讀化嘅技巧嚟令到自己啲惡意程式避得開防毒軟件嘅探測。
複製保護
Checksum
還原工程

攷

編程
軟件工程