對殼的一些理解

2022-01-15 04:04:51 字數 1264 閱讀 9648

需要兩個檔案:待加殼的a.exe和加殼程式。加殼程式對a.exe檔案處理後,對a.exe做的手腳也就是清除或者加密原檔案的iat和各個段(**和資料段等),並且會在a.exe檔案中新增加一些內容,這些內容可能獨立的在乙個新的段中,也可能在原來的段中,一般新的內容是可執行的,這些新的內容就構成了外殼程式;外殼程式的作用就是對加殼程式的所作所為「負責「,加殼程式對a.exe檔案各段加密和壓縮,那外殼程式就要對a.exe檔案的各個段解密和解壓縮。

細節:1、加殼程式的處理,修改程式入口點,使先執行自己的程式段,加殼程式在a.exe檔案中新增加乙個自己的輸入表,修改a.exe原檔案pe頭中的指向輸入表的指標為指向自己建立的新的輸入表,加殼程式還會對原檔案中資料加密壓縮;2、外殼程式,對已經加殼的檔案各區段解密,填充原來的iat,跳轉來oep。

stolen bytes:是一種保護技術,把oep處的**搬移出來一些,這樣在外殼程式處理完事情後,不是直接跳轉到原來oep,而是先執行一些**再跳轉,使殼和原程式沒有明顯的分界線,增加了迷惑性吧;

外殼程式需要的函式:一般情況下必須的有,loadlibrary用來載入模組如kernel32.dll等,getprocaddr用來得到其他函式(如virtualalloc申請記憶體)的位址,還有getmodulehandle函式和loadlibrary功能相近;當然外殼程式會用到 的函式會有很多,其他的函式都能通過這三個函式來呼叫;

找oep方法:

1、兩次記憶體斷點法,外殼程式對原來資料段解密填充時會寫入一次,把所有斷解密完成後對原**段執行時會訪問一次,對其他段的讀取也會有一次訪問,一種方法是在.data資料段設定斷點,再在**段.text設定斷點;第一次執行到斷點處時把text段解壓完畢,開始解壓資料段,第二次執行到斷點處時開始執行所有段解壓完畢,開始執行**段。2、esp定律,外殼**執行開始處一般會對棧操作(並且操作都是以壓棧開始),假如程式裝入od時esp為*******4,第一回對棧操作(壓棧)後esp會變化為*******0,對*******0下硬體斷點並執行程式會到外殼程式出口處,也就是到了oep處;其原理是堆疊平衡原理,外殼程式相當於乙個子程式,子程式操作完時會把棧恢復到原來的狀態,這樣為斷點找子程式的結束成為可能。hr是硬體讀操作斷點,hw硬體寫操作斷點3、根據編譯語言,不同的編譯語言在程式開始前會呼叫一些啟動函式來處理初始化工作,然後再執行main函式,例如vc6會呼叫getversion函式,通過斷點(hr 

getversion)這些函式來完成找到oep。

殼的工作猜想:殼會間接呼叫virtualalloc等函式來在記憶體中申請一些記憶體來執行其他重要的函式,因為原始的函式只有loadlibrary和getprocaddr等;

對Linux inode的一些理解

檔名 inode device block 一 inode是什麼?理解inode,要從檔案儲存說起。檔案儲存在硬碟上,硬碟的最小儲存單位叫做 扇區 sector 每個扇區儲存512位元組 相當於0.5kb 作業系統讀取硬碟的時候,不會乙個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次...

對棧的一些理解

之前總結過一篇有關函式棧幀的部落格 函式棧幀以及呼叫約定相關的一些總結 但是感覺自己還是有一點知識點沒有弄懂,今天中午跟郭哥吃過飯一起 有關殼的問題的時候,順便把這個問題請教了一下郭哥,終於弄明白了,在此要特地感謝他,這裡把一些心得體會寫出來 先看一幅圖 選自ida權威指南 注意圖中是基於esp的棧...

對EK的一些理解

首先是網路流問題的提出 乙個源點,乙個匯點,不斷又源點向匯點輸送,其中路徑上有最大速度,求匯點收貨的最大速度是多少。在求之前可以先模擬一下過程如果源點現在只能出乙個單位的貨,那麼他會找乙個未達到最大速度的路進行運輸,接著我們不斷將運輸的量放大,即不斷地從起點開始尋找增廣路,每次都對其進行增廣,直到源...