×î½üÌ«ÍÇ·ÏÁË£¬Ð´µã¶«Î÷·¢Ð¹Ò»Ï¡£

¾¿¾¹ËüÊDz»ÊÇÒ»¸ö¿ÇÎÒҲ˵²»Çå³þ£¬ÎÒ²»ÊǺܻáÓã¬Ëæ±ã¼ÓÁ˸ö notepad ¿´¿´¡£

P.S. ÎÒ²»ÊǺܻáÆðÃû×Ö£¬Ò²Ã»Óмì²éÄÇЩָÁîÊDz»ÊÇ׼ȷ£¬²»¹ýÕâЩ¿ÉÄܻᶯ̬¸Ä±ä£¬¿´¿´¾ÍÐÐÁË¡£ :D



vmp_pcode_engine:
    pushf      ; ÕâЩ´úÂë¿´ÆðÀ´ÊDZ£´æ·ûºÅºÍ¼Ä´æÆ÷µÄ,
          ; µ«ÈôÍùºó¸ú¼¸²½±ã»á·¢ÏÖÕâÀï˳Ðò°Ñ
          ;
          ; EFLAG
          ; EAX
          ; ECX
          ; EDX
          ; EBX
          ; ESP
          ; EBP
          ; ESI
          ; EDI
          ;
          ; ÈëÕ»,  ËæºóÓÃαָÁ³ö¹¹Ôì×ÔÉíCONTEXT»·¾³
          ;
    pusha
    push  0    ; ÔÙѹһ¸ö 0 ½ø¶ÑÕ»

    mov  esi, [esp+28h]  ; -> µ±Ç°´úÂë¿éαָÁî±í
          ;
          ; 00408B54  D6 82 AC 61  79 29 4B 03 15 C8 E4 9A  B0 61 81 34  Ö‚¬ay)KÈäš°a?
          ; 00408B64  50 FF 23 D0  AC 04 73 CF BF FF 59 31  0B 1E D0 0C  Pÿ#ЬsÏ¿ÿY1
?
          ; 00408B74  69 D8 AF 42  1B AA 87 0E E9 74 54 D5  B2 39 1B 98  iدBª‡étTÕ²9
          ;
    mov  edi, offset vmp_banner_and_vcontext ; "[ VMProtect v 1.01 (C) PolyTech |  http"...
    cld
    mov  ebx, esi  ; Ö¸ÏòPCODE

next_opcode:

    lodsb      ; È¡Ò»¸öαָÁî
    add  al, bl    ; ´¿´âÊǽâÂë, ÓÃÁË»áÂýһЩ
    add  bl, al
    movzx  eax, al
    jmp  ds:pcode_parse_table[eax*4] ; Ö´ÐбíÖжÔÓ¦Ë÷ÒýµÄÖ¸Áî, Óë VB ÊÖ·¨Ò»Ñù
          ;
          ; ÎÒ¸øһЩָÁîÆðÁËÃû×ÖºóÕâ¶Î±íµÄÒâ˼ÊÇ
          ;
          ; v_odi    00     ; ÓÃÊý¾ÝÇøµÄCONTEXT±£´æµ±Ç°»·¾³
          ; v_odi    09
          ; v_odi    04
          ; v_odi    0C
          ; v_odi    07
          ; v_odi    0A
          ; v_odi    05
          ; v_odi    07
          ; v_odi    03
          ; v_odi    01
          ; v_oax
          ; v_pd    97      ; Ò»¸ö¼ÓÃܺóµÄµØÖ·
          ; v_pd    00      ; ÃÜÔ¿
          ; v_na2        ;\°´ÕÕna2Ö¸Áî½âÂëµØÖ·²¢ÈëÕ»
          ; v_pda        ;/
          ; v_pdi    01      ; °Ñ±£´æµÄCONTEXTÓ³Éä»ØCPU
          ; v_pdi    03
          ; v_pdi    07
          ; ....
          ; v_pdi    00
          ; v_exit      ; ·µ»Ø
          ;



v_pdi:          ; DATA XREF: .vmp0:0040895Do
    lodsb      ; Push Dword in  data area by Index
    add  al, bl    ; ²Ù×÷ÊýÒ²Òª½âÂë²ÅÐÐ
    add  bl, al
    push  dword ptr [edi+eax*4]
    jmp  short next_opcode ; È¡Ò»¸öαָÁî


v_pb:          ; DATA XREF: .vmp0:00408759o
    lodsd      ; Push Byte (as  DWORD, Lo used only)
    add  al, bl
    add  bl, al
    push  eax
    jmp  short next_opcode ; È¡Ò»¸öαָÁî


loc_408034:        ; DATA XREF: .vmp0:004088BDo
          ; .vmp0:00408769o ...
    push  sp
    jmp  short next_opcode ; È¡Ò»¸öαָÁî


loc_408038:        ; DATA XREF: .vmp0:004089FDo
    pop  eax
    push  dword ptr gs:[eax]
    jmp  short next_opcode ; È¡Ò»¸öαָÁî


loc_40803E:        ; DATA XREF: .vmp0:00408995o
    pop  eax
    push  dword ptr fs:[eax]
    jmp  short next_opcode ; È¡Ò»¸öαָÁî


v_pda:          ; DATA XREF: .vmp0:00408755o
    pop  eax    ; Pop address and Push Dword in  address
    push  dword ptr [eax]
    jmp  short next_opcode ; È¡Ò»¸öαָÁî



    ; Ê¡ÂÔһЩ

v_na2:          ; DATA XREF: .vmp0:004089D1o
          ; .vmp0:00408A75o
    pop  eax    ; not &  and then save DWORD
    not  eax
    not  dword ptr [esp]
    and  [esp], eax
    jmp  next_opcode  ; È¡Ò»¸öαָÁî


loc_4082C0:        ; DATA XREF: .vmp0:00408791o
          ; .vmp0:004089C5o
    pop  eax
    not  eax
    not  dword ptr [esp]
    and  [esp], eax
    pushfw
    jmp  next_opcode  ; È¡Ò»¸öαָÁî

    ; Ê¡ÂÔһЩ

    ; Ã¿¸ö DWORD ¶ÔÓ¦Ò»ÌõÖ¸Áî½âÎöÆ÷

