VMP分析一:寄存器赋值分析

源码:
mov eax,0x123456
 

进入VM前寄存器和堆栈的值

EAX AAAAAAAA
ECX CCCCCCCC
EDX DDDDDDDD
EBX BBBBBBBB
ESP 0018FEE8
EBP EEEEEEEE
ESI 99999999
EDI 88888888
EIP 00427079 TestVmp_.00427079
C 0  ES 002B 32位 0(FFFFFFFF)
P 1  CS 0023 32位 0(FFFFFFFF)
A 0  SS 002B 32位 0(FFFFFFFF)
Z 0  DS 002B 32位 0(FFFFFFFF)
S 0  FS 0053 32位 7EFDD000(FFF)
T 0  GS 002B 32位 0(FFFFFFFF)
D 0
O 0  LastErr ERROR_SUCCESS (00000000)
EFL 00000206 (NO,NB,NE,A,NS,PE,GE,G)
ST0 empty 0.0
ST1 empty 0.0
ST2 empty 0.0
ST3 empty 0.0
ST4 empty 0.0
ST5 empty 0.0
ST6 empty 0.0
ST7 empty 0.0
               3 2 1 0      E S P U O Z D I
FST 0000  Cond 0 0 0 0  Err 0 0 0 0 0 0 0 0  (GT)
FCW 027F  Prec NEAR,53  掩码    1 1 1 1 1 1


0018FEE8   00000000
0018FEEC   00000000
0018FEF0   7EFDE000
0018FEF4   F3B5AB2F
0018FEF8   00000000
0018FEFC   00000000
0018FF00   7EFDE000
0018FF04   00425276  TestVmp_.00425276
0018FF08   9938AD55
0018FF0C   0018FF1C
0018FF10   0018FF70
0018FF14   0042546A  TestVmp_.0042546A
0018FF18   F3EA9E37
0018FF1C   FFFFFFFE
0018FF20   0018FF2C

------------------------------------------------------------------------------------------------------

Log data, 条目 10
 地址=0048417C
 消息=0x48417c-->func13_call_dw[ebp]
Log data, 条目 8
 地址=004834EE
 消息=0x4834ee-->func25_retn_dw[esp]
Log data, 条目 4
 地址=004851DF
 消息=0x4851df-->func24_ jmp_dw[ebp]
-----------------------------------------------------
dispatch地址

00484256    FF7424 38       push dword ptr ss:[esp+0x38]             ; TestVmp_.00483535
0048425A    C2 3C00         retn 0x3C

