實現呼叫加殼的外殼中的子程式的一點見解。。 (1千字)

看雪資料發表於2002-10-21

加殼往往是實現對原PE的節資料加密、壓縮,若能加殼的同時,讓加殼後的程式呼叫殼中的某些子程式,那加殼強度大大增加。這樣處理後,即使脫掉了殼,程式執行也肯定不正常,因為脫殼的同時也將這些子程式脫掉了!
    怎樣實現呢?作為探討性的介紹,還是搞一個最基本的來說(假設現在您已經會寫PE-exe、PE-dll等PE加殼程式):
    我的實現是這樣的:作為一個PE檔案,多多少少程式中會有mov eax,1或mov eax,0的語句,就是從這裡開刀,因為mov eax,xxxxxxxx這樣的指令長度正好與Call xxxxxxxx指令的長度一樣,處理起來相對簡單。在加殼程式加殼時,查詢這些語句統統換成:
call shellSub
//
shellSub實現如下:
shellSub()
{
  mov eax,1 或 mov eax,0
}
    當然,這裡有個問題是怎樣計算這個Call xxxxxxxx的xxxxxxxx,其實想一想也很簡單,加殼時候我們已經計算出了外殼程式的入口RVA,只要以這個RVA為基準,就可以得到:(shellSub的RVA)-(mov eax,1的RVA)的差值,這個差值再減去5(Call的指令長度)就是xxxxxxxx。
    這裡僅僅拋磚引玉的介紹了最基本的方法,其實透過變化,可以對原程式的很多特定語句實現改成呼叫外殼中不同的sub,大大增加了外殼的保密強度。
    這樣處理後,可想而知,脫殼後的執行情況:Windows錯誤,某個地址不能為讀或寫。。呵呵,要的就是這個效果!!!
    錯誤之處,懇請各位高手指正!
                                  Spring.W
                                  2002/10/21

相關文章