逆向工程讓程式裡的秘密一覽無疑,這會使一些技術或是商業機密洩漏,後果導致技術被學走或是非法外掛橫行。而反逆向工程
的目的就是讓這些想逆向分析的人沒有那麼容易的看見秘密。隨著技術與架構日新月異,反逆向工程
的技術與逆向工程
一樣一直在不斷的升級與出現。
反逆向的技術通常有著很強的系統依賴性
。這代表不同的架構下,一樣的技術卻不一定都能正常運作。並且因為種類非常多樣所以無法在這個系列中一一介紹 ( 明年見…? ),不過逆向工程核心原理一書中把整體分成兩種類型 : 動態
與靜態
。
這邊說的動態與靜態,直覺上會讓人覺得是針對動態分析與靜態分析,實則不然。他們的差別主要是在破解的時機 : 靜態技術主要在開始時破解一次就可以了;而動態技術會在運行時一邊執行一邊破解。由於動態技術會在運行時不斷地偵測,因此動態破解比靜態破解難得多了。
靜態反逆向技術主要是偵測程式是否在逆向分析模式下面,像是上次在第 25 篇時做了利用 Debugger API
來進行勾取。若是應用靜態技術的程序可能就會發現程式運行在 Debugger
下,從而導致被強制退出。
而動態反逆向通常具有破壞或干擾 Debugger
編譯的效果,有的藉由擾亂反編譯器的指令跟蹤功能來迷惑使其無法查看代碼與數據,有的會紀錄拋出的例外或是時間( TSC
)流逝的速度,也有的是擺放陷阱引誘反編譯器踩到。各種技術五花八門。
既然無法在技術上防止工程師利用他們的各種技藝分析出程序中的代碼,那開發者就又有了一些恐怖的技術。像是垃圾代碼、花指令、擾亂代碼對齊( BCA )、保護器的應用等等的。
這幾天將會準備一些常見反逆向技術的實作與反制,期望能在接下來幾篇能認識更多不同的技術。