- 博客(0)
- 资源 (1)
- 收藏
- 关注
vmp2.06全过程分析
vmp2.06全过程分析:
1. VMP从TLS回调函数开始,在回调函数检查OEP处的第一个字节是否为0xCC,如果是的话表示被调试
//
// 下面比较内存数[0104409A]的一个字节是否为0..
//
010375AC C9 pop r14
010375AB 58 C0C49CBB push BB9CC4C0
010375A6 40 add dword
010375A5 F1 pop r4
010375A4 E1 pop r8
010375A3 F5 pop r3
010375A2 E5 pop r7
010375A1 ED pop r5
010375A0 FD pop r1
0103759F D1 pop r12
0103759E F9 pop r2
0103759D 01 pop r0
0103759C C5 pop r15
0103759B D5 pop r11
0103759A DD pop r9
01037599 F1 pop r4 ; 到这里的伪指令是保存原寄存器环境到VM寄存器 (对应进入VM时候的入栈寄存器)
01037598 0C 00 push word 00 ; cmp byte ptr [0104409A], 00
01037596 C8 push r14 ; jz
01037595 94 9A400401 push 0104409A
01037590 51 add dword
0103758F DD pop r9
0103758E 06 read word mem byte
0103758D 21 push esp
0103758C 1E read word mem byte
0103758B 4B nand byte
0103758A CD pop r13
01037589 57 add byte
01037588 DD pop r9
01037587 21 push esp
01037586 92 read word mem byte
01037585 31 nand byte
01037584 D1 pop r12
01037583 95 10 pop word (byte)r4
01037581 DC push r9 ; r9 --> 减法的EFLAGS部分1
01037580 DC push r9
0103757F 5D nand dword
0103757E E9 pop r6
0103757D 20 EAF7 push dword F7EA
0103757A 77 nand dword
01037579 F1 pop r4
01037578 D0 push r12 ; r12 --> 减法的EFLAGS部分2
01037577 D0 push r12
01037576 97 nand dword
01037575 CD pop r13
01037574 88 1508 push dword 0815
01037571 5D nand dword
01037570 F9 pop r2
0103756F 40 add dword
0103756E D9 pop r10 ; r4 = nand( nand(r9,r9), nand(0815,0815) ) + nand( nand(r12,r12), nand(F7EA,F7EA))
0103756D F1 pop r4 ; r4存储前面比较需要的减法操作得到的EFLAGS..
0103756C 58 EC217180 push 807121EC ; VM堆栈中存储两个加密后的跳转和不跳转的地址
01037567 1B 70817680 push 80768170
01037562 21 push esp
01037561 1C 04 push word 04
0103755F F0 push r4 ; r4 and 40 = nand( nand(r4,r4), nand(40,40) ) ==> ZF标志位
0103755E 28 push esp
0103755D 4D read dword mem dword
0103755C 97 nand dword
0103755B DD pop r9
0103755A 50 BF push dword BF ; FFFFFFBF = nand(40,40)
01037558 5D nand dword
01037557 F9 pop r2
01037556 91 shr dword ; ZF标志位右移4位, 如果ZF等于1的话,40 shr 4 = 4 否则等于0
01037555 CD pop r13
01037554 51 add dword ; 这里ZF=1的话,就是加4, 否则加0
01037553 DD pop r9
01037552 71 read dword mem dword
01037551 DD pop r9 ; 分支地址存储在r9
01037550 E9 pop r6 ; 退掉前面入栈的两个分支地址 807121EC / 80768170
0103754F E9 pop r6
0103754E DC push r9 ; xor r9, 8172ADCB ==> 一次xor解码跳转地址
0103754D BA push esp
0103754C EA read dword mem dword
0103754B D9 pop r10
0103754A D8 push r10
01037549 5D nand dword
01037548 E9 pop r6
01037547 94 34528D7E push 7E8D5234
01037542 5D nand dword
01037541 DD pop r9
01037540 58 CBAD7281 push 8172ADCB
0103753B D8 push r10
0103753A 97 nand dword
01037539 E9 pop r6
01037538 5D nand dword
01037537 F9 pop r2
01037536 CD pop r13 ; r13存储跳转的目的地址..
01037535 E0 push r8 ; 入栈之前的原寄存器环境
01037534 D4 push r11
01037533 E4 push r7
01037532 D8 push r10
01037531 00 push r0
01037530 C4 push r15
0103752F EC push r5
0103752E F4 push r3
0103752D D4 push r11
0103752C FC push r1
0103752B F0 push r4
0103752A 94 403B6344 push 44633B40
01037525 E0 push r8
01037524 51 add dword
01037523 E9 pop r6
01037522 C8 push r14
01037521 CC push r13
01037520 29 jmp
//
// 下面的伪指令是否读取OEP地址,然后读取OEP处的一个字节。。和0xCC进行比较.. (比较是减法实现.. JNZ xxx)
//
01038C26 F9 pop r2
01038C25 1B C0C49CBB push BB9CC4C0
01038C20 51 add dword
01038C1F ED pop r5
01038C1E E5 pop r7
01038C1D DD pop r9
01038C1C E9 pop r6
01038C1B D5 pop r11
01038C1A 01 pop r0
01038C19 FD pop r1
01038C18 C9 pop r14
01038C17 C5 pop r15
01038C16 D1 pop r12
01038C15 D0 push r12 ; xor r12, 8172ADCB r12 = 807121EC
01038C14 07 push esp
01038C13 EA read dword mem dword
01038C12 5D nand dword
01038C11 E1 pop r8
01038C10 1B 34528D7E push 7E8D5234
01038C0B 97 nand dword
01038C0A F1 pop r4
01038C09 D0 push r12
01038C08 1B CBAD7281 push 8172ADCB
01038C03 5D nand dword
01038C02 CD pop r13
01038C01 5D nand dword
01038C00 ED pop r5
01038BFF F1 pop r4 ; r4 = 01038C27
01038BFE CD pop r13
01038BFD E1 pop r8
01038BFC ED pop r5
01038BFB DC push r9
01038BFA E8 push r6
01038BF9 C8 push r14
01038BF8 00 push r0
01038BF7 FC push r1
01038BF6 C4 push r15
01038BF5 D4 push r11
01038BF4 58 9A400401 push 0104409A
01038BEF F8 push r2
01038BEE 40 add dword
01038BED D9 pop r10
01038BEC D9 pop r10
01038BEB F8 push r2 ; r2 = 0
01038BEA 1B 00000001 push 01000000
01038BE5 40 add dword
01038BE4 F5 pop r3
01038BE3 E1 pop r8
01038BE2 E0 push r8
01038BE1 0D 3C push dword 3C
01038BDF 40 add dword
01038BDE F5 pop r3 ; [SP] = 0100003C
01038BDD FB read dword mem dword ; 读取 l_newOffset = 0xE0
01038BDC F5 pop r3
01038BDB E0 push r8
01038BDA F4 push r3
01038BD9 40 add dword
01038BD8 E9 pop r6
01038BD7 C9 pop r14
01038BD6 C8 push r14
01038BD5 0D 28 push dword 28 ; +28 ==> OEP的RVA
01038BD3 40 add dword
01038BD2 D5 pop r11
01038BD1 FB read dword mem dword
01038BD0 ED pop r5
01038BCF EC push r5
01038BCE E0 push r8
01038BCD 40 add dword
01038BCC D5 pop r11
01038BCB C9 pop r14 ; r14 = [SP] = 0105B5C0 (EP地址)
01038BCA 1C CC push word CC
01038BC8 C8 push r14
01038BC7 1F read word mem byte
01038BC6 21 push esp
01038BC5 1E read word mem byte
01038BC4 6E nand byte
01038BC3 F5 pop r3
01038BC2 B8 add byte
01038BC1 E9 pop r6
01038BC0 21 push esp
01038BBF F2 read word mem byte
01038BBE 31 nand byte
01038BBD ED pop r5
01038BBC BF 24 pop word (byte)r9 ; 执行减法 sub byte ptr [0105B5C0], CC
01038BBA E8 push r6 ; 合并减法操作的ELFAGS
01038BB9 E8 push r6
01038BB8 97 nand dword
01038BB7 DD pop r9
01038BB6 20 EAF7 push dword F7EA
01038BB3 5D nand dword
01038BB2 F1 pop r4
01038BB1 EC push r5
01038BB0 EC push r5
01038BAF 77 nand dword
01038BAE F5 pop r3
01038BAD 20 1508 push dword 0815
01038BAA 5D nand dword
01038BA9 D5 pop r11
01038BA8 40 add dword
01038BA7 F5 pop r3
01038BA6 F1 pop r4 ; r4 == 合并后的EFLAGS
01038BA5 94 6A67A116 push 16A1676A ; 入栈两个跳转地址
01038BA0 1B 8F67A116 push 16A1678F
01038B9B 07 push esp ; 理论上这四句是连在一起的..
01038B9A 0C 04 push word 04
01038B98 F0 push r4
01038B97 50 BF push dword BF ; and( not(r4), 40) = nand(r4, nand(40,40)) ==> 注意这里没有nand(r4,r4) 表示 JNE..
01038B95 5D nand dword
01038B94 D5 pop r11
01038B93 91 shr dword ; JNE成立,所以and(not(r4),40)的结果等于0x40.. 右移4位 = 0x4
01038B92 D5 pop r11
01038B91 40 add dword ; 加法.. 指向跳转加密后的地址数值
01038B90 E9 pop r6
01038B8F EA read dword mem dword ;
01038B8E F5 pop r3 ; r3 => 加密后的跳转地址
01038B8D DD pop r9
01038B8C DD pop r9
01038B8B F4 push r3
01038B8A E9 pop r6
01038B89 E8 push r6 ; r6 = r3 => 加密后的跳转地址
01038B88 07 push esp
01038B87 4D read dword mem dword
01038B86 5D nand dword
01038B85 D1 pop r12
01038B84 1B D6075DE8 push E85D07D6
01038B7F 5D nand dword
01038B7E D1 pop r12
01038B7D E8 push r6
01038B7C 1B 29F8A217 push 17A2F829
01038B77 5D nand dword
01038B76 DD pop r9
01038B75 77 nand dword
01038B74 D5 pop r11 ; xor r6, 17A2F829
01038B73 D5 pop r11 ; r11 ==> 解密后的跳转地址
01038B72 F8 push r2
01038B71 C4 push r15
01038B70 D8 push r10
01038B6F 00 push r0
01038B6E C8 push r14
01038B6D F0 push r4
01038B6C FC push r1
01038B6B CC push r13
01038B6A F0 push r4
01038B69 E0 push r8
01038B68 C4 push r15
01038B67 E4 push r7
01038B66 58 403B6344 push 44633B40
01038B61 40 add dword
01038B60 D1 pop r12
01038B5F F8 push r2
01038B5E D4 push r11 ;
01038B5D 29 jmp
//
// 下面是TLS回调函数返回到系统模块..
//
01039F42 E9 pop r6
01039F41 1B C0C49CBB push BB9CC4C0
01039F3C 51 add dword
01039F3B D5 pop r11
01039F3A D9 pop r10
01039F39 F5 pop r3
01039F38 E1 pop r8
01039F37 D1 pop r12
01039F36 ED pop r5
01039F35 D5 pop r11
01039F34 07 push esp
01039F33 4D read dword mem dword
01039F32 C9 pop r14
01039F31 07 push esp
01039F30 4D read dword mem dword
01039F2F 5D nand dword
01039F2E FD pop r1
01039F2D 1B D6075DE8 push E85D07D6
01039F28 5D nand dword
01039F27 DD pop r9
01039F26 1B 29F8A217 push 17A2F829
01039F21 C8 push r14
01039F20 5D nand dword
01039F1F FD pop r1
01039F1E 5D nand dword
01039F1D CD pop r13
01039F1C DD pop r9
01039F1B CD pop r13
01039F1A F1 pop r4
01039F19 F9 pop r2
01039F18 01 pop r0
01039F17 FD pop r1
01039F16 E5 pop r7
01039F15 E1 pop r8
01039F14 FD pop r1
01039F13 F5 pop r3
01039F12 D5 pop r11
01039F11 C5 pop r15
01039F10 F1 pop r4
01039F0F F0 push r4
01039F0E 21 push esp
01039F0D 4D read dword mem dword
01039F0C 5D nand dword
01039F0B D1 pop r12
01039F0A 20 FF08 push dword 08FF
01039F07 5D nand dword
01039F06 F9 pop r2 ; and r4, FFFFF700
01039F05 1D popfd ; 设置到eflags =====> 最后退出EFLAGS还是被覆盖,所以这里不知道干啥用?
01039F04 07 push esp ; 下面写入返回地址, 这里返回到系统模块 TLS返回
01039F03 71 read dword mem dword
01039F02 50 14 push dword 14
01039F00 07 push esp
01039EFF 51 add dword
01039EFE F9 pop r2
01039EFD 8E write dword mem
01039EFC D1 pop r12
01039EFB D1 pop r12
01039EFA 01 pop r0
01039EF9 E4 push r7
01039EF8 D4 push r11
01039EF7 E0 push r8
01039EF6 DC push r9
01039EF5 F0 push r4
01039EF4 C4 push r15
01039EF3 FC push r1
01039EF2 EC push r5
01039EF1 F4 push r3
01039EF0 C4 push r15
01039EEF E8 push r6
01039EEE 12 exitVM
2012-03-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人