脫殼方法匯總


一、脫殼基礎知識
  1、脫殼的概念
  在第三章中講了加殼的概念,與加殼技術相對的就是脫殼技術了。脫殼就是將已經加殼的程序從殼中剝離出來。既然能給程序進行加殼,那也會有相應的脫殼方法。盡管理在有些殼很難脫掉,但是脫殼技術也在不斷的進步,而且在不斷競爭中發展狀大。
  2、OEP
  OPE的意思就像它的名字一樣容易理解。OEP就是原程序的入口點,也就是真正的入口點。
  當被加殼的程序運行后,首先運行的是殼程序,殼程序會將原程序還原到內存中並將控制權返還。OEP總會在這期間被脫殼者找到。只要找到這個OEP,就可以將原程序從內存中dump出來,而后針對dump出的程序進行處理,最終得到原程序。
  一般來說,脫殼就是要找程序的OEP,得到這個OEP,脫殼就完成一半了,剩下的就是修復工作了。
  3、脫殼的用處
  脫殼用處很大,可以破除殼程序對程序的保護。從而使我們更接近程序代碼,了解這個程序。而對於免殺制作者來說,脫殼的用處也很大,有些木馬生成的服務端默認就被加殼。殼把這個木馬服務端保護起來了,這或多或少對我們的免殺造也了阻礙。所以免殺制作者往往先將木馬服務端的殼脫掉,而后再按照平時免殺的方法對木馬服務端進行免殺處理。由此可見,基礎的脫殼技能是免殺技術愛好者的技能。 ===============================================================  二、單步跟蹤法
  脫殼的方法有很多,先來講脫殼方法中最基礎的單步跟蹤法。單步跟蹤法就是利用OD的單條指令執行功能,從殼的入口一直執行到OEP,最終通過這個OEP將原程序dump出來。然當,在單步跟蹤的時候需要跳過一些不能執行到的指令。
  使用單步跟蹤法追蹤OEP的常見步驟:
  1、用OD載入待脫殼文件,如果出現壓縮提示,選擇“不分析代碼”;
  2、向下單步跟蹤,實現向下的跳轉;
  3、遇到程序往上跳轉的時候(包括循環),在回跳的下一句代碼上單擊並按鍵盤上的“F4”鍵跳過回跳指令;
  4、OD中的綠色線條表示跳轉沒有實理,不必理會,紅色線條表示跳轉已經實現;
  5、如果剛載入程序的時候,在附近有一個CALL指令,那么就要按鍵盤上的“F7”鍵跟進這個CALL內,不然程序很容易運行起來;
  6、在跟蹤的時候,如果執行某個CALL指令后就運行,一定要按鍵盤上的“F7”鍵進入這個CALL之內再單步跟蹤;
  7、遇到在popad指令下的遠轉移指令時,要格處注意,因為這個遠轉移指令的目的地很可能就是OEP。
===============================================================
  三、ESP定律法
  ESP定律法是脫殼的利器,是國外友人發現的。有了ESP定律,可以方便我們脫掉大多數的壓縮殼。可謂是本世紀破解界中最偉大的發現之一。這里只簡單的看一下狹義ESP定律的原理。
  使用ESP定律追蹤OEP的常見步驟:
  1、將待脫殼程序載入到OD中,開始就按鍵盤上的“F8”鍵單步跟蹤一步,這時如果看到OD右邊的寄存器窗口中的ESP寄存器的值有沒有變為紅色,如果發現ESP寄存器的值變為紅色,執行第2步;
  2、在OD的命令行窗口中執行命令hrXXXXXXXX,xxxxxxxx就是變為紅色的ESP寄存器的值,在輸入命令之后,一定不要忘記按鍵盤上的回車鍵;
  3、按鍵盤上的“F9”鍵讓程序運行起來;
  4、使用單步跟蹤的方法跟蹤到OEP即可。
