1. 程式人生 > >編譯與程式碼安全之認識(一)

編譯與程式碼安全之認識(一)

         好久沒有更新部落格了,今天週末索性喝杯茶,靜下心來把最近一段時間自己所理解和思考的關於軟體程式碼保護的東西寫下來。幫助所需之人,多有不對,望批評指正。

        一提到編譯,大家很多人覺得不就是詞法分析、語法分析然後產生一個針對特定機器的檔案。感覺這是一個很成熟,有規則,本身就是很有章法的東西,好像不需要我們本身去理會它的一種東西,如果是做應用層的開發是沒有問題,如果去做安全,比如軟體程式碼保護,我們去做程式碼保護,經常的思維是要針對基於解釋性語言和編譯性語言所編譯產生的結果去做保護,這就產生了基於執行過程中的加殼,加密,或者是解析結構做混淆,和基於二進位制的虛擬機器保護,另一個層面是針對一些反彙編器或者反編譯器本身去做對坑,比如破壞dex2jar或者針對IDA遞迴反彙編演算法的特徵去做一些破壞。但是隨著一個LOT、LOV時代的到來,很多的系統是做了本身的DIY,因為針對性更強,目標性更加明確,所以這個時候如果還是以編譯完的可執行檔案作為保護物件,可能要隨時進行更新,強度上和相容性上所付出的代價會更高。

       因此這個時候,另一種思路就是本文想說的,如果我們去借助一些比較成熟的編譯器框架去做一些處理,可能能達到事半功倍的效果。編譯不應該僅僅的理解為針對的物件一定是原始檔,而應該去把一種源頭格式轉為編譯器本身能夠理解的中間語言,一旦轉為中間語言,這個時候我們就可以做很多事情,如果想做保護的,那就是反優化,加一些自定義的混淆保護規則,如果想做逆向分析的,那就利用優化規則去優化這些中間語言,或者是針對虛擬機器保護過後的檔案。可能這個時候大家會想到可執行檔案怎麼去得到中間語言,如果說通過一些反編譯得到一些邏輯正確的偽碼,(當然這個假設有待考證研究)可以藉助於一些編譯器框架自己去寫一個對於偽碼的特徵去做編譯優化,優化的過程就是去混淆的一個過程。我想隨著對編譯的更為深層次的認識,能做的事情還很多,暫時YY這麼多。