VMP1.10最大保護分析
阿新 • • 發佈:2018-12-11
這次的樣本只是一條mov eax,0x200指令,用vmp1.10開全部保護:
分析如下:
首先來到vm_dipatcher處:
這裡是每次對取opcode會進行解碼,此時的vm_data中不會看到一樣的opcode,就是因為每次會進行解碼,而且在進行handler執行的時候也會對運算元進行解碼,並且更新bl這個金鑰因子。
比如這個vPushReg32這個handler,先用bl進行解碼,然後根據解碼內容再更新下bl這個金鑰因子,這防止了直接提取handler進行靜態分析,當然,也可以提權所有的opcode,以及相應的解碼演算法,進行還原到沒有加密過的opcode表:
其次就是在handler執行的過程中,常量被加密了,執行時候會對這些常量進行很多步的解碼,最後才能還原,以及加入了很多無用的步驟,具體的看分析記錄吧,每次執行完handler記錄一下堆疊的情況:
------------vPushImm32 40C3CDEE ————******———— 0019FF38 40C3CDEE ------------vPushImm32 BF3C3412 ————******———— 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vPushImm32 7607BB5D ————******———— 0019FF30 7607BB5D 0019FF34 BF3C3412 0019FF38 40C3CDEE /************************* ------------vPushReg32 vecx 0019FF2C 00000000 0019FF30 7607BB5D 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vPushReg32 vebp 0019FF28 0019FF80 0019FF2C 00000000 0019FF30 7607BB5D 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------Nor32 0019FF28 0282**** 0019FF2C FFE6007F 0019FF30 7607BB5D 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vShr8 0019FF2C FFE60200 0019FF30 7607BB5D 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vPushImm32 B82F6173 0019FF28 B82F6173 0019FF2C FFE60200 0019FF30 7607BB5D 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vPopReg32 R7 0019FF2C FFE60200 0019FF30 7607BB5D 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vShr8 0019FF2C 0200**** 0019FF30 7607BB5D 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vPopReg16 R7 0019FF30 7607BB5D 0019FF34 BF3C3412 0019FF38 40C3CDEE *************************/ ------------vPushImm32 8A39EAFE ————******———— 0019FF2C 8A39EAFE 0019FF30 7607BB5D 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vAdd32 ————******———— 0019FF30 0041A65B 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vPushReg32 Image_Base ————******———— 0019FF2C 00000000 0019FF30 0041A65B Max_Prot.0041A65B 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vAdd32 ————******———— 0019FF30 0041A65B Max_Prot.0041A65B 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vGetEsp32 ————******———— 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vPushImm32 E9780960 ————******———— 0019FF2C E9780960 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE /******************** ------------vPushEsp 0019FF28 0019FF2C 0019FF2C E9780960 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vGetEsp8 0019FF28 0060**** 0019FF2C E9780960 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vPushEsp 0019FF24 FF2A**** 0019FF28 00600019 0019FF2C E9780960 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vGetEsp16 0019FF28 00600060 0019FF2C E9780960 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vShl16 0019FF28 00600A13 0019FF2C E9780960 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------Nor16 0019FF28 F58C**** 0019FF2C E9780960 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vPushImm16 00A4 0019FF28 F58C00A4 0019FF2C E9780960 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vShr8 0019FF28 00000A46 0019FF2C E9780960 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vPopReg16 R7 0019FF28 0000**** 0019FF2C E9780960 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vPopReg16 key 0019FF2C E9780960 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ***************************/ ------------vPushImm32 3A9DF7C7 ————******———— 0019FF28 3A9DF7C7 0019FF2C E9780960 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vAdd32 ————******———— 0019FF2C 24160127 0019FF30 DBE9FED9 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vAdd32 ————******———— 0019FF30 00000000 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vAdd32 ————******———— 0019FF34 BF3C3412 0019FF38 40C3CDEE ------------vAdd32 ————******———— 0019FF38 00000200 ------------vPopReg32 veax ------------vPopad ------------vPopfd ------------vRet
一條mov eax,0x200指令,除去pushad popfd等儲存暫存器資訊操作之外,被解釋成了30條的handler,其中後面——****——為有效指令,/************ 和**********/之間的都是無效指令,我們可以直接在OD中不讓這些無效handler執行,只執行解密opcde部分,執行後的效果還是一樣。最後常量0x200是通過push的幾次立即數,加上通過一個vmp的handler地址取四位元組進行add操作最後還原到0x200。經過這麼分析之後,對vmp的部分Handler都熟悉了一下,命名等借鑑了下vmp分析外掛。