===============================================================
  四、二次斷點法
  二次斷點是有技巧的下兩個斷點,在兩個斷點之后就可以很輕松的找到OEP。
  使用二次斷點法追蹤OEP的常見步驟:
  1、將待脫殼程序載入到OD中,單擊OD的“選項”菜單下的“調試設置”命令,在彈出的“調試選項”對話框中切換到“異常”選項卡,勾選該選項卡下的所有復選框,也就是忽略所有異常;
  2、按鍵盤上的“ALT+M”組合鍵打開OD的內存窗口;
  3、在OD的內存窗口中找到“.rsrc”區段,單擊該區段后按鍵盤上的“F2”鍵在該區段上下一斷點;
  4、按“Shift+F9”讓程序運行到斷點心處,而后再次打開OD的內存窗口,這次在“.rsrc”區段上面的“.code”區段(有的時候就是“.text”)上下一個斷點;
  5、按“shift+F9”讓程序運行到第二次下的斷點處,然后單步跟蹤既可以來到OEP。
===============================================================
  五、末次異常法
  在脫殼方法中,末次異常法又被稱為最后一次異常法,這是最基礎的脫殼技術之一。末次異常法脫殼很是簡單,但就是這簡單的脫殼方法可以挑掉曾經風靡一時的強殼。
  使用末次異常法追蹤OEP的常見步驟:
  1、將待脫殼程序載入到OD中,單擊OD的“選項”菜單,在彈出的菜單中單擊“調試設置”命令,在隨后彈出的“調試選項”對話框中切換到“異常”選項卡,清除該選項卡下所有復選框,也就是不忽略任何異常;
  2、連續按鍵盤上的“Shift+F9”組合鍵讓程序運行起來,記錄按鍵的次數X;
  3、回到OD中,按鍵盤上的“Ctrl+F2”組合鍵重新載入程序,按X-1次“Shift+F9”組合鍵;
  4、在OD右下角窗口中找到“SE句柄”或是“SE處理程序”,記錄此處的內存地址;
  5、在OD的反匯編窗口中跟隨到上一步記錄下的內存地址,並在此內存地址處下一個斷點;
  6、按鍵盤上的“Shift+F9”組合鍵讓程序運行到上一步下的斷點處,按鍵盤上的“F2”鍵取消此處的斷點;
  7、使用單步跟蹤法追蹤到OEP。
===============================================================
  六、模擬跟蹤法
  在這章中講到的眾多脫殼方法中,我們首先講了單步跟蹤法脫殼,因為單步跟蹤脫殼法是脫殼技術中最基礎的方法,在后面其它的一些脫殼方法中總會或多或少的配合單步跟蹤法才能順利完成脫殼工作。便是始終是一次次的按“F8”鍵來單步跟蹤程序,偶爾遇到回跳就跳過執行,這樣機械性的操作很是煩人,那么能不能讓機器來代替人力,讓工具幫我們單步跟蹤呢?答案是肯定的,這也就是這節講的內容——模擬跟蹤法。模擬脫殼法就是模擬單步跟蹤來進行查找OEP。
  模擬跟蹤法的常見步驟:
  1、將待脫殼程序載入OD中,先簡單的跟蹤一下程序,看看有沒有SEH暗樁;
  2、按鍵盤上的“ALT+F9”打開OD的內存窗口,找到“SFX,輸入表,資源”的行,並記錄此行的內存地址;
  3、在OD的命令行窗口執行命令“tc   eip<上一步中記錄下的地址”,命令執行后就會跟蹤到OEP。
===============================================================
  七、SFX自動脫殼法
  在上一節,我們使用模擬跟蹤法代替手動單步跟蹤法進行脫殼。在OD中,不但可以利用模擬跟蹤來代替單步跟蹤進行脫殼,從而節省勞動力,還有一種SFX自動脫殼的方法也可以節省勞動力,並能快速有效的將程序的殼脫掉。
  使用SFX自動脫殼法脫殼的常見步驟:
  1、將OD設置為忽略所有異常;
  2、在OD的“調試選項”對話框的“SFX”選項卡中選擇“字節模式跟蹤實際入口”選項並確定;
  3、將待脫殼程序載入OD,待程序載入完成后,會直接停在OEP處。
