代碼難讀化
難讀化(粵拼:naan4 duk6 faa3;英文:obfuscation)係指攞住一段源碼或者機械碼,特登整到佢對人同電腦嚟講難讀[1]。代碼難讀化係軟件工程同相關工作上成日要做嘅一段工序。
概論
編輯想像家陣有班軟件工程師,佢哋寫好咗隻新軟件嘅源碼,而且乜測試都做好嗮,隻軟件夠嗮高質可以出街攞去賣。但喺呢個時候,佢哋又要閉翳一樣嘢:如果佢哋就噉畀隻軟件出街,啲人有可能會攞隻軟件嘅源碼去複製,用嚟整翻版;為咗保障佢哋嘅知識產權,班軟件工程師就會想做啲工夫,唔畀啲人隨便複製隻軟件嘅源碼[2];除此之外,源碼易改又表示啲正當嘅用家可能會貪玩亂咁改啲碼,改改吓搞軭隻軟件。
因為上述呢啲緣故,廿一世紀初嘅軟件工程師好多時都會使用代碼難讀化:佢哋會攞住隻軟件段源碼或者(轉化好嘅)機械碼,將啲碼執吓佢,令到段碼變到對人類同電腦嚟講難讀難明。代碼難讀化做好咗之後,佢哋就畀隻軟件出街。舉個簡化例子,好似下面嘅 C 例子碼噉,就做咗難讀化[3]:
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;
}
篇文跟住落嚟嘅內容,假設讀者已經有齊嗮程式編寫啲基本知識。
目標
編輯代碼難讀化目的係要達致[3]:
技巧
編輯要做難讀化,軟件工程師有好多技巧可以用,比較簡單嘅有:
- 死碼(dead code):指一段碼永遠唔會行得到(例如係行嘅條件永遠唔會有可能達到;睇下面段虛擬碼)或者就算行咗段碼,段碼嘅 output 唔會畀個程式嘅任何部份攞嚟用;做代碼難讀化嘅人,有陣時會加少少死碼落段源碼度,用意係想擾亂嘗試解讀段碼嘅人[4]。
int a = 0; if (a > 1000) { // 如果 a 數值永遠冇可能超過 1000,噉呢個 if 下嘅碼就永世都唔會行。 // [省略...] }
- 最佳化:做最佳化嘅過程,成日都會搞到段碼變得冇咁易睇;數學上最有效率嘅演算法,往往唔多合乎人腦直覺嘅諗嘢方式。
- 軟件工程師可以將啲碼嘅次序掉轉,甚至加啲 goto 落去令到段碼行起上嚟會「跳嚟跳去」,同時一路 kip1 住個程式嘅行為唔變。
... 呀噉。
睇埋
編輯引述
編輯- ↑ What is code obfuscation?. ASEE.
- ↑ Balakrishnan, A., & Schulze, C. (2005). Code obfuscation literature survey (PDF). CS701 Construction of compilers, 19, 31.
- ↑ 3.0 3.1 What is Obfuscation?. GeeksForGeeks.
- ↑ Barría, C., Cordero, D., Cubillos, C., & Osses, R. (2016, May). Obfuscation procedure based in dead code insertion into crypter. In 2016 6th International Conference on Computers Communications and Control (ICCCC) (pp. 23-29). IEEE.
- ↑ Karthik, J., Amritha, P. P., & Sethumadhavan, M. (2020, July). Video Game DRM: Analysis and Paradigm Solution. In 2020 11th International Conference on Computing, Communication and Networking Technologies (ICCCNT) (pp. 1-4). IEEE.
- ↑ You, I., & Yim, K. (2010, November). Malware obfuscation techniques: A brief survey. In 2010 International conference on broadband, wireless computing, communication and applications (pp. 297-300). IEEE.