VMProtect完美脫殼過程
1.查看程序
這是我自己寫的一個VB的小程序,長得有點醜,別介意。然後自己加了一個殼,是VMProtect v.1.6x - 2.03的殼。
接下來我們國際慣例,用PEID,EXEinfo PE查一下殼
可以看到是加了VMP的殼的,VMP殼的介紹我會放在帖子的最後哦。
2.拉到OD去啦~
push 0xE131EEA3 這其實就是被VM過的OEP,你問我啥是Push?push 就是把什麼什麼東西壓入棧中,你懂吧?就那個右下角的框框!
(注:爲了帖子的精華呢我們舉個栗子,VC++6.0編譯的程序 大家都知道它的OEP開頭是push ebp,那大家知道這個push ebp是什麼意思嗎?push ebp的意思是把ebp壓入棧中,就相當於 int main() {} 程序的main函數哦!如果我講的不夠詳細大家方可百度看看!)
接下來我們用到一個函數。
3.Ctrl+G搜索VirtualProtectEx(虛擬地址處理)
來到這裏之後呢,我們在這個7D85E1FF這裏按下鍵盤上的F2。下一個斷點,運行程序,看看程序的變化。
Alt+M 來到這裏
我們可以看到有PE文件頭,等等等之類的。
我們數一下這裏有幾個段。
到這個VMP1這裏一共是有五個段,啥意思呢?意思是我們運行程序五次,記住,不要第六次哦,第六次就跑飛了,程序跑到虛擬地址裏去了。
這是運行五次之後,堆棧的狀態
這是運行第六次之後,堆棧的狀態
程序已經跑到虛擬地址裏面去了,那我們就跑第五次就可以啦
現在是一個很好的返回時機,我們在.text的代碼段下一個內存訪問斷點。然後F9運行,這樣我們就跑出了VMP段了。
來到這裏之後呢,一直往下跟可以跟到OEP。
我們直接查看,點擊M
然後右鍵.text在反彙編窗口中查看
然後右鍵分析代碼
搜索FF 25
可以來到他的JMP頭
往下面看都是有很多的JMP
那麼我們就去它的尾巴看看
從模塊中刪除分析,然後呢,點擊M。
ctrl+F搜索76 62 35
這是VB的程序,我們要找到這個,然後可以看到00401368 我們記住這個。
回到反彙編窗口,空格彙編,把我們之前的push 0xxxxxxx改成我們的push 0x401368
然後下面的這個CALL,它CALL的是上面的JMP,那我們也修改一下這個CALL。
修改完是這樣的,然後接着我們需要修復轉存。
記得不要忘了右鍵在此處從新的EIP哦
4.修復轉存
我們需要打開Import REConstructor 這款工具呢就不做多的介紹了。
找到我們需要修復的進程
然後去OD看看dump的OEP是多少,
114C,複製下來,
點擊自動搜索,獲取導入表,然後啥的就不說了。
還有LordPE我們修正鏡像大小,然後完整轉存,這都是正常的修復,都懂。
然後把Import REConstructor 的修復儲存到我們LordPE dump出來的軟件上就可以啦,我們先點開軟件看看吧。
一個是我們原版的,一個是脫殼後的,我們給脫殼後的進行查殼看看。
噹噹噹,脫殼完成。
然後我們打開軟件,看看是否可以運行。