談談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 原創
轉載請註明來自看雪社區
推薦閱讀: