[原创]360加固VMP问题小结
通过对比360加固的VMP实现,发现以下几点问题:
一、VMP虚拟机引擎变化很小,指令执行代码没有变化,两次版本之间的指令代码基本一样
二、VMP引擎中变化的只是指令码与指令执行代码的对应关系
一个版本中的指令执行代码如下:
debug079:768FC1A4 05 9A LDR R2, [SP,#0x14] ; jumptable 768FBDA0 case 67
debug079:768FC1A6 23 69 LDR R3, [R4,#0x10]
debug079:768FC1A8 05 99 LDR R1, [SP,#0x14]
debug079:768FC1AA 12 13 ASRS R2, R2, #0xC
debug079:768FC1AC 92 00 LSLS R2, R2, #2
debug079:768FC1AE D2 58 LDR R2, [R2,R3]
debug079:768FC1B0 09 05 LSLS R1, R1, #0x14
debug079:768FC1B2 09 0F LSRS R1, R1, #0x1C
debug079:768FC1B4 89 00 LSLS R1, R1, #2
debug079:768FC1B6 CA 50 STR R2, [R1,R3]
debug079:768FC1B8 02 36 ADDS R6, #2
debug079:768FC1BA E1 E5 B loc_768FBD80
另一个版本中的指令执行代码如下:
debug071:76227C2C 05 9A LDR R2, [SP,#0x14] ; jumptable 76227828 case 235
debug071:76227C2E 23 69 LDR R3, [R4,#0x10]
debug071:76227C30 05 99 LDR R1, [SP,#0x14]
debug071:76227C32 12 13 ASRS R2, R2, #0xC
debug071:76227C34 92 00 LSLS R2, R2, #2
debug071:76227C36 D2 58 LDR R2, [R2,R3]
debug071:76227C38 09 05 LSLS R1, R1, #0x14
debug071:76227C3A 09 0F LSRS R1, R1, #0x1C
debug071:76227C3C 89 00 LSLS R1, R1, #2
debug071:76227C3E CA 50 STR R2, [R1,R3]
debug071:76227C40
debug071:76227C40 loc_76227C40 ; DATA XREF: debug071:76227B14r
debug071:76227C40 02 36 ADDS R6, #2
debug071:76227C42 E1 E5 B loc_76227808
可以看出两者的指令执行代码基本相同,只是跳转表关系改变了
三、指令执行码可以通过功能比对分析出真实指令码
例如最简单的nop指令就可以一眼看出:
debug071:76227C28 02 36 ADDS R6, #2 ; jumptable 76227828 case 183
debug071:76227C2A ED E5 B loc_76227808
总结
可以通过分析vmp指令执行代码的功能进行指令的还原,配合上针对对照表的算法的分析就可以实现指令码的还原
附件为拷贝出来的VMP引擎代码
