2013年5月29日 星期三

關於客戶端保護技術的一些嘴砲(無技術含量)

前陣子雖然發了一些前端工程的小伎倆文章,不過最近又跑去研究了一下逆向工程的技術。今天就來說說最近研究的心得吧(本篇為基礎概念,沒甚麼實質技術含量)。

客戶端保護是甚麼? 簡單的說就是防止別人破解,竄改程式的一種技巧。像以前的單機遊戲有的要問密碼,或確認原版光碟,如果程式沒保護的話,透過逆向工程,大概半小時就可以把這些保護搞定了。

現在用最多保護技術的程式,大概就是線上遊戲了吧。主要目的是為了防止外掛,市場上主流的保護系統,大概有早期就出現的nProtect,一直到現在安博士和騰訊的TenProtect。每家用的伎倆大概也都差不多,大概就是加殼及Anti-Debug。加殼的部分是遊戲公司自己處理,還是這些保護廠商提供,其實我也不是很明瞭,總之這兩者大概算是不一樣的技術,先來說說加殼吧。

甚麼是加殼?
這是一種比較早期就有的保護技術,透過把原來的程式碼加以壓縮、加密、甚至用虛擬機技術保護起來,使破解者難以用靜態分析看到原始程式,也就難以找到要破解的地方。
不過,程式載入後總是得解密才能執行,破解者可以用一些技巧等到程式解密完成後,直接把解密過的程式存檔,就可以為所欲為啦,這就是俗稱的脫殼。

不過使用虛擬機技術的殼就沒這麼簡單,他有些原始碼已經被混淆,藏在一大堆垃圾代碼和無止盡的跳躍指令中,但這也只是加深破解者的解讀程式的難度,並不會真正阻止程式被解讀。

所以說到底,加殼只防君子不防大牛,所以NP、HS、TP才會紛紛崛起

甚麼是Anti-Debug?
對岸的人們稱為反調戲....反調適才對,總之就是透過各種技巧,使得其他程式無法讀寫該程式的記憶體,並且讓debugger無法附加到該程式,這也是現在外掛和保護大鬥法的主戰場。

一般來說,透過一些window API,我們可以任意存取系統中其他程序的資料,透過debugger的附加,更可以了解該程序如何運作。那這些保護系統,就是專門癱瘓掉這些API的高手。現在大多數的保護系統都會使用驅動程式級的保護,直接修改系統的kernel,阻止一些記憶體存取,和debugger相關的API,使得強如CheatEngine、OllyDebugger都無法對該程序進行存取。可是道高一尺、魔高一丈,如果這些保護搞的把戲都一一被揭穿,那麼破解者也可以寫個驅動程式修改kernel,使得前者的修改失效。不過到了這邊,所需要的技術就會比脫殼更困難許多。

以上是針對32位元系統,64位元系統又是另外一種保護的方式,這邊我也還沒研究到,就先不提。

必要技能
現在遊戲的保護都是加殼和Anti-Debug一起上的,不過還是外掛一堆。而甚麼都沒加的也是有...這種的外掛都滿到流出來了...

關於破解和保護的技術,學校不會教,老師也不會,那要到哪邊學呢?這邊我列出一些必要的技能好了

  1. 組合語言(對岸稱為匯編),要像母語一樣熟哦,對一些常改的機械碼也要有些認識
  2. 使用debugger經驗和技巧,這邊指的debugger是OllyDBG、WinDBG這類系統。像甚麼斷點、硬體斷點甚麼的要像吃飯一樣流暢
  3. 對系統的了解,這點是我的弱項,不過網路上許多牛人分享各種破解知識,多看多學習,總會精進
  4. 編程能力,不管前三項再強,不會寫程式大概就只能當當講師。提供保護的人,自然要能夠寫程式來實現保護,而破解的人,當然也要寫一些工具來突破前者的保護囉
總結
逆向是一件有趣的事,懂的人一定有飯吃,不懂的人了解一下概念也不錯。如果公司有推出甚麼厲害的產品,要了解不管甚麼工具都無法保護程式,只要有人有心破解甚麼都擋不住。

畢竟跑在人家的作業系統、用人家的記憶體,吃人家的CPU,自然要脫光光給人看了

所以真的有甚麼一定要保護的東西,還是多想想法子吧,像是放在Server端甚麼的

最後,祝大家的程式都有被破解的價值囉

沒有留言:

張貼留言