脫殼學習筆記_第1頁
脫殼學習筆記_第2頁
脫殼學習筆記_第3頁
脫殼學習筆記_第4頁
脫殼學習筆記_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、脫殼學習筆記l 脫殼綜述A. 殼的加載1. 保存入口參數加殼程序初始化時保存各寄存器的值,外殼執行完畢,再恢復各寄存器內容,最后再跳到原程序執行。通常使用pushad/popad、pushfd/popfd指令對來保護與恢復環境。2. 獲取殼自己所需要使用的API地址 一般殼的輸入表中只有GetProcAddress、GetModuleHandle和LoadLibrary這幾個API函數,甚至只有Kernel32.dll以及GetProcAddress。如果需要其他API函數,則通過LoadLibrary載入所需要的Dll或者使用GetModuleHandle來獲取所需dll句柄,然后GetPr

2、ocAddress來獲取具體的API函數。3. 解密原程序的各個區塊的數據 殼一般按區塊加密,那么在解密時也是按區塊解密,并且把解密的區塊的數據按照區塊的定義放在合適的內存位置。4. IAT的初始化 在加殼時,殼會自己構造一個導入表,并讓PE頭中的導入表指針指向了自建的導入表。系統會在載入程序時加載這個導入表。原程序的導入表則是由殼處理,最終構建原程序的IAT。5. 重定位項的處理6. HOOK-API 在殼處理導入表時,殼可以將HOOK-API的代碼的地址填入IAT,從而間接獲取程序的控制權。7. 跳轉到程序的原入口點(OEP) 從這個時候起殼就把控制權交還給原程序了,一般的殼在這里會有明顯

3、的一個“分界線”。當然現在越來越多的加密殼將OEP一段代碼搬到外殼的地址空間里,然后將這段代碼清除掉,這種技術成為Stolen Bytes。這樣,OEP與外殼間就沒那條明顯的分界線了。l 01脫殼軟件介紹脫殼的一般流程:查殼(PEID、FI、PE-SCAN)à尋找OEP(OD)à脫殼(LordPE、PeDumper、 OD自帶的脫殼插件、PETools)à修復(Import REConstructor)PEID原理:提取特征碼,然后對比。在userdb.txt中存儲著特征碼。脫殼技巧:近CALL用F7跟進,遠CALL用F8跳過。 初步猜測,由于代碼之間插有數據,或

4、者非有意義代碼,故使用近跳跳過。如: 圖中所示為跳到0A處,但0A處沒有代碼。強制將0A處編碼:哦,其實這里是一段混淆代碼。Pop EBP賦值EBP為0040D007,自增1獲得0040D008,在入棧,然后ret便到了0040D008處。這一段代碼中沒有絕對地址,只有很小的偏移量,其原因就是在代碼中間插入了一個字節,代碼的作用便是跳過這一字節。其實,這是一段重定位代碼,使用EBP獲取EIP。OEP的判斷:大跨段跳轉,如下:從D3BA跳到10CC處,跨越不小。l 02 脫殼常用思路A. 單步跟蹤法1. 用OD 載入,點“不分析代碼!”2. 單步向下跟蹤F8,實現向下的跳轉,向上的跳使用F4到下

5、一句打斷3. 近CALL使用F7,跟飛的CALL使用F74. 一般情況下,遇到很遠的跳轉(大跨段),比如jxx XXXX或者push XXXX retn,機會很快到程序的OEPPS:在有些殼無法向下跟蹤的時候,我們可以在附近找到沒有實現的大跳轉,在跳轉地址下斷點,shift+f9運行到此,繼續F8,一般情況可以輕松跟到OEP。B. ESP定律法1. 程序開始F8,同時觀察OD右上角的ESP寄存器。2. 變色之后,在ESP所指向的內存地址設置硬件斷點,F9運行,直接來到大跨段跳轉處。:所謂的ESP定律法是由于pushad保存環境,而popad是恢復環境,而在此期間,此段棧空間是不會被訪問的,而當

6、其被訪問的時候,便是肉被釋放的時候。C. 內存鏡像法1. 忽略所有異常2. ALT+M打開內存鏡像,找到主模塊的第一個.rsrc按F2設置斷點,SHIFT+F9或者無異常F9運行直到程序停下,ALT+M再次打開內存鏡像,在主模塊.rsrc上的.txt或者.code處設置斷點,SHIFT+F9或者無異常F9運行直到程序停下,此處即為OEP。D. 一步到達OEP1. 載入程序,Ctrl+F,輸入POPAD(適合少數殼,包括UPX, ASPACK),然后找到附近有大跨段處,然后F2設置斷點,F9運行到此處。E. 最后一次異常法1. 載入程序,去掉忽略所有異常。2. SHIFT+F9直到程序運行,統計

7、SHIFT+F9總共被按下的次數m3. 重新載入程序,SHIFT+F9按m-1次4. 此時,OD左下角有一個“SE 句柄”,在句柄前的地址處設置斷點,然后SHIFT+F9運行5. 去掉斷點,F8跟蹤直到OEP。F. 模擬跟蹤法1. 先運行程序,跟蹤一下程序,看有沒有SEH暗裝之類2. 打開內存查看窗口,找到如下圖陰影所示3. 在命令行輸入tc eip<0040D000,回車跟蹤:當程序的EIP>0040D000時,肉已經出來了。G. “SFX”法1. 忽略所有異常2. 切換到SFX選項卡,選擇“字節模式跟蹤實際入口(速度非常慢)”,確定3. 重新載入程序,(如果跳出是否壓縮代碼對話

8、框,選擇否,OD直接到達OEP)l 03手脫UPX的四種方法1. 單步跟蹤法2. ESP定律法3. 內存鏡像法4. 查找POPADl 04手脫ASPackA. ASPack1. 單步跟蹤2. ESP定律3. 內存鏡像法4. 查找POPADB. ASPack變形殼1. 單步跟蹤2. ESP定律3. 內存鏡像法l 05 Fsg1.33A. Fsg1.331. 單步跟蹤法此處時跟蹤到一個大跨段跳轉處,如下向后觀察發現,沒有多少有意義的代碼了,如:故猜測:fsg1.33殼是對肉的釋放有個是否成功的判斷,因為ebx被用來作為重定位使用了。2. ESP定律法3. 模擬跟蹤法B. Fsg1.33變形殼方法同

9、上,此處需注意的是脫殼之后,程序會有一個莫名其妙的中斷,nop掉便可以繼續執行。l 06 PECompactA. PECompact1.841. 單步跟蹤法,如果打斷上跳時,程序跑飛了,此處一般會有一些莫名其妙的指令,如特權指令,此時,則在附近找未實現的遠跳,并F4到遠跳地址。2. ESP定律3. 模擬跟蹤法B. PECompact2.55在virtualfree的實現處設置斷點,然后查找特征碼push 8000,再然后單步跟蹤到OEP。l 07 手脫北斗 和 PEncryptA. 1.31. ESP定律2. Vc+入口GetVersion3. 單步跟蹤法B. 1.4同上C. PEncrypt

10、 v4.0 最后一次異常法PS:一系列的異常雖然干擾調試,但也指了一條明路,使用Shift+F9忽略前面的異常,只剩下最后一處異常,在它的恢復異常處設置斷點,跟蹤到脫殼入口點。l 08A. Yoda's Crypter v1.2使用內存鏡像法dump文件,修復的時候,會遇到好多無效的導入函數,如下:這時,需對這些導入函數進行修復,使用ImRec工具,顯示所有無效,右鍵->跟蹤級別1(反匯編),就會修復這些無效導入函數;或者,選中其中一個導入函數,右鍵->反匯編/十六進制查看,如下:然后,一次對應指針值,在被選中的函數上雙擊,彈出輸入表編輯框,如下:然后進行手動編輯,修復輸入

