×î½üÌ«ÍÇ·ÏÁË£¬Ð´µã¶«Î÷·¢Ð¹Ò»Ï¡£
¾¿¾¹ËüÊ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