----------------------------------------------------------------------------------------------------

        

           func3_mov_dw[edi]_dw[ebp]		    |  reg=3c	0				;VM入口的 push 0

           func11_push_dw[ebp]_dw[esi]		    |  reg=ff	7647153b			
           func40_add_dw[ebp]_[ebp+4]		    |  reg=ff	7647153b	202
           func3_mov_dw[edi]_dw[ebp]		    |  reg=04	202
           func3_mov_dw[edi]_dw[ebp]		    |  reg=34	7647153b			;类似校验

           func3_mov_dw[edi]_dw[ebp]		    |  reg=30	99999999
           func3_mov_dw[edi]_dw[ebp]		    |  reg=18	dddddddd
           func3_mov_dw[edi]_dw[ebp]		    |  reg=14	bbbbbbbb
           func3_mov_dw[edi]_dw[ebp]		    |  reg=04	bbbbbbbb
           func3_mov_dw[edi]_dw[ebp]		    |  reg=24	eeeeeeee
           func3_mov_dw[edi]_dw[ebp]		    |  reg=08	206
           func3_mov_dw[edi]_dw[ebp]		    |  reg=0c	88888888
           func3_mov_dw[edi]_dw[ebp]		    |  reg=20	cccccccc
           func3_mov_dw[edi]_dw[ebp]		    |  reg=38	aaaaaaaa			;保存寄存器

           func3_mov_dw[edi]_dw[ebp]		    |  reg=1c	5ceb61a0
           func3_mov_dw[edi]_dw[ebp]		    |  reg=1c	5659631f			;保存两个常量

           func6_push_dw[ebp]_dw[edi]		    |  reg=08	206
           func11_push_dw[ebp]_dw[esi]		    |  reg=ff	aac8e133
           func11_push_dw[ebp]_dw[esi]		    |  reg=ff	aac8de94			

           func27_push_dw[ebp]_w[esi]		    |  reg=ff	fffffeff
           func6_push_dw[ebp]_dw[edi]		    |  reg=08	206
           func6_push_dw[ebp]_dw[edi]		    |  reg=08	206
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	fffffdf9	286		; nand(206,206)
           func3_mov_dw[edi]_dw[ebp]		    |  reg=1c	286
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	0	246			; nand( nand(206,206) , nand(100,100) ) == and (206 , 100)
           func3_mov_dw[edi]_dw[ebp]		    |  reg=2c	246
           func3_mov_dw[edi]_dw[ebp]		    |  reg=00	0				; 保存结果到VM寄存器

           func12_push_dw[ebp]_ebp		    |  reg=ff	18fed8			
           func29_push_w[ebp]_b[esi]		    |  reg=ff	4
           func6_push_dw[ebp]_dw[edi]		    |  reg=2c	246				; 取出 and (206 , 100) 的标志
           func6_push_dw[ebp]_dw[edi]		    |  reg=2c	246
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	fffffdb9	282		 ;nand(246,246)
           func3_mov_dw[edi]_dw[ebp]		    |  reg=00	282
           func31_ push_dw[ebp]_b[esi]		    |  reg=ff	ffffffbf
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	40	202			 ; nand( nand(246,246), nand(40,40) ) == and (246 , 40)
           func3_mov_dw[edi]_dw[ebp]		    |  reg=00	202
          
	   func5_shr_dw[ebp]_b[ebp+4]		    |  reg=ff	4	202			 ;将 and (246 , 40) 的结果右移动4位
           func3_mov_dw[edi]_dw[ebp]		    |  reg=00	202
           func40_add_dw[ebp]_[ebp+4]		    |  reg=ff	18fedc	202
           func3_mov_dw[edi]_dw[ebp]		    |  reg=00	202				 ;右移的结果与 18fed8 相加得到  18fedc
           
	   func7_push_dw[ebp]_dw[ss:mm]		    |  reg=ff	aac8e133			 ;取出 18fedc 中的值
           func3_mov_dw[edi]_dw[ebp]		    |  reg=28	aac8e133
           func3_mov_dw[edi]_dw[ebp]		    |  reg=1c	aac8de94
           func3_mov_dw[edi]_dw[ebp]		    |  reg=10	aac8e133
           func6_push_dw[ebp]_dw[edi]		    |  reg=28	aac8e133
           func12_push_dw[ebp]_ebp		    |  reg=ff	18fedc
           func7_push_dw[ebp]_dw[ss:mm]		    |  reg=ff	aac8e133
           func3_mov_dw[edi]_dw[ebp]		    |  reg=10	aac8e133
           func12_push_dw[ebp]_ebp		    |  reg=ff	18fedc
           func7_push_dw[ebp]_dw[ss:mm]		    |  reg=ff	aac8e133
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	55371ecc	206		 ;nand(aac8e133,aac8e133)
           func3_mov_dw[edi]_dw[ebp]		    |  reg=1c	206
           func11_push_dw[ebp]_dw[esi]		    |  reg=ff	557f7e2b
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	aa808110	282
           func3_mov_dw[edi]_dw[ebp]		    |  reg=28	282
           func11_push_dw[ebp]_dw[esi]		    |  reg=ff	aa8081d4
           func6_push_dw[ebp]_dw[edi]		    |  reg=10	aac8e133
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	55371e08	202
           func3_mov_dw[edi]_dw[ebp]		    |  reg=28	202
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	4860e7	206
           func3_mov_dw[edi]_dw[ebp]		    |  reg=28	206
           func3_mov_dw[edi]_dw[ebp]		    |  reg=00	4860e7				;xor(557f7e2b,aac8e133) == 4860e7

           func6_push_dw[ebp]_dw[edi]		    |  reg=34	7647153b

           func6_push_dw[ebp]_dw[edi]		    |  reg=0c	88888888
           func6_push_dw[ebp]_dw[edi]		    |  reg=24	eeeeeeee
           func6_push_dw[ebp]_dw[edi]		    |  reg=20	cccccccc
           func6_push_dw[ebp]_dw[edi]		    |  reg=04	bbbbbbbb
           func6_push_dw[ebp]_dw[edi]		    |  reg=18	dddddddd
           func6_push_dw[ebp]_dw[edi]		    |  reg=30	99999999
           func6_push_dw[ebp]_dw[edi]		    |  reg=38	aaaaaaaa
           func6_push_dw[ebp]_dw[edi]		    |  reg=2c	246
           func6_push_dw[ebp]_dw[edi]		    |  reg=0c	88888888			; 将寄存器压入栈

           func6_push_dw[ebp]_dw[edi]		    |  reg=1c	206
           
	   func6_push_dw[ebp]_dw[edi]		    |  reg=34	7647153b			;校验值		
           func11_push_dw[ebp]_dw[esi]		    |  reg=ff	89b8eac5
           func40_add_dw[ebp]_[ebp+4]		    |  reg=ff	0	257
           func3_mov_dw[edi]_dw[ebp]		    |  reg=08	257				;值保存在堆栈中

           func6_push_dw[ebp]_dw[edi]		    |  reg=3c	0				;VM入口的 push 0
           func6_push_dw[ebp]_dw[edi]		    |  reg=00	4860e7
           func24_jmp_dw[ebp]			    |  reg=ff					;跳转

----------------------------------------------------------------------------------------------------------------------------------------------
           func3_mov_dw[edi]_dw[ebp]		    |  reg=2c	0				;push 0
           func11_push_dw[ebp]_dw[esi]		    |  reg=ff	7647153b
           func40_add_dw[ebp]_[ebp+4]		    |  reg=ff	7647153b	202
           func3_mov_dw[edi]_dw[ebp]		    |  reg=00	202
           func3_mov_dw[edi]_dw[ebp]		    |  reg=38	7647153b			;校验

           func3_mov_dw[edi]_dw[ebp]		    |  reg=3c	206				; nand(aac8e133,aac8e133) 的 EFL存入
           func6_push_dw[ebp]_dw[edi]		    |  reg=3c	206
           func12_push_dw[ebp]_ebp		    |  reg=ff	18feb4
           func7_push_dw[ebp]_dw[ss:mm]		    |  reg=ff	206
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	fffffdf9	286		;nand(206,206)
           func3_mov_dw[edi]_dw[ebp]		    |  reg=34	286
           func11_push_dw[ebp]_dw[esi]		    |  reg=ff	557f7e2b
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	4	202
           func3_mov_dw[edi]_dw[ebp]		    |  reg=14	202
           func11_push_dw[ebp]_dw[esi]		    |  reg=ff	aa8081d4
           func6_push_dw[ebp]_dw[edi]		    |  reg=3c	206
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	557f7c29	202
           func3_mov_dw[edi]_dw[ebp]		    |  reg=24	202
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	aa8083d2	286
           func3_mov_dw[edi]_dw[ebp]		    |  reg=28	286
           func3_mov_dw[edi]_dw[ebp]		    |  reg=10	aa8083d2			

           func3_mov_dw[edi]_dw[ebp]		    |  reg=1c	88888888
           func3_mov_dw[edi]_dw[ebp]		    |  reg=24	246
           func3_mov_dw[edi]_dw[ebp]		    |  reg=04	aaaaaaaa
           func3_mov_dw[edi]_dw[ebp]		    |  reg=0c	99999999
           func3_mov_dw[edi]_dw[ebp]		    |  reg=14	dddddddd
           func3_mov_dw[edi]_dw[ebp]		    |  reg=00	bbbbbbbb
           func3_mov_dw[edi]_dw[ebp]		    |  reg=34	cccccccc
           func3_mov_dw[edi]_dw[ebp]		    |  reg=28	eeeeeeee
           func3_mov_dw[edi]_dw[ebp]		    |  reg=08	88888888			;保存寄存器

           func3_mov_dw[edi]_dw[ebp]		    |  reg=30	7647153b

           func3_mov_dw[edi]_dw[ebp]		    |  reg=08	206
           func6_push_dw[ebp]_dw[edi]		    |  reg=08	206
           func12_push_dw[ebp]_ebp		    |  reg=ff	18fee0
           func7_push_dw[ebp]_dw[ss:mm]		    |  reg=ff	206
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	fffffdf9	286
           func3_mov_dw[edi]_dw[ebp]		    |  reg=24	286
           func27_push_dw[ebp]_w[esi]		    |  reg=ff	8ff
           func8_nor_dw[ebp]_dw[ebp+4]		    |  reg=ff	200	206
           func3_mov_dw[edi]_dw[ebp]		    |  reg=24	206				;and(206,286)
           func15_pop_dw[eflag]_dw[ebp]		    |  reg=ff					;类似反调试

           func31_ push_dw[ebp]_b[esi]		    |  reg=ff	4
           func12_push_dw[ebp]_ebp		    |  reg=ff	18fee0
           func31_ push_dw[ebp]_b[esi]		    |  reg=ff	4
           func40_add_dw[ebp]_[ebp+4]		    |  reg=ff	18fee4	206
           func3_mov_dw[edi]_dw[ebp]		    |  reg=30	206
           func40_add_dw[ebp]_[ebp+4]		    |  reg=ff	18fee8	206
           func3_mov_dw[edi]_dw[ebp]		    |  reg=18	206
           func36_mov_dwEbp_dw[ebp]		    |  reg=ff					;平衡堆栈

           func11_push_dw[ebp]_dw[esi]		    |  reg=ff	12345678
           func3_mov_dw[edi]_dw[ebp]		    |  reg=20	12345678			;将一个常量压入堆

           func11_push_dw[ebp]_dw[esi]		    |  reg=ff	42708c				;出口跳转地址

           func6_push_dw[ebp]_dw[edi]		    |  reg=20	12345678			;真实寄存器赋值
           func6_push_dw[ebp]_dw[edi]		    |  reg=34	cccccccc
           func6_push_dw[ebp]_dw[edi]		    |  reg=1c	88888888
           func6_push_dw[ebp]_dw[edi]		    |  reg=08	206
           func6_push_dw[ebp]_dw[edi]		    |  reg=28	eeeeeeee
           func6_push_dw[ebp]_dw[edi]		    |  reg=00	bbbbbbbb
           func6_push_dw[ebp]_dw[edi]		    |  reg=10	aa8083d2
           func6_push_dw[ebp]_dw[edi]		    |  reg=14	dddddddd
           func6_push_dw[ebp]_dw[edi]		    |  reg=0c	99999999
           func6_push_dw[ebp]_dw[edi]		    |  reg=10	aa8083d2
           func6_push_dw[ebp]_dw[edi]		    |  reg=38	7647153b
	   VM_RETN


 