11、函數。或者,將加殼程序打開,使用二級跟蹤或者三級跟蹤。后兩個有些慢。:猜測二級需要對指定程序設置鉤子,故如果目標程序在調試狀態則會卡死,捕獲標志也是類似吧可能需要對目標程序做一些額外操作,故而與調試程序沖突。B. SFX方法脫絕大部分壓縮殼和少部分加密殼Dxpack 0.86fsg 1.33.98.EPCSHRINK.98.EPETITE.98.EWWPack32 1.12Yoda's Crypter v1.2.98.El 09 tElock1. 最后一次異常法2. 最后一次異常法 + 模擬跟蹤法,即最后一次異常后的單步跟蹤使用模擬跟蹤法替換3. 內存鏡像法修復:本程序修復的時候,使用

12、跟蹤級別3(捕獲標志)l 10 A. PETITE ESP 定律法修復: 跟蹤級別1(反匯編)B. Fsg2.0如下圖:首先將esp與內存中一個數據交換,而此數據作為地址所指向的內容如下:其中便有OEP。修復:手動查找IAT。l 11 ESP定律和內存斷點內存鏡像法的原理:對于肉的恢復,順序恢復code、data、rsrc段,首先斷在rsrc段,當程序停在此處時,code段已經恢復完畢,然后斷在code段,當程序停在code段時,程序是即將執行code段的代碼,即,此時肉已經恢復完畢。l 12附加數據的處理脫殼及修復后,出現如下彈框:附加數據處理:將目標程序的區段外的數據拷貝到修復后的PE文件

13、末尾。l 13解除程序自校驗程序自校驗關鍵點在于CreateFile,通過此函數查找到自校驗代碼,簡單校驗無非是比較文件類型、大小等校驗值??捎诖颂幈┝ζ平狻 14 老王殼EncryptPEESP定律處理附加數據l 15 Armadillo 1.xx - 2.xxBp GetModuleHandleA bp GetCurrentThreadId無效指針剪切l 16 Armadillo 3.78 - 4.xx1. 雙邊單(是程序把自己當成子程序運行)在 OpenMutexA處設置斷點,將以下匯編內容寫入00401000處,00401000 60 pushad00401001 9C pushfd

14、00401002 68 A0FD1200 push 12FDA0 ; ASCII "44C:DA47D45903"00401007 33C0 xor eax,eax00401009 50 push eax0040100A 50 push eax0040100B E8 E694A677 call KERNEL32.CreateMutexA00401010 9D popfd00401011 61 popad00401012 - E9 8F9FA777 jmp KERNEL32.OpenMutexA2. 避開反調試OutputDebugStringA設置斷點,選中%s%之類的字符

15、,點右鍵>二進制>使用00填充3. Magic Jump,避開IAT加密he GetModuleHandleA+5001292A4 /0012EBB0001292A8 |01066AC2 返回到 01066AC2 來自 KERNEL32.GetModuleHandleA001292AC |0107BD6C ASCII "kernel32.dll"001292B0 |0107DDAC ASCII "VirtualAlloc"001292A4 /0012EBB0001292A8 |01066ADF 返回到 01066ADF 來自 KERNEL32

16、.GetModuleHandleA001292AC |0107BD6C ASCII "kernel32.dll"001292B0 |0107DDA0 ASCII "VirtualFree"00129008 /001292A80012900C |01055A99 返回到 01055A99 來自 KERNEL32.GetModuleHandleA00129010 |0012915C ASCII "kernel32.dll" /取消斷點,返回!此處返回后,修改在LoadLibrary后面修改第一個跳轉je為JMP,然后找到下面指令序列:01

17、055C0E 0F85 49FEFFFF jnz 01055A5D01055C14 EB 03 jmp short 01055C19 /F2下斷,Shift+F9,斷下!取消斷點!01055C16 D6 salc01055C17 D6 salc程序運行到此處后,打開內存鏡像,在00401000處下斷,Shift+F9,程序停止后,單步到達OEP。4. 修復:無效指針剪切l 17 Acprotect脫殼:忽略除了內存訪問之外的異常,F9一次,在異常句柄處設置內存訪問斷點,Shift+F9停止,在EIP處設置F2,再次Shift+F9停止,在EIP處設置F2,再次Shift+F9停止,設置內存斷點,程序停在入口處,此時,需要補完被偷的代碼。修復:OD插

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論