• 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

    0
    244
    391KB
    2012-03-04
    33
关注 私信
上传资源赚积分or赚钱