pcode_parse_table dd offset unk_40829C  ; DATA XREF: execute_vmp_engine-B6Fr
    dd offset unk_40864D
    dd offset unk_4085E5
    dd offset unk_408699
    dd offset unk_40838D
    dd offset unk_408364
    dd offset unk_4082D0
    dd offset unk_408373
    dd offset unk_4086F4
    dd offset unk_4085BD
    dd offset unk_40853A
    dd offset loc_408144
    dd offset unk_408465
    dd offset unk_408458
    dd offset unk_408437
    dd offset unk_408531
    dd offset unk_408504
    dd offset unk_408269
    dd offset unk_408347
    dd offset v_pda    ; Pop address and Push Dword in  address
    dd offset v_pb    ; Push Byte (as  DWORD, Lo used only)
    dd offset unk_408261
    dd offset unk_4085F5
    dd offset loc_408187
    dd offset loc_408034+1
    dd offset loc_408066
    dd offset loc_40807A
    dd offset unk_40828F
    dd offset unk_4081EB
    dd offset unk_40860D
    dd offset loc_4080A2
    dd offset unk_408594
    dd offset unk_408692
    dd offset loc_408066
    dd offset loc_4082C0
    dd offset loc_4080CB
    dd offset unk_4086A7
    dd offset unk_40855E
    dd offset unk_4084E0
    dd offset loc_408088
    dd offset unk_40840B
    dd offset loc_408098
    dd offset v_odi    ; pOp dword on stack to  Dword in data area by Index
    dd offset unk_4082EE
    dd offset unk_4086D1
    dd offset unk_408528
    dd offset unk_4081A2
    dd offset unk_4084AA
    dd offset loc_408034+1
    dd offset unk_408498
    dd offset unk_408199
    dd offset unk_4086D8
    dd offset unk_408692
    dd offset loc_40812E
    dd offset unk_40850D
    dd offset loc_4080AC
    dd offset unk_408570
    dd offset unk_4084BC
    dd offset unk_40848F
    dd offset loc_408070
    dd offset loc_40817F
    dd offset loc_40805B
    dd offset unk_4083A8
    dd offset unk_4086DF
    dd offset unk_4083D4
    dd offset unk_408486
    dd offset unk_4082DE
    dd offset unk_408253
    dd offset loc_40816D
    dd offset unk_40865D
    dd offset unk_40824B
    dd offset unk_40853A
    dd offset unk_4084D7
    dd offset unk_40858B
    dd offset unk_40866D
    dd offset unk_40867D
    dd offset unk_4086FB
    dd offset unk_4084F2
    dd offset unk_408477
    dd offset unk_408190
    dd offset unk_408594
    dd offset loc_408270
    dd offset loc_4080E5
    dd offset loc_408166+1
    dd offset unk_40863D
    dd offset loc_4080FB
    dd offset unk_4084B3
    dd offset unk_4086E6
    dd offset loc_4080F0
    dd offset unk_40841D
    dd offset unk_408449
    dd offset unk_408449
    dd offset unk_4084A1
    dd offset unk_4083B8
    dd offset loc_4080BB
    dd offset unk_408240
    dd offset unk_408253
    dd offset unk_408555
    dd offset loc_40805B
    dd offset unk_4085C5
    dd offset unk_4084D7
    dd offset unk_4085B5
    dd offset unk_4082A6
    dd offset unk_4086D1
    dd offset unk_408364
    dd offset unk_4083FF
    dd offset unk_408645
    dd offset unk_4085ED
    dd offset unk_408253
    dd offset loc_408034
    dd offset loc_408176
    dd offset loc_4080CB
    dd offset unk_4084BC
    dd offset loc_4080F0
    dd offset loc_4080CB
    dd offset unk_4085A6
    dd offset unk_408531
    dd offset unk_4086CA
    dd offset loc_408105
    dd offset v_oax    ; pop ax
    dd offset aXf_p    ; "Xf.?
    dd offset unk_408684
    dd offset v_oax    ; pop ax
    dd offset loc_40814B
    dd offset unk_4082EE
    dd offset unk_4085FD
    dd offset loc_4080F0
    dd offset unk_4084C5
    dd offset loc_40813C
    dd offset unk_40851F
    dd offset unk_4086A0
    dd offset unk_40862D
    dd offset unk_4083F2
    dd offset unk_40859D
    dd offset unk_408240
    dd offset aXfP    ; "Xf&?
    dd offset unk_408567
    dd offset unk_40854C
    dd offset unk_408528
    dd offset unk_408543
    dd offset unk_40860D
    dd offset loc_4086C3
    dd offset unk_40820A
    dd offset loc_4080AC
    dd offset unk_4085CD
    dd offset unk_4081A2
    dd offset unk_4086BC
    dd offset loc_408135
    dd offset unk_4082FF
    dd offset v_pdi    ; Push Dword in  data area by Index
    dd offset unk_408357
    dd offset loc_408166
    dd offset unk_40839A
    dd offset unk_408605
    dd offset unk_4085D5
    dd offset unk_408528
    dd offset unk_4084E9
    dd offset unk_408199
    dd offset unk_40842A
    dd offset unk_408702
    dd offset unk_4085AC
    dd offset unk_4085DD
    dd offset unk_408582
    dd offset loc_40803E
    dd offset unk_408665
    dd offset unk_4085BD
    dd offset unk_408655
    dd offset loc_408055
    dd offset unk_4084FB
    dd offset aXfep    ; "Xfe?
    dd offset loc_408270
    dd offset unk_4083F2
    dd offset unk_408382
    dd offset loc_40804F
    dd offset loc_4080D7
    dd offset loc_4082C0
    dd offset unk_408321
    dd offset unk_408516
    dd offset v_na2    ; not &  and then save DWORD
    dd offset loc_40808E
    dd offset unk_4081FA
    dd offset unk_408235
    dd offset unk_4081FA
    dd offset unk_408498
    dd offset unk_408339
    dd offset unk_408675
    dd offset loc_4080D7
    dd offset loc_40808E
    dd offset loc_408135
    dd offset loc_408038
    dd offset unk_408220
    dd offset unk_4086B5
    dd offset loc_408126
    dd offset aXf6p    ; "Xf6?
    dd offset unk_408615
    dd offset loc_40805B
    dd offset unk_40825A
    dd offset unk_40820A
    dd offset loc_408081
    dd offset unk_408635
    dd offset unk_4083E0
    dd offset unk_4085A6
    dd offset unk_408579
    dd offset unk_408312
    dd offset loc_408049
    dd offset unk_4084CE
    dd offset unk_408284
    dd offset loc_408066
    dd offset unk_408625
    dd offset unk_4086A0
    dd offset loc_408110
    dd offset unk_4086B5
    dd offset unk_408655
    dd offset unk_40855E
    dd offset loc_4080F0
    dd offset unk_40862D
    dd offset unk_408570
    dd offset unk_40828F
    dd offset aXfdp    ; "Xfd?
    dd offset v_na2    ; not &  and then save DWORD
    dd offset loc_4080D7
    dd offset unk_408215
    dd offset v_oax+1  ; pop ax
    dd offset unk_408625
    dd offset unk_408699
    dd offset unk_40861D
    dd offset loc_408270
    dd offset loc_40812E
    dd offset unk_4086CA
    dd offset unk_408486
    dd offset unk_40832C
    dd offset unk_4085E5
    dd offset unk_40867D
    dd offset unk_40868B
    dd offset unk_4086DF
    dd offset unk_4081C4
    dd offset unk_408582
    dd offset unk_40824B
    dd offset v_exit
    dd offset unk_408357
    dd offset unk_4083C5
    dd offset unk_40822A
    dd offset unk_4082FF
    dd offset unk_408B09
    dd offset unk_4086AE
    dd offset unk_40853A
    dd offset unk_4084E0
    dd offset unk_4086BC
    dd offset loc_4080A2
    dd offset loc_408135
    dd offset unk_4085BD
    dd offset unk_408279
    dd offset loc_40811B
    dd offset unk_4086ED
    dd offset unk_408635
    dd offset loc_40817F
