轉帖|使用教程|編輯:楊鵬連|2021-06-15 11:19:45.757|閱讀 793 次
概述:?看了網上大神們寫了好多的vmp 虛擬代碼的分析 ,但是在對實在項目時,插件總是提示不對或者未知版本,一直對vm代碼的還原有質疑,于是就萌發了具體分析這個vm代碼是怎么回事,若有錯誤,歡迎指出,能力有限只能分析皮毛,只談vm的代碼。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
VMProtect是一種很可靠的工具,可以保護應用程序代碼免受分析和破解,但只有在應用程序內保護機制正確構建且沒有可能破壞整個保護的嚴重錯誤的情況下,才能實現最好的效果。
VMProtect通過在具有非標準體系結構的虛擬機上執行代碼來保護代碼,這將使分析和破解軟件變得十分困難。除此之外,VMProtect還可以生成和驗證序列號,限制免費升級等等。
VMProtect正版授權在線訂購享受最低價,僅售801元起!還不趕緊加入你的訂購清單?>>更多詳情可點擊咨詢購買
VMP3逆向分析虛擬機指令
分析環境:
windows 10 + OD + IDA7.2 + Win7x32vmware + vmp3.3.1 pro
一、初步認識與環境搭建
看了網上大神們寫了好多的vmp 虛擬代碼的分析 ,但是在對實在項目時,插件總是提示不對或者未知版本,一直對vm代碼的還原有質疑,于是就萌發了具體分析這個vm代碼是怎么回事,若有錯誤,歡迎指出,能力有限只能分析皮毛,只談vm的代碼。首先我們寫一下一個簡單的demo,主要代碼如下,然后輸出eax的值,我是用win32asm環境寫的,其他部分我就不寫出來了,就是常規的框架,這里主要是把下面這4句匯編vm然后分析虛擬機是怎么處理的,如果你沒有masm32匯編環境你也可以用vs內聯匯編代替:
mov eax, 1111H mov eax, 3333H add eax, 2222H sub eax, 1010H然后我們在看看OD上是怎么顯示的
但是在匯編上是怎么加入這個vm標志的呢我是這樣處理的 首先他主要就是加這個jmp xxxx和vmp start等這樣的匯編和字符串是吧 但是在匯編層面上我們家這個字符串他就編譯不了 我是吧他們都用NOP代替 數數是幾個字節 然后寫幾個NOP 然后編譯生成exe后 在用16進制編輯器打開他 修改就可以了。
EB 10 56 4D 50 72 6F 74 65 63 74 20 62 65 67 69 6E 00 vmpbegin EB 0E 56 4D 50 72 6F 74 65 63 74 20 65 6E 64 00 vmpend
然后其他無關vm代碼的我們就關閉了
OK 生成 我們打開OD對比一下加殼前和加殼后的代碼樣子
很明顯左邊被vm了 ,代碼很亂是吧 右邊的看著很舒服
我們在用IDA打開看看
圖也是沒邏輯 不過看到 push 和call 的組合 與jmp reg 如果之前我們分析過或看過分析vmp的文章的話
這不就是vm的入口嗎 進入vm虛擬機的入口 進入sub_42FA52函數 又是很亂的代碼
我們手工去除一下這些指令 : [patch_byte(here()+i,0x90) for i in range(3)] 我們用0x90(NOP)這個值去去除 那些無用的指令 然后后面那個range(3)中的3用我們自己的肉眼去看是多少個字節 鼠標移動到我們要去除的指令 python命令這里打上上面的腳本語句 修改這個多少個byte 回車即可
Python>[patch_byte(here()+i,0x90) for i in range(3)] [True, True, True]經過我們手工處理后 他大概成下面這個樣子 push reg 和 pushf 是環境快照 保存未入虛擬機時的環境
.vmp30:0042FA52 52 push edx .vmp30:0042BF92 9C pushf .vmp30:0042BF97 51 push ecx .vmp30:0042BFA0 53 push ebx .vmp30:0042BFA5 55 push ebp .vmp30:0042BFA6 56 push esi .vmp30:0042BFA7 50 push eax .vmp30:0042BFA8 57 push edi .vmp30:0042BFAF B8 00 00 00+ mov eax, 0 .vmp30:0042BFBA 50 push eax .vmp30:0042BFBE 8B 74 24 28 mov esi, [esp+24h+arg_0] ; 這個應該是bytescode地址 .vmp30:0042BFC2 8D B6 F1 E2+ lea esi, [esi-2F6C1D0Fh] ; ESI 代表了bytescode地址 .vmp30:0042BFC8 F7 DE neg esi .vmp30:00430A03 D1 CE ror esi, 1 .vmp30:00430A05 46 inc esi .vmp30:00430A13 0F CE bswap esi .vmp30:00430A1D 03 F0 add esi, eax .vmp30:00430A1F 8B EC mov ebp, esp ; ebp 為壓環境后esp的值 .vmp30:00430A21 81 EC C0 00+ sub esp, 0C0h ; esp下移 0xC0 .vmp30:00430A27 8B DE mov ebx, esi ; 注意這里 esp代表vm_context .vmp30:00430A29 B9 00 00 00+ mov ecx, 0 .vmp30:00430A30 2B D9 sub ebx, ecx .vmp30:00430A35 8D 3D 35 0A+ lea edi, loc_430A35 ; 跳轉base值 .vmp30:00430A45 8B 0E mov ecx, [esi] ; 獲取跳轉間隔密文 .vmp30:00430A47 81 C6 04 00+ add esi, 4 .vmp30:00430A4F 33 CB xor ecx, ebx .vmp30:00439FEC 8D 89 D9 95+ lea ecx, [ecx-21016A27h] .vmp30:00439FF9 F7 D1 not ecx .vmp30:0043A003 F7 D9 neg ecx .vmp30:0043A005 8D 89 71 E2+ lea ecx, [ecx-5AFB1D8Fh] .vmp30:00416562 0F C9 bswap ecx .vmp30:00416564 33 D9 xor ebx, ecx .vmp30:0041656B 03 F9 add edi, ecx ; 解密跳轉間隔 .vmp30:0045F2B5 57 push edi ; 壓棧反彈進入vm指令 .vmp30:0045F2B6 C3 retn看著沒什么復雜的,就是壓入寄存器保存未進入虛擬機時的環境狀態,然后給虛擬機的棧和寄存器開辟空間,esi指向bytescode 中間那里取了一個4byte值然后指針+4 取的值是密文經過 解密得出正在的值 這個值是要跳轉的長度,從哪里跳轉相對誰,edi給出了答案 (匯編代碼這么亂 而且無用的指令一大堆 時隔多年后 我們才知道這個叫混淆)
那么到這里我們得到了什么信息:
1.未進入虛擬機時,環境狀態的壓入
2.虛擬機初始化,棧(EBP)、寄存器組(ESP)、跳轉base(EDI)、字節碼(ESI)、解密因子(EBX)
我給的這個名字名稱可能是和別人分析的名字不一樣 不過內容是一樣的 本質沒什么區別
那么這個時候我們就問了,我們怎么知道EBP是虛擬機的棧、ESP是寄存器組(或者說vm_context)和ESI是字節碼(Bytescode)呢 當然我們可以看前人分析的結果是吧 但是我們應該說的是一個無到有的過程 而不是直接就說他是了 然后我們在回過頭了 假如我們不知道vm中esp是什么 ebp是什么,但是esi 這個應該可以看出來了 他肯定是保存了一串數據的 那么這一串數據是什么 我們暫且不清楚 但是我們看到有個取值 然后解析這個存在 有點像eip 是不 虛擬機是不是就是執行模擬 翻譯 你看看這個有沒有點對上的意思 然后在看看edi 他明顯是賦值一個地址 然后 +解密后的間隔 運行下去
現在我們腦子應該是有一個印象了 這里我先寫一個類似OD的界面 看看當然有的我還沒給出怎么識別 我們后面會給出 差不多就是這個樣子
如果您對該加密/解密軟件感興趣,歡迎加入加密/解密QQ交流群:740060302
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: