原創|其它|編輯:郝浩|2012-11-07 17:30:10.000|閱讀 1182 次
概述:虛擬機加密,是指像VMP這樣的保護程序,它會把源程序的X86指令變成自定義的偽指令,等到執行的時候,VMP內置在保護程序中的VM就會啟動,讀取偽指令,然后解析執行。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
代碼保護利器VMProtect在線訂購315特惠,個人授權專享折扣立即購買>>
虛擬機加密,是指像VMP這樣的保護程序,它會把源程序的X86指令變成自定義的偽指令,等到執行的時候,VMP內置在保護程序中的VM就會啟動,讀取偽指令,然后解析執行。VMP是一個堆棧虛擬機,它的一切操作都是基于堆棧傳遞的。在VMP中,每一個偽指令就是一個handler,VM中有一個核心的Dispatch部分,它通過讀取程序的bytecode,然后在DispatchiTable里面定位到不同的handler中執行。絕大多數情況下,在一個handler中執行完成后,程序將回到Dispatch部分,然后到next handler中執行。
下面就將VM所需的偽指令一一羅列,為使偽指令表達清晰,首先介紹以下偽指令的命名方式:移動到EBPSTACK的數據使用PUSH指令,移動到EDISTACK的數據使用MOV指令。在VM中,對數據的操作包括byte和dword,而存儲的方式是word和dword,當遇到byte和word交織在一起的時候,可以就把數據作為word操作來看。
以:VM_PUSHw_MEMORYb為例說明命名規則:偽指令的命名統一使用VM_開頭;并接上直觀的助記符PUSH;EBPSTACK是移動的目的地;MEMORY是移動的來源地;w代表word、b代表byte、dw代表dword;這條指令的表示:這是一條移動指令,把1個byte的數據從內存塊移動到EBPSTACK,存儲時是按照word來存儲。在VMP的偽指令中包含有大量的花指令和junk code。
0043DC19 |. F6D8 NEG AL ; * 0043DC26 |. C0C8 07 ROR AL,7 ; * 0043DC34 |. 2C 20 SUB AL,20 ; * 0043DC41 |. 24 3C AND AL,3C ; * 0043E080 |$ 8B55 00 MOV EDX,DWORD PTR SS:[EBP] ; * 0043E086 |. 83C5 04 ADD EBP,4 ; * 0043D3D7 /> /891438 MOV DWORD PTR DS:[EDI+EAX],EDX
功能:把EBPSTACK棧頂1個dword的數據存儲到EDISTACK
0043E7EC 0FB646 FF MOVZX EAX,BYTE PTR DS:[ESI-1] ; * 0043E7F6 28D8 SUB AL,BL ; * 0043E7FE C0C8 05 ROR AL,5 ; * 0043E80C F6D8 NEG AL ; * 0043E816 34 0E XOR AL,0E ; * 0043E822 28C3 SUB BL,AL ; * 0043E82E 66:8B55 00 MOV DX,WORD PTR SS:[EBP] ; * 0043E835 83C5 02 ADD EBP,2 ; * 0043F03F 4E DEC ESI ; * 0043F045 66:891438 MOV WORD PTR DS:[EDI+EAX],DX ; *
功能:把EBPSTACK棧頂1個word的數據存儲到EDISTACK
0043D377 |. 8A46 FF MOV AL,BYTE PTR DS:[ESI-1] ; * 0043F148 /> \30D8 XOR AL,BL ; * 0043D460 |. FEC0 INC AL ; |* 0043D469 |. C0C8 07 ROR AL,7 ; |* 0043D473 |. FEC0 INC AL ; |* 0043D215 |. 30C3 XOR BL,AL ; * 0043EA9C |. 4E DEC ESI ; * 0043EAA0 |. 66:8B55 00 MOV DX,WORD PTR SS:[EBP] ; * 0043EAAC |. 83C5 02 ADD EBP,2 ; * 0043DBDA /> /881438 MOV BYTE PTR DS:[EDI+EAX],DL ; *
把EBPSTACK棧頂1個word的數據按照byte的方式存儲到EDISTACK
0043D21F 66:8B46 FE MOV AX,WORD PTR DS:[ESI-2] ; * 0043D22D 86E0 XCHG AL,AH ; * 0043E01A 66:29D8 SUB AX,BX ; * 0043E022 66:05 71F2 ADD AX,0F271 ; * 0043E036 66:F7D8 NEG AX ; * 0043E03D 66:35 A61C XOR AX,1CA6 ; * 0043E054 66:29C3 SUB BX,AX ; * 0043E054 66:29C3 SUB BX,AX ; * 0043E976 8D76 FE LEA ESI,[ESI-2] ; * 0043D094 /66:8945 00 MOV WORD PTR SS:[EBP],AX
功能:從ESI數據中取得1個word的立即數壓入EBPSTACK
0043E845 . 8B46 FC MOV EAX,DWORD PTR DS:[ESI-4] ; * 0043E84D . 0FC8 BSWAP EAX ; * 0043E852 . 01D8 ADD EAX,EBX ; * 0043E857 . C1C8 04 ROR EAX,4 ; * 0043D952 . 8D76 FC LEA ESI,[ESI-4] ; * 0043D956 . 2D E131FF38 SUB EAX,38FF31E1 ; * 0043D967 . C1C0 0A ROL EAX,0A ; |* 0043D96C . 01C3 ADD EBX,EAX ; |* 0043D970 . 83ED 04 SUB EBP,4 ; |* 0043D710 |$ 8945 00 MOV DWORD PTR SS:[EBP],EAX ; *
功能:從ESI數據中獲得1個dword的立即數,壓入EBPSTACK
0043DB1E 66:8B46 FE MOV AX,WORD PTR DS:[ESI-2] ; * 0043D171 /86E0 XCHG AL,AH ; * 0043E948 66:29D8 SUB AX,BX ; * 0043E951 66:05 71F2 ADD AX,0F271 ; * 0043E95C 66:F7D8 NEG AX ; * 0043E969 8D76 FE LEA ESI,[ESI-2] ; * 0043D62C 66:35 A61C XOR AX,1CA6 ; * 0043D640 \66:29C3 SUB BX,AX ; * 0043D648 98 CWDE ; * 0043D190 83ED 04 SUB EBP,4 ; * 0043D933 8945 00 MOV DWORD PTR SS:[EBP],EAX ; *
功能:從ESI數據中獲得1個word的立即數,按照dword的方式壓入EBPSTACK
0043D979 . 0FB646 FF MOVZX EAX,BYTE PTR DS:[ESI-1] ; * 0043D97E . 30D8 XOR AL,BL ; * 0043D1ED . FEC8 DEC AL ; * 0043D1F0 . F6D8 NEG AL ; * 0043D1F7 . F6D0 NOT AL ; * 0043D1FD . 30C3 XOR BL,AL ; * 0043CEE8 > /83ED 02 SUB EBP,2 ; * 0043DD79 |. 66:8945 00 MOV WORD PTR SS:[EBP],AX ; |* 0043DD62 /$ 4E DEC ESI ; *
功能:從ESI數據中獲得1個byte的立即數,按照word的方式壓入EBPSTACK
0043D3A7 0FB646 FF MOVZX EAX,BYTE PTR DS:[ESI-1] ; * 0043D3AC 30D8 XOR AL,BL ; * 0043D848 FEC8 DEC AL ; * 0043D855 F6D8 NEG AL ; * 0043D866 F6D0 NOT AL ; * 0043D86D 30C3 XOR BL,AL ; * 0043ED8C 66:98 CBW ; * 0043CF7B 98 CWDE ; * 0043EC00 8D76 FF LEA ESI,[ESI-1] ; * 0043DB94 83ED 04 SUB EBP,4 ; * 0043DB9F 8945 00 MOV DWORD PTR SS:[EBP],EAX ; *
功能:從ESI數據中獲得1個byte的立即數,按照dword的方式壓入EBPSTACK
0043CF2F |. 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; * 0043EED3 |. 0145 04 ADD DWORD PTR SS:[EBP+4],EAX ; * 0043CE4F |. 9C PUSHFD ; * 0043CE50 |. 8F4424 3C POP DWORD PTR SS:[ESP+3C] ; * 0043D1BF /> \FF7424 3C PUSH DWORD PTR SS:[ESP+3C] ; * 0043D1C3 |. 8F45 00 POP DWORD PTR SS:[EBP] ; *
功能:把EBPSTACK棧頂的2個dword數據相加,結果存儲在[EBP+4],EFLAGS標志存儲在棧頂。
0043D43F 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; * 0043D10A 8B00 MOV EAX,DWORD PTR DS:[EAX] ; * 0043D447 8945 00 MOV DWORD PTR SS:[EBP],EAX ; *
功能:把EBPSTACK棧頂數據作為內存地址,從中讀取1個dword的數據壓入EBPSTACK
0043E9D0 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; * 0043E9D9 83C5 02 ADD EBP,2 ; * 0043DEBB 66:36:8B00 MOV AX,WORD PTR SS:[EAX] ; * 0043DDC4 66:8945 00 MOV WORD PTR SS:[EBP],AX ; *
功能:把EBPSTACK棧頂數據作為內存地址,從中讀取1個word的數據壓入EBPSTACK
0043D57B |. 8B55 00 MOV EDX,DWORD PTR SS:[EBP] 0043D589 |. 83C5 02 ADD EBP,2 ; * 0043D591 |. 8A02 MOV AL,BYTE PTR DS:[EDX] ; * 0043E70B |. 66:8945 00 MOV WORD PTR SS:[EBP],AX ; *
功能:把EBPSTACK棧頂數據作為內存地址,從中讀取1個byte的數據,按照word的方式壓入EBPSTACK
0043DC5C 8A46 FF MOV AL,BYTE PTR DS:[ESI-1] ; * 0043DC66 28D8 SUB AL,BL ; * 0043DC6D C0C8 05 ROR AL,5 ; * 0043EADA 4E DEC ESI ; * 0043EE2E \F6D8 NEG AL ; * 0043EE34 34 0E XOR AL,0E ; * 0043E740 28C3 SUB BL,AL ; * 0043E746 66:8B0438 MOV AX,WORD PTR DS:[EDI+EAX] ; * 0043D9E4 83ED 02 SUB EBP,2 ; * 0043EE44 66:8945 00 MOV WORD PTR SS:[EBP],AX ; *
功能:從EDISTACK中讀取1個word數據壓入EBPSTACK
0043CF84 8A46 FF MOV AL,BYTE PTR DS:[ESI-1] ; * 0043CF8E 30D8 XOR AL,BL ; * 0043EE0A \FEC0 INC AL ; * 0043EE11 C0C8 07 ROR AL,7 ; * 0043EE1E FEC0 INC AL ; * 0043D59C 30C3 XOR BL,AL ; * 0043D2CE 4E DEC ESI ; * 0043D2D7 8A0438 MOV AL,BYTE PTR DS:[EDI+EAX] ; * 0043D2E6 83ED 02 SUB EBP,2 ; * 0043D075 66:8945 00 MOV WORD PTR SS:[EBP],AX ; *
功能:從EDISTACK中讀取1個byte數據,按照word方式壓入EBPSTACK
0043D72F /. 89E8 MOV EAX,EBP ; * 0043E613 /$ 83ED 04 SUB EBP,4 ; * 0043E61C |. 8945 00 MOV DWORD PTR SS:[EBP],EAX ; *
功能:復制EBP指針到EBPSTACK棧頂
0043EACC 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; * 0043DE1B 36:8B00 MOV EAX,DWORD PTR SS:[EAX] ; * 0043DE25 8945 00 MOV DWORD PTR SS:[EBP],EAX ; *
功能:把EBPSTACK棧頂數據作為堆棧地址,從中讀取一個dword的數據壓入EBPSTACK
0043E79C |. 8B55 00 MOV EDX,DWORD PTR SS:[EBP] ; * 0043E7A7 |. 83C5 02 ADD EBP,2 ; * 0043E7AE |. 36:8A02 MOV AL,BYTE PTR SS:[EDX] ; * 0043D01B |. 66:8945 00 MOV WORD PTR SS:[EBP],AX ; *
功能:把EBPSTACK棧頂數據作為堆棧地址,從中讀取一個byte的數據,按照word的方式壓入EBPSTACK
0043D770
EBPSTACK的byte邏輯右移指令
0043EAE0
VM_JMP跳轉指令,重新給ESI賦值EBPSTACK棧頂數據
0043E199
復制EBPSTACK棧頂1個word的數據
0043DB00
把EBPSTACK棧頂數據作為地址,讀取其中1個word的數據壓入EBPSTACK
0043D82E
VM_DIV除法指令
0043ED1F
CPUID指令,結果壓入EBPSTACK。
0043ECF6
把EBPSTACK數據1個byte移動到棧頂內存地址內
0043E770
給EBP寄存器的低word位賦值棧頂數據
0043D253
把SS段寄存器壓入EBPSTACK棧頂
0043CDC9
另一種方式的word版NAND,不過這個是在EBPSTACK堆棧內完成運算過程
0043D2F5
EBPSTACK的byte邏輯左移指令
0043D6E7
EBPSTACK的word邏輯左移指令
0043DBAC
EBPSTACK的word邏輯右移指令
0043E06B
EBPSTACK的word加法
0043E8CD
把EAX和EDX壓入EBPSTACK
0043E13C
把EBPSTACK數據1個word移動到棧頂內存地址內
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn