日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁西西教程軟件使用 → VMProtect2.04加殼程序從入門到精通

      VMProtect2.04加殼程序從入門到精通

      相關軟件相關文章發(fā)表評論 來源:本站整理時間:2010/11/2 18:59:10字體大。A-A+

      作者:佚名點擊:3925次評論:0次標簽: VMProtect 加殼

      VMProtect UltimateV2.13.5 中文注冊版
      • 類型:加殼脫殼大。13.5M語言:中文 評分:4.2
      • 標簽:
      立即下載
      3 頁 VMProtect2.04偽指令匯總

      1.3.偽指令匯總
      調(diào)試VMP前期的一個重要的體力活是,識別出所有的偽指令,并根據(jù)它的用途給它相應的命名。以后就可以在DISPATCH部件的最后跳轉地址:
      0043E11F |. C2 5000 RETN 50
      下斷點,再盯著VM堆棧就可以知道VM的所有操作。
      我們先來了解所有偽指令的DISPATCH(調(diào)遣)部件:
      0043E6BF |. 8A46 FF MOV AL,BYTE PTR DS:[ESI-1] ; *
      0043E6C4 |. 30D8 XOR AL,BL ; *
      0043E6CE |. F6D0 NOT AL ; *
      0043E6D6 |. FEC8 DEC AL ; *
      0043E6DA |. C0C8 07 ROR AL,7 ; *
      0043E6E1 |. 83EE 01 SUB ESI,1 ; *
      0043E6ED |. 30C3 XOR BL,AL ; *
      0043D02F |. 0FB6C0 MOVZX EAX,AL ; *

      0043F124 |. 8B1485 DBE143 MOV EDX,DWORD PTR DS:[EAX*4+43E1DB] ; *
      0043E100 |> /81C2 6B197FB6 ADD EDX,B67F196B ; *

      0043E10A |. 895424 3C MOV DWORD PTR SS:[ESP+3C],EDX ; *
      0043E11B |. FF7424 4C PUSH DWORD PTR SS:[ESP+4C] ; *
      0043E11F |. C2 5000 RETN 50
      首先從ESI中解密獲得下一條偽指令在DispatchTable(調(diào)遣表)中的偏移量,使用[EAX*4+43E1DB]來讀取出偽指令地址,簡單的ADD解密后,把真正的偽指令地址壓入ESP棧頂,最后用RETN 50跳轉到相應的偽指令。
      MOV EDX,DWORD PTR DS:[EAX*4+43E1DB]給我們提供的信息:DispatchTable的起始地址是0043E1DB,最后一個dword的開始地址是以AL的最大值FF作為偏移量[FF*4+43E1DB]=0043E5D7。我們把記事本0043E1DB--0043E5D7的數(shù)據(jù)粘貼:
      CPU Dump
      Address Hex dump ASCII
      0043E1D0 09|BA C4 49 D0| .I
      0043E1E0 BA C4 49 1E|B7 C4 49 E6|C4 C4 49 53|D1 C4 49 05| IIISI
      0043E1F0 BE C4 49 75|D1 C4 49 D4|CE C4 49 0C|D6 C4 49 C3| IuII.I
      0043E200 BD C4 49 7B|CE C4 49 67|BE C4 49 26|BF C4 49 EB| I{IgI&I
      0043E210 C2 C4 49 82|D0 C4 49 3A|BA C4 49 1E|B5 C4 49 A8| II:II
      0043E220 C4 C4 49 1E|B5 C4 49 2E|C8 C4 49 B9|BB C4 49 E9| II.II
      0043E230 C3 C4 49 2D|B8 C4 49 95|C1 C4 49 82|D0 C4 49 75| I-IIIu
      0043E240 D1 C4 49 C3|BE C4 49 16|B6 C4 49 2D|B8 C4 49 75| I鎂II-Iu
      0043E250 D1 C4 49 95|C1 C4 49 EB|C2 C4 49 52|BF C4 49 B4| IIIRI
      0043E260 D3 C4 49 8B|D3 C4 49 05|CE C4 49 52|BF C4 49 D4| IIIRI
      0043E270 CE C4 49 E8|B8 C4 49 C3|BD C4 49 C3|BE C4 49 5E| II媒I鎂I^
      0043E280 B4 C4 49 B1|B8 C4 49 61|BD C4 49 5D|BF C4 49 E9| IIaI]I
      0043E290 C3 C4 49 26|BF C4 49 5F|D0 C4 49 B4|D3 C4 49 E6| I&I_II
      0043E2A0 C4 C4 49 EC|B7 C4 49 1E|B5 C4 49 0D|C0 C4 49 0D| III.I.
      0043E2B0 C0 C4 49 C3|BD C4 49 5D|BF C4 49 7B|CE C4 49 C3| I媒I]I{I
      0043E2C0 BD C4 49 1E|B5 C4 49 82|D0 C4 49 8A|B9 C4 49 A6| IIII
      0043E2D0 D1 C4 49 EB|C2 C4 49 D4|CE C4 49 61|BD C4 49 09| IIIaI.
      0043E2E0 BA C4 49 53|D1 C4 49 61|BD C4 49 3A|BA C4 49 3A| ISIaI:I:
      0043E2F0 D0 C4 49 0C|D6 C4 49 3A|BA C4 49 1E|B7 C4 49 05| I.I:II
      0043E300 CE C4 49 0D|C0 C4 49 82|D0 C4 49 27|D2 C4 49 7C| I.II'I|
      0043E310 BD C4 49 E8|B8 C4 49 41|C2 C4 49 E9|C3 C4 49 25| IIAII%
      0043E320 CE C4 49 53|C6 C4 49 61|BD C4 49 53|C6 C4 49 83| ISIaISI
      0043E330 D6 C4 49 53|C6 C4 49 5D|BF C4 49 53|C6 C4 49 A8| ISI]ISI
      0043E340 C4 C4 49 53|C6 C4 49 5F|D0 C4 49 53|C6 C4 49 E6| ISI_ISI
      0043E350 C4 C4 49 53|C6 C4 49 3A|BA C4 49 53|C6 C4 49 00| ISI:ISI.
      0043E360 C7 C4 49 53|C6 C4 49 2D|B8 C4 49 53|C6 C4 49 25| ISI-ISI%
      0043E370 CE C4 49 53|C6 C4 49 83|D6 C4 49 53|C6 C4 49 1E| ISIISI
      0043E380 B7 C4 49 53|C6 C4 49 C3|BD C4 49 53|C6 C4 49 62| ISI媒ISIb
      0043E390 CF C4 49 53|C6 C4 49 12|D3 C4 49 53|C6 C4 49 E8| ISIISI
      0043E3A0 B8 C4 49 05|CE C4 49 1E|B7 C4 49 8A|B9 C4 49 B4| IIII
      0043E3B0 D3 C4 49 B9|BB C4 49 A6|D1 C4 49 E8|B8 C4 49 FE| IIII
      0043E3C0 C0 C4 49 82|D0 C4 49 53|D1 C4 49 2D|B8 C4 49 52| IISI-IR
      0043E3D0 BF C4 49 3A|D0 C4 49 C3|BE C4 49 A6|C1 C4 49 C3| I:I鎂II
      0043E3E0 BE C4 49 5E|B4 C4 49 82|D0 C4 49 7C|BD C4 49 C3| I^II|I
      0043E3F0 BD C4 49 C3|BE C4 49 1E|B7 C4 49 61|BD C4 49 A6| I鎂IIaI
      0043E400 C1 C4 49 82|D0 C4 49 12|D3 C4 49 FE|C0 C4 49 25| IIII%
      0043E410 CE C4 49 0C|D6 C4 49 09|BA C4 49 2E|C8 C4 49 67| I.I.I.Ig
      0043E420 BE C4 49 8A|B9 C4 49 EB|C2 C4 49 D4|CE C4 49 95| IIII
      0043E430 C1 C4 49 D1|C7 C4 49 09|BA C4 49 00|C7 C4 49 B9| II.I.I
      0043E440 BB C4 49 D1|C7 C4 49 B4|D3 C4 49 5E|B4 C4 49 D1| III^I
      0043E450 C7 C4 49 A8|C4 C4 49 A6|C1 C4 49 12|D3 C4 49 B4| IIII
      0043E460 D3 C4 49 D0|BA C4 49 41|C2 C4 49 82|D0 C4 49 B1| I瀉IAII
      0043E470 B8 C4 49 1E|B5 C4 49 27|D2 C4 49 82|D0 C4 49 75| II'IIu
      0043E480 D1 C4 49 5E|B4 C4 49 25|CE C4 49 16|B6 C4 49 7B| I^I%II{
      0043E490 CE C4 49 7C|BD C4 49 EB|C2 C4 49 27|D2 C4 49 83| I|II'I
      0043E4A0 D6 C4 49 12|D3 C4 49 2E|C8 C4 49 1E|B5 C4 49 E6| II.II
      0043E4B0 C4 C4 49 C3|BD C4 49 95|C1 C4 49 1E|B5 C4 49 EC| I媒III
      0043E4C0 B7 C4 49 B9|BB C4 49 5F|D0 C4 49 83|D6 C4 49 8A| II_II
      0043E4D0 B9 C4 49 A6|C1 C4 49 D4|CE C4 49 8B|D3 C4 49 0D| IIII.
      0043E4E0 C0 C4 49 E8|B8 C4 49 2D|B8 C4 49 61|BD C4 49 82| II-IaI
      0043E4F0 D0 C4 49 12|D3 C4 49 1E|B5 C4 49 7C|BD C4 49 D1| III|I
      0043E500 C7 C4 49 7C|BD C4 49 05|CE C4 49 A6|C1 C4 49 5F| I|III_
      0043E510 D0 C4 49 1E|B7 C4 49 7B|CE C4 49 0C|D6 C4 49 05| II{I.I
      0043E520 BE C4 49 9F|C2 C4 49 B9|BB C4 49 9F|C2 C4 49 D4| IIII
      0043E530 CE C4 49 9F|C2 C4 49 EC|B7 C4 49 9F|C2 C4 49 62| IIIIb
      0043E540 CF C4 49 9F|C2 C4 49 2D|B8 C4 49 9F|C2 C4 49 0C| II-II.
      0043E550 D6 C4 49 9F|C2 C4 49 0D|C0 C4 49 9F|C2 C4 49 05| II.II
      0043E560 BE C4 49 9F|C2 C4 49 C3|BD C4 49 9F|C2 C4 49 53| II媒IIS
      0043E570 D1 C4 49 9F|C2 C4 49 75|D1 C4 49 9F|C2 C4 49 05| IIuII
      0043E580 CE C4 49 9F|C2 C4 49 75|D1 C4 49 9F|C2 C4 49 27| IIuII'
      0043E590 D2 C4 49 9F|C2 C4 49 09|BA C4 49 9F|C2 C4 49 B9| II.II
      0043E5A0 B5 C4 49 E6|C4 C4 49 09|BA C4 49 8B|D3 C4 49 25| II.II%
      0043E5B0 CE C4 49 0D|C0 C4 49 B9|B5 C4 49 E9|C3 C4 49 12| I.III
      0043E5C0 D3 C4 49 FE|C0 C4 49 05|CE C4 49 83|D6 C4 49 0D| IIII.
      0043E5D0 C0 C4 49 EC|B7 C4 49 D0|BA C4 49 II瀉I
      雖然DispatchTable的數(shù)據(jù)很多,但是很多不同的偏移量指向的相同的數(shù)據(jù),這是一種保護方式。我們反過來想,如果DispatchTable中每個dword指向的是不同的偽指令,這就意味著每個EAX偏移量指向著唯一的一條偽指令,進一步的來說就是每個ESI值代表著唯一的一條偽指令。那么,如果有人逆向這個算法,就可以知道每個ESI值對應的是哪個偽指令,這樣就可以直接讀取ESI值而了解VMP的執(zhí)行偽指令,基本等于半自動識別VMP。一名對VMP經(jīng)驗豐富的人,只要看著VM執(zhí)行的偽指令盯著EBPSTACK堆棧,就可以理解VM的情況。現(xiàn)在,由于多個ESI值指向相同的偽指令,還有動態(tài)EBX解碼,將會艱難的多。
      我們在OD中尋找一個空間,寫一段循環(huán)代碼,把DispatchTable的數(shù)據(jù)全部解密出來:
      原來的代碼:
      0043F11F \38F5 CMP CH,DH
      0043F121 66:FFC2 INC DX
      0043F124 8B1485 DBE14300 MOV EDX,DWORD PTR DS:[EAX*4+43E1DB] ; *
      0043F12B F9 STC
      0043F12C 84F4 TEST AH,DH
      0043F12E 60 PUSHAD
      0043F12F ^ E9 CC5EFCFF JMP 0043E100
      把最后一條指令修改為:
      0043F12F ^\E9 CC5EFCFF JMP 00405000
      在00405000添加循環(huán)代碼:
      CPU Disasm
      Address Hex dump Command Comments
      00405000 60 PUSHAD
      00405001 BE DBE14300 MOV ESI,0043E1DB ; DispatchTable地址
      00405006 BF 00514000 MOV EDI,00405100 ; 解密循環(huán)地址
      0040500B B9 00010000 MOV ECX,100
      00405010 31DB XOR EBX,EBX
      00405012 8B0433 MOV EAX,DWORD PTR DS:[ESI+EBX]
      00405015 05 6B197FB6 ADD EAX,B67F196B ; 解密指令只有1條ADD
      0040501A 89043B MOV DWORD PTR DS:[EDI+EBX],EAX
      0040501D 83C3 04 ADD EBX,4
      00405020 49 DEC ECX
      00405021 ^ 75 EF JNE SHORT 00405012
      00405023 61 POPAD
      00405024 E9 8E900200 JMP 0043E100
      循環(huán)結束后,在00405100中就還原了整個DispatchTable:
      CPU Dump
      Address Hex dump ASCII
      00405100 74 D3 43 00|3B D4 43 00|89 D0 43 00|51 DE 43 00| tC.;C.C.QC.
      00405110 BE EA 43 00|70 D7 43 00|E0 EA 43 00|3F E8 43 00| C.pC.C.?C.
      00405120 77 EF 43 00|2E D7 43 00|E6 E7 43 00|D2 D7 43 00| wC..C.C.C.
      00405130 91 D8 43 00|56 DC 43 00|ED E9 43 00|A5 D3 43 00| C.VC.C.C.
      00405140 89 CE 43 00|13 DE 43 00|89 CE 43 00|99 E1 43 00| C.C.C.C.
      00405150 24 D5 43 00|54 DD 43 00|98 D1 43 00|00 DB 43 00| $C.TC.C..C.
      00405160 ED E9 43 00|E0 EA 43 00|2E D8 43 00|81 CF 43 00| C.C..C.C.
      00405170 98 D1 43 00|E0 EA 43 00|00 DB 43 00|56 DC 43 00| C.C..C.VC.
      00405180 BD D8 43 00|1F ED 43 00|F6 EC 43 00|70 E7 43 00| C.C.C.pC.
      00405190 BD D8 43 00|3F E8 43 00|53 D2 43 00|2E D7 43 00| C.?C.SC..C.
      004051A0 2E D8 43 00|C9 CD 43 00|1C D2 43 00|CC D6 43 00| .C.C.C.C.
      004051B0 C8 D8 43 00|54 DD 43 00|91 D8 43 00|CA E9 43 00| C.TC.C.C.
      004051C0 1F ED 43 00|51 DE 43 00|57 D1 43 00|89 CE 43 00| C.QC.WC.C.
      004051D0 78 D9 43 00|78 D9 43 00|2E D7 43 00|C8 D8 43 00| xC.xC..C.C.
      004051E0 E6 E7 43 00|2E D7 43 00|89 CE 43 00|ED E9 43 00| C..C.C.C.
      004051F0 F5 D2 43 00|11 EB 43 00|56 DC 43 00|3F E8 43 00| C.C.VC.?C.
      00405200 CC D6 43 00|74 D3 43 00|BE EA 43 00|CC D6 43 00| C.tC.C.C.
      00405210 A5 D3 43 00|A5 E9 43 00|77 EF 43 00|A5 D3 43 00| C.C.wC.C.
      00405220 89 D0 43 00|70 E7 43 00|78 D9 43 00|ED E9 43 00| C.pC.xC.C.
      00405230 92 EB 43 00|E7 D6 43 00|53 D2 43 00|AC DB 43 00| C.C.SC.C.
      00405240 54 DD 43 00|90 E7 43 00|BE DF 43 00|CC D6 43 00| TC.C.C.C.
      00405250 BE DF 43 00|EE EF 43 00|BE DF 43 00|C8 D8 43 00| C.C.C.C.
      00405260 BE DF 43 00|13 DE 43 00|BE DF 43 00|CA E9 43 00| C.C.C.C.
      00405270 BE DF 43 00|51 DE 43 00|BE DF 43 00|A5 D3 43 00| C.QC.C.C.
      00405280 BE DF 43 00|6B E0 43 00|BE DF 43 00|98 D1 43 00| C.kC.C.C.
      00405290 BE DF 43 00|90 E7 43 00|BE DF 43 00|EE EF 43 00| C.C.C.C.
      004052A0 BE DF 43 00|89 D0 43 00|BE DF 43 00|2E D7 43 00| C.C.C..C.
      004052B0 BE DF 43 00|CD E8 43 00|BE DF 43 00|7D EC 43 00| C.C.C.}C.
      004052C0 BE DF 43 00|53 D2 43 00|70 E7 43 00|89 D0 43 00| C.SC.pC.C.
      004052D0 F5 D2 43 00|1F ED 43 00|24 D5 43 00|11 EB 43 00| C.C.$C.C.
      004052E0 53 D2 43 00|69 DA 43 00|ED E9 43 00|BE EA 43 00| SC.iC.C.C.
      004052F0 98 D1 43 00|BD D8 43 00|A5 E9 43 00|2E D8 43 00| C.C.C..C.
      00405300 11 DB 43 00|2E D8 43 00|C9 CD 43 00|ED E9 43 00| C..C.C.C.
      00405310 E7 D6 43 00|2E D7 43 00|2E D8 43 00|89 D0 43 00| C..C..C.C.
      00405320 CC D6 43 00|11 DB 43 00|ED E9 43 00|7D EC 43 00| C.C.C.}C.
      00405330 69 DA 43 00|90 E7 43 00|77 EF 43 00|74 D3 43 00| iC.C.wC.tC.
      00405340 99 E1 43 00|D2 D7 43 00|F5 D2 43 00|56 DC 43 00| C.C.C.VC.
      00405350 3F E8 43 00|00 DB 43 00|3C E1 43 00|74 D3 43 00| ?C..C.<C.tC.
      00405360 6B E0 43 00|24 D5 43 00|3C E1 43 00|1F ED 43 00| kC.$C.<C.C.
      00405370 C9 CD 43 00|3C E1 43 00|13 DE 43 00|11 DB 43 00| C.<C.C.C.
      00405380 7D EC 43 00|1F ED 43 00|3B D4 43 00|AC DB 43 00| }C.C.;C.C.
      00405390 ED E9 43 00|1C D2 43 00|89 CE 43 00|92 EB 43 00| C.C.C.C.
      004053A0 ED E9 43 00|E0 EA 43 00|C9 CD 43 00|90 E7 43 00| C.C.C.C.
      004053B0 81 CF 43 00|E6 E7 43 00|E7 D6 43 00|56 DC 43 00| C.C.C.VC.
      004053C0 92 EB 43 00|EE EF 43 00|7D EC 43 00|99 E1 43 00| C.C.}C.C.
      004053D0 89 CE 43 00|51 DE 43 00|2E D7 43 00|00 DB 43 00| C.QC..C..C.
      004053E0 89 CE 43 00|57 D1 43 00|24 D5 43 00|CA E9 43 00| C.WC.$C.C.
      004053F0 EE EF 43 00|F5 D2 43 00|11 DB 43 00|3F E8 43 00| C.C.C.?C.
      00405400 F6 EC 43 00|78 D9 43 00|53 D2 43 00|98 D1 43 00| C.xC.SC.C.
      00405410 CC D6 43 00|ED E9 43 00|7D EC 43 00|89 CE 43 00| C.C.}C.C.
      00405420 E7 D6 43 00|3C E1 43 00|E7 D6 43 00|70 E7 43 00| C.<C.C.pC.
      00405430 11 DB 43 00|CA E9 43 00|89 D0 43 00|E6 E7 43 00| C.C.C.C.
      00405440 77 EF 43 00|70 D7 43 00|0A DC 43 00|24 D5 43 00| wC.pC..C.$C.
      00405450 0A DC 43 00|3F E8 43 00|0A DC 43 00|57 D1 43 00| .C.?C..C.WC.
      00405460 0A DC 43 00|CD E8 43 00|0A DC 43 00|98 D1 43 00| .C.C..C.C.
      00405470 0A DC 43 00|77 EF 43 00|0A DC 43 00|78 D9 43 00| .C.wC..C.xC.
      00405480 0A DC 43 00|70 D7 43 00|0A DC 43 00|2E D7 43 00| .C.pC..C..C.
      00405490 0A DC 43 00|BE EA 43 00|0A DC 43 00|E0 EA 43 00| .C.C..C.C.
      004054A0 0A DC 43 00|70 E7 43 00|0A DC 43 00|E0 EA 43 00| .C.pC..C.C.
      004054B0 0A DC 43 00|92 EB 43 00|0A DC 43 00|74 D3 43 00| .C.C..C.tC.
      004054C0 0A DC 43 00|24 CF 43 00|51 DE 43 00|74 D3 43 00| .C.$C.QC.tC.
      004054D0 F6 EC 43 00|90 E7 43 00|78 D9 43 00|24 CF 43 00| C.C.xC.$C.
      004054E0 54 DD 43 00|7D EC 43 00|69 DA 43 00|70 E7 43 00| TC.}C.iC.pC.
      004054F0 EE EF 43 00|78 D9 43 00|57 D1 43 00|3B D4 43 00| C.xC.WC.;C.
      Intel的Little Endian(小尾)方式存儲讓我們看的非常的別扭。在OD的主窗口(CPU窗口)中來到00405000 .data段,看一下00405100的顯示:
      004050F2 0000 ADD BYTE PTR DS:[EAX],AL
      004050F4 0000 ADD BYTE PTR DS:[EAX],AL
      004050F6 0000 ADD BYTE PTR DS:[EAX],AL
      004050F8 0000 ADD BYTE PTR DS:[EAX],AL
      004050FA 0000 ADD BYTE PTR DS:[EAX],AL
      004050FC 0000 ADD BYTE PTR DS:[EAX],AL
      004050FE 0000 ADD BYTE PTR DS:[EAX],AL
      00405100 ^ 74 D3 JE SHORT 004050D5
      00405102 43 INC EBX
      00405103 003B ADD BYTE PTR DS:[EBX],BH
      00405105 D4 43 AAM 43
      00405110 BE EA430070 MOV ESI,700043EA
      OD把我們的數(shù)據(jù)當做代碼來顯示了。點擊右鍵-->Analysis-->Analyse code Ctrl + A ,彈出對話框是否分析,點擊確定。顯示如下:
      004050FB 00 DB 00
      004050FC 00 DB 00
      004050FD 00 DB 00
      004050FE 00 DB 00
      004050FF 00 DB 00
      00405100 . 74D34300 DD 0043D374
      00405104 . 3BD44300 DD 0043D43B
      00405108 . 89D04300 DD 0043D089
      0040510C . 51DE4300 DD 0043DE51
      00405110 . BEEA4300 DD 0043EABE
      00405114 . 70D74300 DD 0043D770
      00405118 . E0EA4300 DD 0043EAE0
      0040511C . 3FE84300 DD 0043E83F
      00405120 . 77EF4300 DD 0043EF77
      00405124 . 2ED74300 DD 0043D72E
      00405128 . E6E74300 DD 0043E7E6
      0040512C . D2D74300 DD 0043D7D2
      OD正確的以數(shù)據(jù)方式顯示,并且已經(jīng)按照我們?nèi)粘5牧晳T把數(shù)據(jù)按照Big Endian(大尾)方式顯示。
      對于DispatchTable中重復的數(shù)據(jù),我們也要把他清除,在剛才00405000的匯編代碼下面繼續(xù):
      CPU Disasm
      Address Hex dump Command Comments
      00405000 60 PUSHAD
      00405001 BE DBE14300 MOV ESI,0043E1DB ; DispatchTable地址
      00405006 BF 00514000 MOV EDI,00405100 ; 解密循環(huán)地址
      0040500B B9 00010000 MOV ECX,100
      00405010 31DB XOR EBX,EBX
      00405012 8B0433 MOV EAX,DWORD PTR DS:[ESI+EBX]
      00405015 05 6B197FB6 ADD EAX,B67F196B ; 解密指令只有1條ADD
      0040501A 89043B MOV DWORD PTR DS:[EDI+EBX],EAX
      0040501D 83C3 04 ADD EBX,4
      00405020 49 DEC ECX
      00405021 ^ 75 EF JNE SHORT 00405012
      00405023 61 POPAD
      00405024 EB 03 JMP SHORT 00405029
      00405026 90 NOP
      00405027 90 NOP
      00405028 90 NOP
      00405029 60 PUSHAD
      0040502A BE 00514000 MOV ESI,00405100 ; TispatchTable
      0040502F BF 005A4000 MOV EDI,00405A00 ; new DispatchTable
      00405034 B9 00010000 MOV ECX,100
      00405039 BA 00000000 MOV EDX,0
      0040503E 8D1C8D 00000000 LEA EBX,[ECX*4]
      00405045 8B06 MOV EAX,DWORD PTR DS:[ESI]
      00405047 83F8 00 CMP EAX,0
      0040504A 74 1A JE SHORT 00405066
      0040504C 8907 MOV DWORD PTR DS:[EDI],EAX
      0040504E 83C7 04 ADD EDI,4
      00405051 83C2 04 ADD EDX,4
      00405054 39DA CMP EDX,EBX
      00405056 74 0E JE SHORT 00405066
      00405058 3B0432 CMP EAX,DWORD PTR DS:[ESI+EDX]
      0040505B ^ 75 F4 JNE SHORT 00405051
      0040505D C70432 00000000 MOV DWORD PTR DS:[ESI+EDX],0
      00405064 ^ EB EB JMP SHORT 00405051
      00405066 83C6 04 ADD ESI,4
      00405069 49 DEC ECX
      0040506A ^ 75 CD JNE SHORT 00405039
      0040506C 61 POPAD
      0040506D E9 8E900200 JMP 0043E100
      第一部分是前面解密代碼,第二部分是分別比較00405100中的數(shù)據(jù),把相同的全部放00000000,同時把非0的數(shù)據(jù)存入00405A00中。
      執(zhí)行完這些代碼后,00405A00中生成了VM中所有的偽指令,在通過OD把它按照數(shù)據(jù)顯示出來如下:
      CPU Disasm
      Address Hex dump Command Comments
      00405A00 . \74D34300 DD 0043D374
      00405A04 . 3BD44300 DD 0043D43B
      00405A08 . 89D04300 DD 0043D089
      00405A0C . 51DE4300 DD 0043DE51
      00405A10 . BEEA4300 DD 0043EABE
      00405A14 . 70D74300 DD 0043D770
      00405A18 . E0EA4300 DD 0043EAE0
      00405A1C . 3FE84300 DD 0043E83F
      00405A20 . 77EF4300 DD 0043EF77
      00405A24 . 2ED74300 DD 0043D72E
      00405A28 . E6E74300 DD 0043E7E6
      00405A2C . D2D74300 DD 0043D7D2
      00405A30 . 91D84300 DD 0043D891
      00405A34 . 56DC4300 DD 0043DC56
      00405A38 . EDE94300 DD 0043E9ED
      00405A3C . A5D34300 DD 0043D3A5
      00405A40 . 89CE4300 DD 0043CE89
      00405A44 . 13DE4300 DD 0043DE13
      00405A48 . 99E14300 DD 0043E199
      00405A4C . 24D54300 DD 0043D524
      00405A50 . 54DD4300 DD 0043DD54
      00405A54 . 98D14300 DD 0043D198
      00405A58 . 00DB4300 DD 0043DB00
      00405A5C . 2ED84300 DD 0043D82E
      00405A60 . 81CF4300 DD 0043CF81
      00405A64 . BDD84300 DD 0043D8BD
      00405A68 . 1FED4300 DD 0043ED1F
      00405A6C . F6EC4300 DD 0043ECF6
      00405A70 . 70E74300 DD 0043E770
      00405A74 . 53D24300 DD 0043D253
      00405A78 . C9CD4300 DD 0043CDC9
      00405A7C . 1CD24300 DD 0043D21C
      00405A80 . CCD64300 DD 0043D6CC
      00405A84 . C8D84300 DD 0043D8C8
      00405A88 . CAE94300 DD 0043E9CA
      00405A8C . 57D14300 DD 0043D157
      00405A90 . 78D94300 DD 0043D978
      00405A94 . F5D24300 DD 0043D2F5
      00405A98 . 11EB4300 DD 0043EB11
      00405A9C . A5E94300 DD 0043E9A5
      00405AA0 . 92EB4300 DD 0043EB92
      00405AA4 . E7D64300 DD 0043D6E7
      00405AA8 . ACDB4300 DD 0043DBAC
      00405AAC . 90E74300 DD 0043E790
      00405AB0 . BEDF4300 DD 0043DFBE
      00405AB4 . EEEF4300 DD 0043EFEE
      00405AB8 . 6BE04300 DD 0043E06B
      00405ABC . CDE84300 DD 0043E8CD
      00405AC0 . 7DEC4300 DD 0043EC7D
      00405AC4 . 69DA4300 DD 0043DA69
      00405AC8 . 11DB4300 DD 0043DB11
      00405ACC . 3CE14300 DD 0043E13C
      00405AD0 . 0ADC4300 DD 0043DC0A
      00405AD4 . 24CF4300 DD 0043CF24
      這個VM一共有52條偽指令,在本節(jié)中我將一一列出這52條偽指令。每個分析VMP的人都有自己對偽指令的命名方式。
      移動到EBPSTACK的數(shù)據(jù)使用PUSH指令,移動到EDISTACK的數(shù)據(jù)使用MOV指令。在VM中,對數(shù)據(jù)的操作包括byte和dword,而存儲的方式是word和dword,當遇到byte和word交織在一起的時候,可以就把數(shù)據(jù)作為word操作來看。
      下面我以:VM_PUSHw_MEMORYb為例說明我的命名規(guī)則:
      偽指令的命名統(tǒng)一使用VM_開頭;并接上直觀的助記符PUSH;EBPSTACK是移動的目的地;MEMORY是移動的來源地;w代表word、b代表byte、dw代表dword;這條指令的表示:這是一條移動指令,把1個byte的數(shù)據(jù)從內(nèi)存塊移動到EBPSTACK,存儲時是按照word來存儲。
      在VMP的偽指令中包含有大量的花指令和junk code,在本文列出的偽指令都是去除了這些無用代碼。
      0043DC0A命名:
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      代碼:
      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的數(shù)據(jù)存儲到EDISTACK

      0043E7E6命名:
      VM_MOVw_EDISTACKw_EBPSTACKw
      代碼:
      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的數(shù)據(jù)存儲到EDISTACK

      0043D374命名:
      VM_MOVb_EDISTACKb_EBPSTACKw
      代碼:
      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的數(shù)據(jù)按照byte的方式存儲到EDISTACK

      0043D21C命名:
      VM_PUSHw_IMMEDIATEw
      代碼:
      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數(shù)據(jù)中取得1個word的立即數(shù)壓入EBPSTACK

      0043E83F命名:
      VM_PUSHdw_IMMEDIATEdw
      代碼:
      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數(shù)據(jù)中獲得1個dword的立即數(shù),壓入EBPSTACK

      0043DB11命名:
      VM_PUSHdw_IMMEDIATEw
      代碼:
      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數(shù)據(jù)中獲得1個word的立即數(shù),按照dword的方式壓入EBPSTACK

      0043D978命名:
      VM_PUSHw_IMMEDIATEb
      代碼:
      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數(shù)據(jù)中獲得1個byte的立即數(shù),按照word的方式壓入EBPSTACK

      0043D3A5命名:
      VM_PUSHdw_IMMEDIATEb
      代碼:
      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數(shù)據(jù)中獲得1個byte的立即數(shù),按照dword的方式壓入EBPSTACK

      0043CF24命名:
      VM_ADDdw_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棧頂?shù)?個dword數(shù)據(jù)相加,結果存儲在[EBP+4],EFLAGS標志存儲在棧頂。
      例:
      0013F97C 8021D2F0 !
      0013F980 00000000 ....
      VM_ADDdw_EBPSTACK
      0013F97C 00000286 ..
      0013F980 8021D2F0 !

      0043D43B命名:
      VM_PUSHdw_MEMORYdw
      代碼:
      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棧頂數(shù)據(jù)作為內(nèi)存地址,從中讀取1個dword的數(shù)據(jù)壓入EBPSTACK

      0043E9CA命名:
      VM_PUSHw_MEMORYw
      代碼:
      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棧頂數(shù)據(jù)作為內(nèi)存地址,從中讀取1個word的數(shù)據(jù)壓入EBPSTACK

      0043D8BD命名:
      VM_PUSHw_MEMORYb
      代碼:
      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棧頂數(shù)據(jù)作為內(nèi)存地址,從中讀取1個byte的數(shù)據(jù),按照word的方式壓入EBPSTACK

      0043DC56命名:
      VM_PUSHw_EDISTACKw
      代碼:
      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數(shù)據(jù)壓入EBPSTACK

      0043CF81命名:
      VM_PUSHw_EDISTACKb
      代碼:
      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數(shù)據(jù),按照word方式壓入EBPSTACK

      0043D72E命名:
      VM_PUSHdw_EBP
      代碼:
      0043D72F /. 89E8 MOV EAX,EBP ; *
      0043E613 /$ 83ED 04 SUB EBP,4 ; *
      0043E61C |. 8945 00 MOV DWORD PTR SS:[EBP],EAX ; *
      功能:
      復制EBP指針到EBPSTACK棧頂
      例:
      EBP 0013F9AC
      0013F9AC 00000000 ....
      VM_PUSHdw_EBP
      0013F9A8 0013F9AC .
      0013F9AC 00000000 ....

      0043EABE命名:
      VM_COPYdw_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棧頂數(shù)據(jù)作為堆棧地址,從中讀取一個dword的數(shù)據(jù)壓入EBPSTACK
      例:
      0013F998 F99E
      0013F99C 02460013 .F
      0013F9A0 0000 ...
      VM_COPYdw_EBPSTACK
      0013F998 0246
      0013F99C 02460000 ..F
      0013F9A0 0000 ...

      0043E790命名:
      VM_COPYw_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棧頂數(shù)據(jù)作為堆棧地址,從中讀取一個byte的數(shù)據(jù),按照word的方式壓入EBPSTACK
      例:
      0013F9A8 0013F9AC .
      0013F9AC 0000 ....
      VM_COPYw_EBPSTACK
      0013F9A8 0000
      0013F9AC 0000 ....

      0043D198命名:
      VM_NANDdw
      代碼:
      0043D1A3 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; *
      0043D1AD 8B55 04 MOV EDX,DWORD PTR SS:[EBP+4] ; *
      0043DEAE F7D0 NOT EAX ; *
      0043DDE1 /F7D2 NOT EDX ; *
      0043CDC2 21D0 AND EAX,EDX ; *
      0043E0F8 8945 04 MOV DWORD PTR SS:[EBP+4],EAX ; *
      0043D0FB /9C PUSHFD ; *
      0043D0FC 8F4424 2C POP DWORD PTR SS:[ESP+2C] ; *
      0043EC46 FF7424 34 PUSH DWORD PTR SS:[ESP+34] ; *
      0043EC4A 8F45 00 POP DWORD PTR SS:[EBP] ; *
      功能:
      dword版的與非門,從EBPSTACK的棧頂讀取2個dword作為操作數(shù),結果存儲在第二個操作數(shù)位置,EFLAGS標志存儲在棧頂。
      例:
      0013F9A8 00000286 ..
      0013F9AC 00000286 ..
      VM_NANDdw
      0013F9A8 00000282 ..
      0013F9AC FFFFFD79 y

      0043EB92命名:
      VM_NANDw
      代碼:
      0043EB94 |. 66:8B45 00 MOV AX,WORD PTR SS:[EBP] ; *
      0043EBA5 |. 66:8B55 02 MOV DX,WORD PTR SS:[EBP+2] ; *
      0043EBB3 |. F6D0 NOT AL ; *
      0043EBBB |. F6D2 NOT DL ; *
      0043EBC1 |. 83ED 02 SUB EBP,2 ; *
      0043EBC5 |. 20D0 AND AL,DL ; *
      0043EBCD |. 66:8945 04 MOV WORD PTR SS:[EBP+4],AX ; *
      0043EBD5 |. 9C PUSHFD ; *
      0043D26F |$ FF7424 28 PUSH DWORD PTR SS:[ESP+28] ; *
      0043D273 |. 8F45 00 POP DWORD PTR SS:[EBP] ; *
      功能:
      word版的與非門,從EBPSTACK的棧頂讀取2個word作為操作數(shù),結果存儲在第二個操作數(shù)位置,EFLAGS標志存儲在棧頂。
      例:
      EBP 0013F9AA
      0013F9A8 0000
      0013F9AC 0000 ....
      VM_NANDw
      0013F9A8 00000286 ..
      0013F9AC 00FF ...

      0043EB11命名:
      VM_ADDw_EBPSTACK
      代碼:
      0043EB14 |. 8A45 00 MOV AL,BYTE PTR SS:[EBP] ; *
      0043EB1C |. 83ED 02 SUB EBP,2 ; *
      0043EB21 |. 0045 04 ADD BYTE PTR SS:[EBP+4],AL ; *
      0043EB26 |. 9C PUSHFD ; *
      0043EB27 |. 8F4424 20 POP DWORD PTR SS:[ESP+20] ; *
      0043E8F9 |> /FF7424 40 PUSH DWORD PTR SS:[ESP+40] ; *
      0043E8FD |. |8F45 00 POP DWORD PTR SS:[EBP] ; *
      功能:
      把EBPSTACK棧頂?shù)?個word數(shù)據(jù)中的低byte相加,結果存儲在第二個操作數(shù)位置,EFLAGS標志存儲在棧頂。
      例:
      0013F9AC 000000FF ...
      VM_ADDw_EBPSTACK
      0013F9A8 0286
      0013F9AC 00FF0000 ...

      0043DFBE命名:
      VM_PUSHdw_EDISTACKdw
      代碼:
      0043DFC1 F6D8 NEG AL ; *
      0043DFCD C0C8 07 ROR AL,7 ; *
      0043DFDA 2C 20 SUB AL,20 ; *
      0043DFDD 24 3C AND AL,3C ; *
      0043CE6C 8B1438 MOV EDX,DWORD PTR DS:[EDI+EAX] ; *
      0043CE71 83ED 04 SUB EBP,4 ; *
      0043CE79 8955 00 MOV DWORD PTR SS:[EBP],EDX ; *
      功能:
      把1個dword的數(shù)據(jù)從EDISTACK壓入EBPSTACK

      0043D7D2命名:
      VM_SHRdw_EBPSTACK
      代碼:
      0043D7DA 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; *
      0043D7E6 8A4D 04 MOV CL,BYTE PTR SS:[EBP+4] ; *
      0043D4F8 83ED 02 SUB EBP,2 ; *
      0043D504 D3E8 SHR EAX,CL ; *
      0043F17D \8945 04 MOV DWORD PTR SS:[EBP+4],EAX ; *
      0043EA2E 9C PUSHFD ; *
      0043EA30 FF7424 20 PUSH DWORD PTR SS:[ESP+20] ; *
      0043EA34 8F45 00 POP DWORD PTR SS:[EBP] ; *
      功能:
      把EBPSTACK棧頂1個dword作為操作數(shù),[EBP+4]作為移動位數(shù),邏輯右移。結果dword存儲在第二個操作數(shù)和第一個操作數(shù)的高byte,EFLAGS標志存儲在棧頂。
      例:
      0013F99C 0040
      0013F9A0 00040000 ...
      VM_SHRdw_EBPSTACK
      0013F99C 00000202 ..
      0013F9A0 00000004 ...

      0043E9A5命名:
      VM_SHLdw_EBPSTACK
      代碼:
      0043E9A9 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; *
      0043E9B5 8A4D 04 MOV CL,BYTE PTR SS:[EBP+4] ; *
      0043E0B2 >83ED 02 SUB EBP,2 ; *
      0043E0BC D3E0 SHL EAX,CL ; *
      0043CDEA 8945 04 MOV DWORD PTR SS:[EBP+4],EAX ; *
      0043DD1A \9C PUSHFD
      0043DD1B 8F4424 28 POP DWORD PTR SS:[ESP+28]
      0043DD24 FF7424 2C PUSH DWORD PTR SS:[ESP+2C] ; *
      0043DD28 8F45 00 POP DWORD PTR SS:[EBP] ; *
      功能:
      把EBPSTACK棧頂1個dword作為操作數(shù),[EBP+4]作為移動位數(shù),邏輯左移。結果dword存儲在第二個操作數(shù)和第一個操作數(shù)的高byte,EFLAGS標志存儲在棧頂。

      0043DE51命名:
      VM_SHRDdw_EBPSTACK
      代碼:
      0043DE5D 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; *
      0043DE69 8B55 04 MOV EDX,DWORD PTR SS:[EBP+4] ; *
      0043DE6E 8A4D 08 MOV CL,BYTE PTR SS:[EBP+8] ; *
      0043DE73 83C5 02 ADD EBP,2 ; *
      0043DE7A 0FADD0 SHRD EAX,EDX,CL ; *
      0043D38F 8945 04 MOV DWORD PTR SS:[EBP+4],EAX ; *
      0043D66C 9C PUSHFD ; *
      0043D66D 8F4424 34 POP DWORD PTR SS:[ESP+34] ; *
      0043D67F FF7424 40 PUSH DWORD PTR SS:[ESP+40] ; *
      0043D683 8F45 00 POP DWORD PTR SS:[EBP] ; *
      功能:
      EBPSTACK雙精度右移指令,執(zhí)行完畢后,結果和EFLAGS存儲到EBPSTACK

      0043D524命名:
      VM_SHLDdw_EBPSTACK
      代碼:
      0043D529 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; *
      0043D537 8B55 04 MOV EDX,DWORD PTR SS:[EBP+4] ; *
      0043D545 8A4D 08 MOV CL,BYTE PTR SS:[EBP+8] ; *
      0043D550 83C5 02 ADD EBP,2 ; *
      0043D558 0FA5D0 SHLD EAX,EDX,CL ; *
      0043D637 8945 04 MOV DWORD PTR SS:[EBP+4],EAX ; *
      0043CED3 9C PUSHFD
      0043D8F4 \FF7424 34 PUSH DWORD PTR SS:[ESP+34] ; *
      0043D8F8 8F45 00 POP DWORD PTR SS:[EBP] ; *
      功能:
      EBPSTACK雙精度左移指令,執(zhí)行完畢后,結果和EFLAGS存儲到EBPSTACK

      0043D089命名:
      VM_JMP
      代碼:
      0043D722 8B75 00 MOV ESI,DWORD PTR SS:[EBP] ; *
      0043EF1F \83C5 04 ADD EBP,4 ; *
      0043E6A9 89F3 MOV EBX,ESI ; *
      0043E6B8 0375 00 ADD ESI,DWORD PTR SS:[EBP] ; *
      功能:
      把EBPSTACK棧頂?shù)刂芬苿拥紼SI,重新初始化EBX和ESI。

      0043EF77命名:
      VM_EBPSTACK_CALL
      代碼:
      0043EF7B 0FB646 FF MOVZX EAX,BYTE PTR DS:[ESI-1] ; *
      0043EF82 30D8 XOR AL,BL ; *
      0043EF8D FEC8 DEC AL ; *
      0043EF99 F6D8 NEG AL ; *
      0043EFAF 8D76 FF LEA ESI,[ESI-1] ; *
      0043EFB3 F6D0 NOT AL ; *
      0043EFC4 30C3 XOR BL,AL ; *
      0043EFCD 0FB6C8 MOVZX ECX,AL ; *
      0043EFDC 894D FC MOV DWORD PTR SS:[EBP-4],ECX ; *

      0043ECEA 31C0 XOR EAX,EAX ; *
      0043E0C6 87448D 00 XCHG DWORD PTR SS:[ECX*4+EBP],EAX ; * parameter
      0043E0CD 894424 24 MOV DWORD PTR SS:[ESP+24],EAX ; *
      0043EE89 83E9 01 SUB ECX,1 ; *
      0043EE9C ^\0F85 3FFEFFFF JNE 0043ECE1 ; *
      0043CF5B 29C0 SUB EAX,EAX ; *
      0043CF6A C74424 04 B7EE4 MOV DWORD PTR SS:[ESP+4],0043EEB7 ; *
      0043CF60 8745 00 XCHG DWORD PTR SS:[EBP],EAX ; *
      0043DDF9 894424 08 MOV DWORD PTR SS:[ESP+8],EAX ; *
      0043DDFD FF7424 04 PUSH DWORD PTR SS:[ESP+4] ; *
      0043DE0C FF7424 34 PUSH DWORD PTR SS:[ESP+34] ; *
      0043DE10 C2 3800 RETN 38 ; VM_APICALL
      功能:
      VM中最復雜的偽指令,用于系統(tǒng)API調(diào)用和程序過程調(diào)用。ESI數(shù)據(jù)中取得參數(shù)的個數(shù),EAX循環(huán)取得參數(shù),壓入ESP指針指向的常規(guī)堆棧。大量使用[ESP+X]的方式調(diào)用,摻雜著廢壓棧操作,靜態(tài)看代碼難以看出。返回地址是常量壓入的0043EEB7。這條偽指令涉及內(nèi)容眾多,分支龐大,系統(tǒng)API調(diào)用和程序過程調(diào)用的走向都是不同的,在后面章節(jié)詳述。我這里列舉的是一次只有1個參數(shù)的系統(tǒng)API調(diào)用

      0043D891命名:
      VM_MOVdw_MEMORYdw_EBPSTACKdw
      代碼:
      0043D897 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; *
      0043D8A1 8B55 04 MOV EDX,DWORD PTR SS:[EBP+4] ; *
      0043D8A6 83C5 08 ADD EBP,8 ; *
      0043D8AA 8910 MOV DWORD PTR DS:[EAX],EDX ; *
      功能:
      EBPSTACK棧頂數(shù)據(jù)作為地址,把棧頂?shù)牡诙䝼dword存儲到地址內(nèi)

      0043EFEE命名:
      VM_MOVdw_MEMORYdw_EBPSTACKdw
      代碼:
      0043EFF3 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; *
      0043F005 8B55 04 MOV EDX,DWORD PTR SS:[EBP+4] ; *
      0043F010 83C5 08 ADD EBP,8 ; *
      0043D335 36:8910 MOV DWORD PTR SS:[EAX],EDX ; *
      功能:
      EBPSTACK棧頂數(shù)據(jù)作為地址,把棧頂?shù)牡诙䝼dword存儲到地址內(nèi)。與上一條偽指令完全相同

      0043D157命名:
      VM_MOVdw_MEMORYdw_EBPSTACKdw
      代碼:
      0043D159 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; *
      0043D169 8B55 04 MOV EDX,DWORD PTR SS:[EBP+4] ; *
      0043CDF7 83C5 08 ADD EBP,8 ; *
      0043CE09 26:8910 MOV DWORD PTR ES:[EAX],EDX ; *
      EBPSTACK棧頂數(shù)據(jù)作為地址,把棧頂?shù)牡诙䝼dword存儲到地址內(nèi)。與上兩條偽指令完全相同

      0043E9ED命名:
      VM_MOVw_MEMORYw_EBPSTACKw
      代碼:
      0043E9F7 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; *
      0043E9FD 66:8B55 04 MOV DX,WORD PTR SS:[EBP+4] ; *
      0043EA02 83C5 06 ADD EBP,6 ; *
      0043EA0D 66:8910 MOV WORD PTR DS:[EAX],DX ; *
      功能:
      EBPSTACK棧頂數(shù)據(jù)作為地址,把棧頂?shù)牡诙䝼word存儲到地址內(nèi)

      0043D6CC命名:
      VM_MOVb_MEMORYb_EBPSTACKb
      代碼:
      0043D6D3 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; *
      0043D6DB 8A55 04 MOV DL,BYTE PTR SS:[EBP+4] ; *
      0043EC6C 83C5 06 ADD EBP,6 ; *
      0043D495 36:8810 MOV BYTE PTR SS:[EAX],DL ; *
      功能:
      EBPSTACK棧頂數(shù)據(jù)作為地址,把棧頂?shù)牡诙䝼byte存儲到地址內(nèi)

      0043CE89命名:
      VM_HASH
      代碼:
      0043CE98 8B55 00 MOV EDX,DWORD PTR SS:[EBP] ; *
      0043CEA0 83C5 04 ADD EBP,4 ; *
      0043CEA6 31C0 XOR EAX,EAX ; *
      0043DCC0 89C1 MOV ECX,EAX ; *
      0043E6FA C1E0 07 SHL EAX,7 ; *
      0043E701 C1E9 19 SHR ECX,19 ; *
      0043D2BD /09C8 OR EAX,ECX ; *
      0043D7EF \3202 XOR AL,BYTE PTR DS:[EDX] ; *
      0043D7F2 42 INC EDX ; *
      0043DD12 FF4D 00 DEC DWORD PTR SS:[EBP] ; *
      0043F023 ^\0F85 7FDEFFFF JNE 0043CEA8 ; *
      0043D9FA 8945 00 MOV DWORD PTR SS:[EBP],EAX ; *
      功能:
      計算一段數(shù)據(jù)的HASH值,EBPSTACK棧頂?shù)谝粋dword是數(shù)據(jù)地址,第二個dword是數(shù)據(jù)大小

      0043DE13命名:
      VM_MOVdw_EBPreg_EBPSTACK
      代碼:
      0043F134 \8B6D 00 MOV EBP,DWORD PTR SS:[EBP] ; *
      功能:
      給EBP寄存器賦值EBPSTACK棧頂數(shù)據(jù)

      0043DD54命名:
      VM_FS:[EBPSTACK]
      代碼:
      0043DD5A 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; *
      0043F10E 64:8B00 MOV EAX,DWORD PTR FS:[EAX] ; *
      0043F112 8945 00 MOV DWORD PTR SS:[EBP],EAX ; *
      功能:
      讀取FS[X]數(shù)據(jù),X=EBPSTACK棧頂數(shù)據(jù)

      0043D8C8命名:
      VM_SEH
      代碼:
      0043D8CF 8B45 00 MOV EAX,DWORD PTR SS:[EBP] ; *
      0043D8DE 8B55 04 MOV EDX,DWORD PTR SS:[EBP+4] ; *
      0043D8E7 83C5 08 ADD EBP,8 ; *
      0043D243 64:8910 MOV DWORD PTR FS:[EAX],EDX ; *
      功能:
      給FS[X]傳遞Y數(shù)據(jù),X=EBPSTACK棧頂數(shù)據(jù),Y=EBPSTACK棧頂?shù)?個數(shù)據(jù)。在實踐中都是用于給FS[0]賦值,構建SEH

      0043DA69命名:
      VM_EXIT
      代碼:
      0043DA6F 89EC MOV ESP,EBP ; *
      0043DA73 58 POP EAX ; *
      0043DA7E 59 POP ECX ; *
      0043DA87 9D POPFD ; *
      0043DA8D 5D POP EBP ; *
      0043CDB1 /59 POP ECX ; *
      0043CDB8 8B5C24 08 MOV EBX,DWORD PTR SS:[ESP+8] ; *
      0043F068 8B6C24 14 MOV EBP,DWORD PTR SS:[ESP+14] ; *
      0043F06D 8B4424 38 MOV EAX,DWORD PTR SS:[ESP+38] ; *
      0043F06D 8B4424 38 MOV EAX,DWORD PTR SS:[ESP+38] ; *
      0043DC99 8B7C24 44 MOV EDI,DWORD PTR SS:[ESP+44] ; *
      0043DCA7 5E POP ESI ; *
      0043DCB6 FF7424 04 PUSH DWORD PTR SS:[ESP+4] ; *
      0043DCBA C2 0800 RETN 8 ; *
      功能:
      給各個寄存器賦值EBPSTACK中的數(shù)據(jù),EBPSTACK中的最后一個數(shù)據(jù)是跳轉地址

      0043EC7D命名:
      VM_MOVdw_EFLreg_EBPSTACK
      代碼:
      0043EC80 FF75 00 PUSH DWORD PTR SS:[EBP] ; *
      0043EC83 8F4424 08 POP DWORD PTR SS:[ESP+8] ; *
      0043EC8E FF7424 28 PUSH DWORD PTR SS:[ESP+28] ; *
      0043EC92 9D POPFD ; *
      功能:
      給EFLAGE寄存器賦值EBPSTACK棧頂數(shù)據(jù)

      在F7跟蹤加殼記事本的過程中,并不是所有的偽指令都使用到了,以下是沒有被執(zhí)行到的偽指令:
      00405A14 . 70D74300 DD 0043D770
      00405A18 . E0EA4300 DD 0043EAE0
      00405A48 . 99E14300 DD 0043E199
      00405A58 . 00DB4300 DD 0043DB00
      00405A5C . 2ED84300 DD 0043D82E
      00405A68 . 1FED4300 DD 0043ED1F
      00405A6C . F6EC4300 DD 0043ECF6
      00405A70 . 70E74300 DD 0043E770
      00405A74 . 53D24300 DD 0043D253
      00405A78 . C9CD4300 DD 0043CDC9
      00405A94 . F5D24300 DD 0043D2F5
      00405AA4 . E7D64300 DD 0043D6E7
      00405AA8 . ACDB4300 DD 0043DBAC
      00405AB8 . 6BE04300 DD 0043E06B
      00405ABC . CDE84300 DD 0043E8CD
      00405ACC . 3CE14300 DD 0043E13C
      由于沒有實際的走過這些偽指令,靜態(tài)分析后覺得,有個別偽指令的代碼怕提取錯了。把這些指令寫成簡介模式:
      0043D770
      EBPSTACK的byte邏輯右移指令
      0043EAE0
      VM_JMP跳轉指令,重新給ESI賦值EBPSTACK棧頂數(shù)據(jù)
      0043E199
      復制EBPSTACK棧頂1個word的數(shù)據(jù)
      0043DB00
      把EBPSTACK棧頂數(shù)據(jù)作為地址,讀取其中1個word的數(shù)據(jù)壓入EBPSTACK
      0043D82E
      VM_DIV除法指令
      0043ED1F
      CPUID指令,結果壓入EBPSTACK。
      0043ECF6
      把EBPSTACK數(shù)據(jù)1個byte移動到棧頂內(nèi)存地址內(nèi)
      0043E770
      給EBP寄存器的低word位賦值棧頂數(shù)據(jù)
      0043D253
      把SS段寄存器壓入EBPSTACK棧頂
      0043CDC9
      另一種方式的word版NAND,不過這個是在EBPSTACK堆棧內(nèi)完成運算過程
      0043D2F5
      EBPSTACK的byte邏輯左移指令
      0043D6E7
      EBPSTACK的word邏輯左移指令
      0043DBAC
      EBPSTACK的word邏輯右移指令
      0043E06B
      EBPSTACK的word加法
      0043E8CD
      把EAX和EDX壓入EBPSTACK
      0043E13C
      把EBPSTACK數(shù)據(jù)1個word移動到棧頂內(nèi)存地址內(nèi)

      到這里,所有的偽指令都羅列完畢,真的是體力活呀!
      2.綜合運用
      2.1.常見偽指令組合
      在VMP的偽指令的執(zhí)行中有一些常見的組合套路,熟悉它們能讓我們在跟蹤VMP時更加的得心應手。這些組合與操作數(shù)的長度是無關的,下面的偽指令將去掉b w dw等標記。在例子部分,我將使用dword操作數(shù)來舉例,直觀明了。
      2.1.1.
      VM_PUSH_EBP ;復制EBP指針到EBPSTACK棧頂
      VM_COPY_EBPSTACK ;把EBPSTACK棧頂數(shù)據(jù)作為堆棧地址,從中讀取一個數(shù)據(jù)壓入EBPSTACK
      這兩條指令是VMP中結合的極其緊密的組合,它們幾乎總是一起出現(xiàn)的,用于把EBPSTACK堆棧中的數(shù)據(jù)復制起來到EBPSTACK。而很多情況下它們復制的就是原來的棧頂數(shù)據(jù)。在使用NAND來完成NOT(A)的運算中,它們是必備的前奏。凡是需要把操作數(shù)一個變兩個的地方都有它們的身影。
      例:
      EBP 0013F9AC
      0013F9AC 00000000 ....
      0013F9B0 7C92118A | ; RETURN to ntdll.7C92118A
      VM_PUSH_EBP
      EBP 0013F9A8
      0013F9A8 0013F9AC .
      0013F9AC 00000000 ....
      0013F9B0 7C92118A | ; RETURN to ntdll.7C92118A
      VM_COPY_EBPSTACK
      EBP 0013F9A8
      0013F9A8 00000000 ....
      0013F9AC 00000000 ....
      0013F9B0 7C92118A | ; RETURN to ntdll.7C92118A
      2.1.2.
      VM_NAND|VM_ADD_EBPSTACK|VM_SHLD_EBPSTACK|VM_SHR_EBPSTACK等等
      VM_MOV_EDISTACK_EBPSTACK ;把1個數(shù)據(jù)從EBPSTAK棧頂移動到EDISTACK,使用EAX作為偏移量
      在VMP所有的運算偽指令中都是統(tǒng)一的模式,運算后的EFLAGS寄存器值位于EBPSTACK棧頂,運算結果位于緊接棧頂?shù)腫EBP+4]。在運算結束后,跟上一條VM_MOV_EDISTACK_EBPSTACK把運算后的標志位移動到EDISTACK,在很多時候,這都是一條廢指令操作,純粹是為去掉棧頂數(shù)據(jù),以便繼續(xù)操作運算結果。
      如果接下來VM進行檢測標志位的相關操作,這條指令就變得異常重要。例如:在對系統(tǒng)函數(shù)的CC碼int3斷點檢測中,取出系統(tǒng)函數(shù)開頭的第一個byte數(shù)據(jù)XX,把它與CC相減,再跟上一個ZF標志位檢測+跳轉。在這個時候反過來,運算結果完全無用,而我們一定要在移動指令的EAX偏移量哪里下好斷點,觀察好EFLAGS寄存器值的走向與來源。
      2.1.3.
      在進行跳轉時,圍繞VM_JMP的前后,有大量無價值的數(shù)據(jù)移動操作。假設現(xiàn)在我們剛進行了一次條件判斷,VM剛剛把要跳轉的地址確定并解密出來:
      EBP 0013F9A8
      0013F9A8 00000202 .. ;最后一次解密運算得到的EFLAGS
      0013F9AC 0043651A eC. ;跳轉地址
      0013F9B0 7C92118A | ; RETURN to ntdll.7C92118A
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      EBP 0013F9B0
      0013F9B0 7C92118A | ; RETURN to ntdll.7C92118A
      VM_PUSHdw_EDISTACKdw
      VM_PUSHdw_EDISTACKdw
      VM_PUSHdw_EDISTACKdw
      VM_PUSHdw_EDISTACKdw
      VM_PUSHdw_EDISTACKdw
      VM_PUSHdw_EDISTACKdw
      VM_PUSHdw_EDISTACKdw
      VM_PUSHdw_EDISTACKdw
      VM_PUSHdw_EDISTACKdw
      VM_PUSHdw_EDISTACKdw
      VM_PUSHdw_EDISTACKdw
      VM_PUSHdw_EDISTACKdw
      EBP 0013F980
      0013F980 8021D2F0 !
      0013F984 0013F9C0 .
      0013F988 00000246 F..
      0013F98C 00000020 ...
      0013F990 000359F4 Y.
      0013F994 0013F9CC .
      0013F998 00400000 ..@. ; OFFSET NOTEPAD
      0013F99C 00000000 ....
      0013F9A0 004253CD SB. ; RETURN from NOTEPAD.004255DB to NOTEPAD.004253CD
      0013F9A4 000359F4 Y.
      0013F9A8 00400000 ..@. ; 該帶著走的數(shù)據(jù)都要在EBPSTACK里面帶著走,到這里還沒有完畢的。
      0013F9AC 0043651A eC. ;還有其他的數(shù)據(jù)要放入,8021D2F0要隱藏一下
      0013F9B0 7C92118A | ; RETURN to ntdll.7C92118A
      VM_PUSHdw_IMMEDIATEdw
      0013F97C 7FDE2D10 -
      0013F980 8021D2F0 !
      0013F984 0013F9C0
      VM_ADDdw_EBPSTACK
      0013F97C 00000247 G..
      0013F980 00000000 ....
      0013F984 0013F9C0
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      0013F980 00000000 ....
      0013F984 0013F9C0
      VM_PUSHdw_EDISTACKdw
      VM_PUSHdw_EDISTACKdw
      0013F978 0043651A eC.
      0013F97C 00000000 ....
      0013F980 00000000 ....
      0013F984 0013F9C0 .
      0013F988 00000246 F..
      0013F98C 00000020 ...
      0013F990 000359F4 Y.
      0013F994 0013F9CC .
      0013F998 00400000 ..@. ; OFFSET NOTEPAD
      0013F99C 00000000 ....
      0013F9A0 004253CD SB. ; RETURN from NOTEPAD.004255DB to NOTEPAD.004253CD
      0013F9A4 000359F4 Y.
      0013F9A8 00400000 ..@. ; OFFSET NOTEPAD.B
      0013F9AC 0043651A eC.
      0013F9B0 7C92118A | ; RETURN to ntdll.7C92118A

      VM_JMP ;帶著14個數(shù)據(jù),VM終于跳轉,除了棧頂0043651A放入ESI,其他13個數(shù)據(jù)要重新保存

      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      0013F980 00000000 ....
      0013F984 0013F9C0 .
      VM_PUSHdw_IMMEDIATEdw
      0013F97C 8021D2F0 !
      0013F980 00000000 ....
      0013F984 0013F9C0 .
      VM_ADDdw_EBPSTACK
      0013F97C 00000286 ..
      0013F980 8021D2F0 !
      0013F984 0013F9C0 . ;重新恢復出來
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw ;到這里停一下,搞個小運算,原EDX=000359F4 XOR 4DFD2FC2
      0013F990 000359F4 Y.
      0013F994 0013F9CC .
      0013F998 00400000 ..@. ; OFFSET NOTEPAD.B
      0013F99C 00000000 ....
      0013F9A0 004253CD SB. ; RETURN from NOTEPAD.004255DB to NOTEPAD.004253CD
      0013F9A4 000359F4 Y.
      0013F9A8 00400000 ..@. ; OFFSET NOTEPAD.B
      0013F9AC 0043651A eC.
      0013F9B0 7C92118A | ; RETURN to ntdll.7C92118A
      VM_PUSHdw_EBP
      0013F98C 0013F990 .
      0013F990 000359F4 Y.
      0013F994 0013F9CC .
      VM_COPYdw_EBPSTACK
      0013F98C 000359F4 Y.
      0013F990 000359F4 Y.
      0013F994 0013F9CC .
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      0013F990 000359F4 Y.
      0013F994 0013F9CC .
      VM_PUSHdw_EBP
      0013F98C 0013F990 .
      0013F990 000359F4 Y.
      0013F994 0013F9CC .
      VM_COPYdw_EBPSTACK
      0013F98C 000359F4 Y.
      0013F990 000359F4 Y.
      0013F994 0013F9CC .
      VM_NANDdw
      0013F98C 00000282 ..
      0013F990 FFFCA60B
      0013F994 0013F9CC .
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      0013F990 FFFCA60B
      0013F994 0013F9CC .
      VM_PUSHdw_IMMEDIATEdw
      0013F98C B202D03D =
      0013F990 FFFCA60B
      0013F994 0013F9CC .
      VM_NANDdw
      0013F98C 00000206 ..
      0013F990 000109C0 ..
      0013F994 0013F9CC .
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      0013F990 000109C0 ..
      0013F994 0013F9CC .
      VM_PUSHdw_IMMEDIATEdw
      0013F98C 4DFD2FC2 /M
      0013F990 000109C0 ..
      0013F994 0013F9CC .
      VM_PUSHdw_EDISTACKdw
      0013F988 000359F4 Y.
      0013F98C 4DFD2FC2 /M
      0013F990 000109C0 ..
      0013F994 0013F9CC .
      VM_NANDdw
      0013F988 00000286 ..
      0013F98C B2008009 ..
      0013F990 000109C0 ..
      0013F994 0013F9CC .
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      0013F98C B2008009 ..
      0013F990 000109C0 ..
      0013F994 0013F9CC .
      VM_NANDdw
      0013F98C 00000206 ..
      0013F990 4DFE7636 6vM
      0013F994 0013F9CC .
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      VM_MOVdw_EDISTACKdw_EBPSTACKdw
      EBP 0013F9B0
      0013F9B0 7C92118A | ; RETURN to ntdll.7C92118A
      每一次VM_JMP跳轉,都要帶著14個數(shù)據(jù)轉,而其中呢VM還要搞上一點暗碼轉移。以后看到是VM_JMP跳轉的狀況,就是看著EBP指針,嘩嘩嘩的讓它執(zhí)行,完畢了才停下來。中間的操作完全可以無視,我也是為了完整的表達才把它粘貼出了代碼,實際看的時候,不用管。整個過程:要帶著走的數(shù)據(jù)移到EBPSTACK-->VM_JMP跳轉-->重新把數(shù)據(jù)保存到EDISTACK。關于其中000359F4 XOR 4DFD2FC2的過程,請參考下一節(jié)2.2.NAND。

      由于其他的組合都和NAND或標志位檢測+跳轉相關,放在下兩節(jié)中。這一節(jié)中的3個組合熟悉后,已經(jīng)可以無視掉一部分VM的操作。

        相關評論

        閱讀本文后您有什么感想? 已有人給出評價!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評論

        最新評論

        發(fā)表評論 查看所有評論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字數(shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)