----------------------------------------------------------------------------------------------------

VM后寄存器和堆栈值

EAX 12345678
ECX CCCCCCCC
EDX DDDDDDDD
EBX BBBBBBBB
ESP 0018FEE8
EBP EEEEEEEE
ESI 99999999
EDI 88888888
EIP 0042708C TestVmp_.0042708C
C 0  ES 002B 32位 0(FFFFFFFF)
P 1  CS 0023 32位 0(FFFFFFFF)
A 0  SS 002B 32位 0(FFFFFFFF)
Z 0  DS 002B 32位 0(FFFFFFFF)
S 0  FS 0053 32位 7EFDD000(FFF)
T 0  GS 002B 32位 0(FFFFFFFF)
D 0
O 0  LastErr ERROR_SUCCESS (00000000)
EFL 00000206 (NO,NB,NE,A,NS,PE,GE,G)
ST0 empty 0.0
ST1 empty 0.0
ST2 empty 0.0
ST3 empty 0.0
ST4 empty 0.0
ST5 empty 0.0
ST6 empty 0.0
ST7 empty 0.0
               3 2 1 0      E S P U O Z D I
FST 0000  Cond 0 0 0 0  Err 0 0 0 0 0 0 0 0  (GT)
FCW 027F  Prec NEAR,53  掩码    1 1 1 1 1 1


0018FEE8   00000000
0018FEEC   00000000
0018FEF0   7EFDE000
0018FEF4   F3B5AB2F
0018FEF8   00000000
0018FEFC   00000000
0018FF00   7EFDE000
0018FF04   00425276  TestVmp_.00425276
0018FF08   9938AD55
0018FF0C   0018FF1C
0018FF10   0018FF70
0018FF14   0042546A  TestVmp_.0042546A
0018FF18   F3EA9E37
0018FF1C   FFFFFFFE
0018FF20   0018FF2C

 

posted @ 2015-06-28 12:41  manhook  阅读(605)  评论(0编辑  收藏  举报