什麼是壓縮殼呢?這個和我們的壓縮檔案做法很類似,就是將**加密壓縮。經過壓縮殼處理的程式,由作業系統載入後先執行的不是真正的程式**,而是一段解壓縮演算法,這段**會將壓縮的程式**在記憶體中還原,就類似我們將壓縮檔案在當前目錄展開一樣,當解壓縮**執行完成,原本的程式**也已經在記憶體中完全展開了,這個時候解壓縮**最後會有乙個跳轉語句,跳轉到原本程式的真正入口位址。
怎麼脫殼呢?既然解壓縮**完成後,真正的程式**會完整的出現在記憶體中,我們只要在這個時候暫停程式,把整個程式記憶體dump下來儲存成可執行檔案,那麼我們不就獲得了沒加殼的源程式了嗎?那麼怎麼知道解壓縮**什麼時候執行完呢?這就要用到esp定律了,什麼是esp定律呢?我們知道函式呼叫完成後會平衡堆疊,即壓入多少個輸入引數,當函式返回的時候就要彈出多少個引數,保證函式呼叫前後esp指標不變。我們可以把整個解壓縮**當做乙個函式,因為它要保證加殼的程式和沒加殼的程式執行時要一模一樣,所以在最開始的時候會使用pushad將所有暫存器的值都儲存到棧中(這也是壓縮殼的特徵之一:開頭的第一條指令一般是pushad,或者使用push xx+ret的方式,xx處才是pushad指令),然後在解壓縮完成後再使用popad還原,所以我們只要找到popad指令,就找到了解壓縮**結束的位置。
直接搜尋popad指令是不太恰當的做法,因為程式可能有多處popad指令,那麼怎麼辦呢?pushad和popad操作的肯定是同一塊記憶體,我們在pushad指令執行後,在棧頂設定乙個硬體訪問斷點,那麼再次訪問這塊記憶體的指令就只有解壓縮**末尾的popad指令了,這個時候cpu會自動幫我們中斷下程式,這樣我們就找到了解壓縮**的結束位置了。具體操作如下(本例使用freeupx對crackme.chm的figugegl.1.exe程式加殼來做測試):
首先載入有壓縮殼的程式,先單步執行第一條pushad指令(有時候壓縮殼的開頭可能是push xx+ret的格式,這個時候單步步入跟蹤幾下就可以看到pushad指令)
然後在暫存器的esp暫存器上右鍵,選擇資料視窗跟隨
選中棧頂的四個位元組,然後右鍵斷點->硬體訪問->dword,然後f9執行程式,程式很快會自動暫停
選擇除錯->硬體斷點,刪除剛才新增的斷點,然後在**視窗找到jmp指令,讓程式執行到jmp指令處
這個就是壓縮殼程式的另乙個特徵,就是popad後會跟著一條jmp指令,這條指令跳轉的位址就是我們真正程式的入口位址,按下f8不過進入程式的真正入口位址處,然後右鍵將程式dump下來
選擇脫殼,然後儲存檔案便大功告成了~
實戰北斗壓縮殼 ESP定律法
請注意 該動畫內所含廣告與本站無任何關係,為作者個人宣傳,網路交易風險自負 大家好 我是skey qq 63190823 這次我們來脫北斗壓縮殼3.7。好殼加好了 加殼好後用ollydbg od 開啟 0101a126 9c pushfd 載入od後程式停在了這裡 我用f8單步跟蹤 看見暫存器裡有反...
脫一些簡單的壓縮殼
脫一些簡單的壓縮殼.首先看看乙個殼的基本流程 1 儲存入口引數,一般都有這一步了 2 獲取外殼所需的位址,比如loadlibrary,getprocaddress 3 解密源程式的各個區塊 4 iat的初始化,這個所有的殼都必須做的事情,這一步也是鬥爭最激烈的戰場 5 重定位的處理,exe加密就沒有...
手動脫WinUpack 殼實戰
吾愛破解培訓第一課選修作業第6 個練習示例程式。不得不重複那句話,沒見過這種殼,該殼是壓縮殼的一種,相對於壓縮殼,加密殼的難度要大一些,特別是 iat表的修復問題上。首先分別使用die 和exeinfo pe 對該加殼程式進行查殼的處理。od載入加 winupack 殼的程式進行動態除錯分析,加殼程...