談談vmp的還原(3)

談談vmp的還原(3)

4 人贊了文章

前兩部分:

  • 談談vmp的還原(1)
  • 談談vmp的還原(2)

0x00 前言

vs2010,代碼放在了github:vmp

0x01 寄存器

先說context

init初始化context分兩種情況

那麼第二種,就是隨機生成了

關於pushad pushfd的保存

選取空閑的context

代碼如下:

int n = 0, k = 0;char cpu[16] = {0};int _getContextIndex( int type){if( tpye - 1 >= 2){switch(type){case 0:case 4:return dis->reg[0];case 1:case 5:return dis->reg[1];case 2:case 6:return dis->reg[2];case 3:case 7:return dis->reg[3]; case 9:case 0xD:return dis->reg[9]; default:return 0; }}else{switch(type){case 0:case 1:case 2:case 3:case 5:case 6:case 7:case 8:case 9:case 0xa:return dis->reg[_type];case 4:return -1;default:return 0;}}}for( int i = 0; i < 16; i++){if( dis->reg[i] < 0xff){cpu[ dis->reg[i]] = 1;}}i = 0;while( cpu[i] || rand()%2 != 1){i++;return _getContextIndex(tpye);}dis->reg[k] = n;return _getContextIndex(tpye);

這裡說下,看到這部分實現的時候,腦子裡的想法是當成樹結構,用dfs去識別判斷,因為以為是真輪轉。記得,還給校長說,加密與解密那個目錄處理的方法好像是圖演算法。

再注意到a2/v13 == 2, 才會去get context

隨意看一個調用,很明顯tpye == 2才會去

那麼其他的情況在只是return context,那麼就好辦了,因為可以得到,並不是真輪轉

0x10 變形

下面這個東西,也是我最佩服vmp作者的地方,因為就這點東西,就可以做很多事情了。

注意是倒敘進行判斷的

首先這個函數,我也不知道怎麼命名好,所以就當成fixed吧,可能叫plasmodium比較好 。

當我進行分析的時候,如果不是語言不在同一個頻道,可能就膜拜了。

隨意的,舉個例子。這裡可能會需要一些數據結構的知識 。

記當前結構為一個_cur_node

記當前上一個節點為_prev_node

記當前下一個節點為_next_node

假定

_cur_node: LODS BYTE PTR DS:[ESI] POP DWORD PTR DS:[EDI+EAX*4]_next_node: LODS BYTE PTR DS:[ESI] PUSH DWORD PTR DS:[EDI+EAX*4]

這兩條在操作什麼,很明顯,可以看出vmp不是沒有一些組合的

那麼可能會出現下面的情況

_next_node變成PUSH ESP

new node,生成一個新的節點,記為_tmp_node

_tmp_node: POP EAX PUSH DWORD PTR ES:[EAX]

之後在插入,如下

Before

LODS BYTE PTR DS:[ESI] POP DWORD PTR DS:[EDI+EAX*4]LODS BYTE PTR DS:[ESI] PUSH DWORD PTR DS:[EDI+EAX*4]

After:

LODS BYTE PTR DS:[ESI] POP DWORD PTR DS:[EDI+EAX*4]PUSH ESPPOP EAX PUSH DWORD PTR ES:[EAX]

注意到eax一致,然後明白這個函數了嗎?

好像就這些了,我大概想闡述的東西,就這些。

0x11 關於我還原的思路

在我逆的過程中,一直在猜想vmp作者的構造思路。

最開始的時候,我的想法是把esi看成vmp_encodes,那麼asm有套opcode的構造手冊,vmp作者也應該有一套這樣的手冊,當然也不是說像intel手冊那種。但我一直從各個角度去思考,都想不出,vmp作者是怎麼構造出這些精彩的東西的。有興趣的,可以嘗試一下,如果是大一大二,我可能就這樣繼續下去了 。

之後我想既然知道了規則,可能不同版本,會有一些變化,但大致框架如此。

而不同的是,我所想的是,是還原為encodes,而不是asm,這點也重要,因為即使trace,或者使用插件,是的,你人工可能可以識別,那麼代碼認識么,當然可以寫成分析樹或寫個虛擬引擎自己跑,但我想,這也是vmp作者願意看到的情況

那麼既然想還原成encodes,先解析esi,之後只要規則到位,那麼我們可以得到disp,imm,sib,modrm,prefix。還需要確認的,就只剩下opcode了,所幸的是,相同mnemonic對應的opcode並不多,就大概解決類型不對等的情況了 。

原文鏈接:[原創]談談vmp的還原(3)-『軟體逆向』-看雪安全論壇

本文由看雪論壇 waiWH 原創

轉載請註明來自看雪社區

推薦閱讀:

安卓逆向菜鳥的初體驗
正反合璧,挖掘war3資源地址詳細過程
一次逆向fb尋找密碼的記錄及還原相關演算法

TAG:互聯網 | 軟體逆向工程 |