常見的脫殼技巧

         一個軟件的保護,除了加入花指令之類的保護,當然是離不開殼的保護的。那麼,常見的殼大多可以分爲兩種,一種是加密殼,一種是壓縮殼。當我們想對一個軟件的源碼進行分析或者是想對一個軟件進行優化的時候,殼就是擋在我們面前的第一個問題。那麼,我們可以在這裏討論下常見的脫殼技巧,來看看以前的殼都是怎麼來保護軟件的。一般情況下,壓縮殼是將一些常用的代碼進行替換,然後在程序運行之前,殼的代碼先運行,將替換掉的代碼再替換回去,緊接着再進行程序的運行。所以說壓縮殼的保護強度並不會太強,而加密殼,則是用自己的算法將程序的代碼進行換算,修改導入表IAT,然後再在程序運行之前,修復導入表IAT進行解密。所以說,原理上當一個程序沒有脫殼之前,我們是無法對它進行修改和分析源代碼的。

           那麼,我們現在來看下常見的脫殼技巧,一般來說,常見的脫殼技巧有:單步跟蹤法、堆棧平衡法(ESP定律法)、二次內存鏡像法、一步直達法、模擬跟蹤法、最後一次異常法。我們一個個的來看。

          所謂單步跟蹤法,就是將程序載入OD,然後單步F8進行跟蹤,遇到向下的跳轉就跟着跳,遇到向上的跳轉就在它跳轉的下一行按F4讓他直接運行下來。然後一步步的跟蹤,再遇到一個跨度很大的跳轉(一般是jmp跳轉)就可以到達真正的OEP,就可以進行脫殼了。這裏解釋下,一般情況下,程序的殼的代碼在後面,所以,它一些向上的跳轉就是進行一些替換,然後最後的一個大跳轉,就是替換完畢,然後開始運行真正的程序。

          而堆棧平衡法(ESP定律法)就是,我們將帶殼的程序載入OD以後,開始單步F8,然後遇到第一個push的時候注意右邊的寄存器窗口,關注ESP寄存器,當發現它變化了之後,就可反手鍵選擇在數據窗口中跟隨,然後在第一行的位置全部選擇,反手鍵,選擇斷點,硬件訪問的word或者dword。然後F9運行,等到斷下來的時候繼續F8運行,直到繼續遇到大跳轉,到達OEP。(這裏的堆棧平衡主要是程序加了殼以後,會進行一個壓棧操作,然後有壓棧必定有出棧,那麼就可以用堆棧平衡法)

          接下來說二次內存鏡像法,這裏的操作是我們將忽略所有異常全部取消,然後打開內存界面,在.rsrc段按F2下斷,然後shift+F9運行,斷下來以後,再次在內存界面中的.code段F2下斷,再次shift+F9,然後就可以到達程序的OEP。對於這個方法,可以理解爲程序先讓它的殼的代碼進行加載,然後殼加載完畢之後,程序肯定要到自己的OEP,這時候我們在代碼段下的斷就會把它斷下來,我們就可以捕捉到真正的OEP了。

          所謂的一步直達法,其實主要是針對UPX殼和aspack殼的,對其餘的殼不是很管用。接下來介紹下方法,因爲這樣的殼,剛載入OD的時候我們會發現它是有一個pushad,壓棧,那麼肯定就有popad出棧,我們就可以打開搜索命令,記得不要勾選全部,然後輸入popad,搜索到以後下斷,F9,然後F8幾步一個大跳轉就會到真正的OEP了。

          模擬跟蹤法經常和SFX法在一起,我們打開OD的選項,調試設置中找到sfx,然後選擇在第二個或第三個,就可以讓程序自己去尋找OEP了。沒什麼技術含量,而且很費時間,不太推薦這種方法。

          最後一次異常法,其實是取消忽略所有異常,然後一直shift+F9,記得數你按了幾次shift+F9(假設是n次),然後再次載入,,按n-1次shift+f9,到了以後查看右下角的堆棧窗口,選擇SE句柄那一句,我們就可反手鍵數據窗口跟隨,然後再在數據窗口全選第一行,反手鍵選擇內存寫入斷點,shift+F9,到了以後,F8幾步就會到達真正的OEP。(很慚愧,這個方法的原理我也不太清楚其實),不過這裏我可以給大家說一個最後一次異常法的簡單技巧,我們第一次不需要取消忽略所有異常,直接讓程序運行,然後打開OD的log窗口,查看它有幾次訪問違例,就再第二次載入程序的時候,按幾次shift+f9。然後再在內存段下斷,就會來到OEP。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章