这次的样本只是一条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分析插件。