unk_408B09  db  58h  ; X    ; DATA XREF: .vmp0:00408AD5o
    db  61h  ; a
    db  9Dh  ; ?
    db 0CBh  ; ?

v_exit:          ; DATA XREF: .vmp0:00408AC1o
    pop  eax
    popa
    popf
    retn

    db  8Dh  ; ?
    db  40h  ; @
    db    0

    ; ÕâÀï¾ÍÊÇÊý¾ÝÇø

vmp_banner_and_vcontext  db '[ VMProtect v 1.01 (C) PolyTech |  http://www.polytech.ural.'
          ; DATA XREF: execute_vmp_engine-B7Fo
    db 'ru ]Ö‚¬ay)K'
    db    3
    db  15h
    db 0C8h  ; ?
    db 0E4h  ; ?
    db  9Ah  ; ?
    db 0B0h  ; ?
    db  61h  ; a
    db  81h  ; ?
    db  34h  ; 4
    db  50h  ; P
    db 0FFh
    db  23h  ; #
    db 0D0h  ; ?
    db 0ACh  ; ?
    db    4
    db  73h  ; s
    db 0CFh  ; ?
    db 0BFh  ; ?
    db 0FFh
    db  59h  ; Y
    db  31h  ; 1
    db  0Bh
    db  1Eh
    db 0D0h  ; ?
    db  0Ch
    db  69h  ; i
    db 0D8h  ; ?
    db 0AFh  ; ?
    db  42h  ; B
    db  1Bh
    db 0AAh  ; ?
    db  87h  ; ?
    db  0Eh
    db 0E9h  ; ?
    db  74h  ; t
    db  54h  ; T
    db 0D5h  ; ?
    db 0B2h  ; ?
    db  39h  ; 9
    db  1Bh
    db  98h  ; ?
    db  72h  ; r
    db 0FFh
    db 0DEh  ; ?
    db  61h  ; a
    db  37h  ; 7
    db  25h  ; %

; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛ?S U B  R O U T  I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ?


execute_vmp_engine proc  near    ; CODE XREF: vmp_stolen_code_entryj

; FUNCTION CHUNK AT 00408000 SIZE 00000022 BYTES

    push  (offset  vmp_banner_and_vcontext+40h)
    jmp  vmp_pcode_engine

execute_vmp_engine endp