===============================================================
  八、出口標志法
  前面幾個脫殼方法中有一個共同點,就是在單步跟蹤到popad指令后面不遠處的jmp指令的時候,就可以大膽的判斷這個jmp指令的目的地址就是OEP。原因很簡單,popad指令用於將殼運行之前保存的環境恢復,使原程序能正常運行。有些殼的popad指令很少,我們就可以查看被這種殼加殼的程序的所有popad指令,找到后面存在jmp指令的popad指令,然后來到其后的jmp指令的目的地址,這很可能就是OEP,然后就可以進行dump脫殼了。
  使用出口標志法脫殼的常見步驟:
  1、將待脫殼程序載入OD中,在OD的反匯編客人口中單擊鼠標右鍵,在彈出的右鍵菜單中單擊“查找”→“所有命令”,在彈出的輸入框中輸入“popad”並按“查找”按鈕;
  2、逐一嘗試跟蹤查找到的所有“popad”指令,最終達到程序的OEP。
===============================================================
  九、使用脫殼腳本輔助脫殼
  在脫殼的時候,使用模擬跟蹤法可以讓OD代替我們單步跟蹤程序直到OEP,這樣大大提高了脫殼的效率。但是模擬跟蹤法並不能跟蹤到一些較強的殼的OEP,這時我們可以使用高手們寫的脫殼腳本來幫助我們完成脫殼工作,使用脫殼腳本來脫殼要比手動跟蹤方便得多。脫殼腳本就是高手們為了方便自己或他人脫殼,把自己手動脫殼的步驟記錄下來,保存的一個文本文檔。雖然脫殼腳本是一個文本文檔,可以使用記事本將其打開,但是輕易不要用這種方式修改脫殼腳本,因為直接修改脫殼腳本,很可能造成脫殼腳本不能正確完成對應的脫殼工作。
===============================================================
  十、使用脫殼工具脫殼
  脫殼工具很多,這里只介紹最為實用的全自動脫殼機——超級巡警脫殼工具。
  超級巡警脫殼工具的工作方法:
  超級巡警脫殼工具會自動偵測待脫殼程序所加的殼頭,從而判斷出帶脫殼程序是用哪種殼程序加殼的。如果超級巡警脫殼工具支持對該殼的脫殼,就可以很方便的將程序的殼脫掉;如果不支持對該殼的脫殼,則會給我們一個簡單明了的提示。
===============================================================
  第六章
  1、利用加多個花指令的方法實現木馬免殺
  加多個花指令和加單一花指令的原理基本相同,都是讓程序先執行花指令再執行原程序從而實現程序代碼的復雜化。不過稍有不同的是,加單一花指令時,最后的跳轉指令是直接跳轉到原程序入口點,而我們加多個花指令時,第一個花指令最后的跳轉語句則是跳轉到第二個花指令的起始地址,這樣在第一個花指令執行完成后就會直接執行第二個花指令,然后第二個花指令的結晶尾再跳轉到第三個花指令的起始位置,以此類推……最后一個花指令的結尾就直接跳轉到原程序入口。原理和加單一花指令基本沒什么區別,只是工作量大一些。不過加多花的免殺效果要比加單一花的免殺效果好得多。
  2、利用殼外花實理木馬免殺
  原理:先給木馬加上一個普通的壓縮殼以減小木馬的體積。然后再給加過殼的木馬加上一個花指令,這樣就可以干擾殺毒軟件對木馬所加殼的判斷,從而實現免殺目的。
  3、利用修改殼頭實現木馬免殺
  我們知道,殺毒軟件是通過將被檢測文件的頭部代碼與殼特征碼進行比對,以此來判斷被檢測文件所加的殼的種類。因為匯編指令里有很多等效指令,比如“add ebp,8”和“sub ebp,-8”就是等效的。我們大可以利用這些等效代碼來實現對木馬殼頭的修改從而實現免殺目的。
  4、利用移動PE頭的方法實現木馬免殺
  這里講一下如何利用移動PE文件頭來實現木馬免殺。先來回顧一下第三章中講到的內容。“DOS MZ header”是DOS頭,DOS頭在Windows下可以被忽略。而我們就可以將原來的PE文件頭移動到DOS部分(將DOS覆蓋)。因為DOS頭在Windows下可以被忽略,所以我們移動PE頭后的新程序也是可以正常運行的。
  免殺的方法有很多,這里只是講了幾種常見的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM