- 纯手工打造:

代码:
CRCMatricInit:                                ;0x100 * 0x4 * 0x8

0x40cdd0 -> Ins:1 type:0 op1:0 op2:0          ;Backup_Flag_0_To_60

0x40cde0 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40cdf0 -> Ins:6 type:0 op1:1 op2:-4         ;Mov [0x44],-4
0x40ce00 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40ce10 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]    ;Base4_ESP -= 4

0x40ce20 -> Ins:4 type:0 op1:1 op2:2          ;Mov [0x44],Base2_ESI
0x40ce30 -> Ins:7 type:0 op1:0 op2:1          ;Mov ptr [0x40],[0x44]   ;*Base4_ESP = Base2_ESI

0x40ce40 -> Ins:4 type:0 op1:0 op2:6          ;Mov [0x40],Base6_EDX
0x40ce50 -> Ins:4 type:0 op1:1 op2:6          ;Mov [0x44],Base6_EDX
0x40ce60 -> Ins:15 type:0 op1:0 op2:0         ;XOR [0x40],[0x44]
0x40ce70 -> Ins:2 type:0 op1:0 op2:0          ;Restore_Flag_60_To_0
0x40ce80 -> Ins:3 type:0 op1:6 op2:0          ;Mov Base6_EDX,[0x40]    ;Base6_EDX = 0
0x40ce90 -> Ins:6 type:0 op1:0 op2:40ece0     ;Mov [0x40],40ece0

Loop2:
0x40cea0 -> Ins:3 type:0 op1:7 op2:0          ;Mov Base7_ECX,[0x40]    ;Base7_ECX = 40ece0

0x40ceb0 -> Ins:4 type:0 op1:0 op2:6          ;Mov [0x40],Base6_EDX
0x40cec0 -> Ins:3 type:0 op1:8 op2:0          ;Mov Base8_EAX,[0x40]    ;Base8_EAX = Base6_EDX

0x40ced0 -> Ins:6 type:0 op1:0 op2:8          ;Mov [0x40],8

Loop1:
0x40cee0 -> Ins:3 type:0 op1:2 op2:0          ;Mov Base2_ESI,[0x40]    ;Base2_ESI = 8

0x40cef0 -> Ins:4 type:0 op1:0 op2:8          ;Mov [0x40],Base8_EAX
0x40cf00 -> Ins:6 type:0 op1:1 op2:1          ;Mov [0x44],1
0x40cf10 -> Ins:13 type:2 op1:0 op2:0         ;TEST [0x40],[0x44]
0x40cf20 -> Ins:d type:0 op1:1 op2:0          ;Check_Flag_60_To_64     ;if (Base8_EAX & 1 == 0) jmp Next1
0x40cf30 -> Ins:e type:0 op1:a op2:0          ;Jmp 10, ByFlagCheckResult64  ---> 0x40cfe0

0x40cf40 -> Ins:4 type:0 op1:0 op2:8          ;Mov [0x40],Base8_EAX
0x40cf50 -> Ins:6 type:0 op1:1 op2:1          ;Mov [0x44],1
0x40cf60 -> Ins:18 type:0 op1:0 op2:0         ;SHR [0x40],[0x44]
0x40cf70 -> Ins:3 type:0 op1:8 op2:0          ;Mov Base8_EAX,[0x40]    ;Base8_EAX >> 1

0x40cf80 -> Ins:4 type:0 op1:0 op2:8          ;Mov [0x40],Base8_EAX
0x40cf90 -> Ins:6 type:0 op1:1 op2:edb08320   ;Mov [0x44],edb08320
0x40cfa0 -> Ins:15 type:0 op1:0 op2:0         ;XOR [0x40],[0x44]
0x40cfb0 -> Ins:3 type:0 op1:8 op2:0          ;Mov Base8_EAX,[0x40]    ;Base8_EAX ^= edb08320
0x40cfc0 -> Ins:d type:0 op1:0 op2:0          ;Check_Flag_60_To_64
0x40cfd0 -> Ins:e type:0 op1:4 op2:0          ;Jmp 4, ByFlagCheckResult64   ---> 0x40d020 jmp Next2

Next1:
0x40cfe0 -> Ins:4 type:0 op1:0 op2:8          ;Mov [0x40],Base8_EAX
0x40cff0 -> Ins:6 type:0 op1:1 op2:1          ;Mov [0x44],1
0x40d000 -> Ins:18 type:0 op1:0 op2:0         ;SHR [0x40],[0x44]      
0x40d010 -> Ins:3 type:0 op1:8 op2:0          ;Mov Base8_EAX,[0x40]    ;Base8_EAX >> 1

Next2:
0x40d020 -> Ins:4 type:0 op1:0 op2:2          ;Mov [0x40],Base2_ESI
0x40d030 -> Ins:6 type:0 op1:1 op2:1          ;Mov [0x44],1
0x40d040 -> Ins:10 type:0 op1:0 op2:0         ;SubEx [0x40],[0x44]
0x40d050 -> Ins:3 type:0 op1:2 op2:0          ;Mov Base2_ESI,[0x40]     ;Base2_ESI -= 1
0x40d060 -> Ins:d type:0 op1:2 op2:0          ;Check_Flag_60_To_64      ;if (Base2_ESI > 0) jmp Loop1
0x40d070 -> Ins:e type:0 op1:-25 op2:0        ;Jmp -25, ByFlagCheckResult64 ---> 0x40cee0 Loop1

0x40d080 -> Ins:4 type:0 op1:1 op2:8          ;Mov [0x44],Base8_EAX
0x40d090 -> Ins:4 type:0 op1:0 op2:7          ;Mov [0x40],Base7_ECX
0x40d0a0 -> Ins:7 type:0 op1:0 op2:1          ;Mov ptr [0x40],[0x44]    ;*Base7_ECX = Base8_EAX

0x40d0b0 -> Ins:4 type:0 op1:0 op2:7          ;Mov [0x40],Base7_ECX
0x40d0c0 -> Ins:6 type:0 op1:1 op2:4          ;Mov [0x44],4
0x40d0d0 -> Ins:f type:0 op1:0 op2:0          ;AddEx [0x40],[0x44]
0x40d0e0 -> Ins:3 type:0 op1:7 op2:0          ;Mov Base7_ECX,[0x40]     ;Base7_ECX += 4

0x40d0f0 -> Ins:4 type:0 op1:0 op2:6          ;Mov [0x40],Base6_EDX
0x40d100 -> Ins:6 type:0 op1:1 op2:1          ;Mov [0x44],1
0x40d110 -> Ins:f type:0 op1:0 op2:0          ;AddEx [0x40],[0x44]
0x40d120 -> Ins:3 type:0 op1:6 op2:0          ;Mov Base6_EDX,[0x40]     ;Base6_EDX += 1

0x40d130 -> Ins:4 type:0 op1:0 op2:7          ;Mov [0x40],Base7_ECX
0x40d140 -> Ins:6 type:0 op1:1 op2:40f0e0     ;Mov [0x44],40f0e0
0x40d150 -> Ins:10 type:0 op1:0 op2:0         ;SubEx [0x40],[0x44]
0x40d160 -> Ins:d type:0 op1:3 op2:0          ;Check_Flag_60_To_64      ;if (Base7_ECX < 0x40f0e0) jmp Loop2
0x40d170 -> Ins:e type:0 op1:-45 op2:0        ;Jmp -45, ByFlagCheckResult64 ---> 0x40cea0 Loop2

0x40d180 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d190 -> Ins:8 type:0 op1:1 op2:0          ;Mov [0x44],ptr [0x40]
0x40d1a0 -> Ins:3 type:0 op1:2 op2:1          ;Mov Base2_ESI,[0x44]     ;Base2_ESI = *Base4_ESP

0x40d1b0 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d1c0 -> Ins:6 type:0 op1:1 op2:4          ;Mov [0x44],4
0x40d1d0 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40d1e0 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]     ;Base4_ESP += 4

0x40d1f0 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d200 -> Ins:8 type:0 op1:7 op2:0          ;Mov [0x5C],ptr [0x40]    ;[0x5c] = *Base4_ESP ; return to eip of last normal call

0x40d210 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d220 -> Ins:6 type:0 op1:1 op2:4          ;Mov [0x44],4
0x40d230 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40d240 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]     ;Base4_ESP += 4

0x40d250 -> Ins:2 type:0 op1:0 op2:0          ;Restore_Flag_60_To_0
0x40d260 -> Ins:0 type:0 op1:0 op2:0          ;RestoreStack



CalculateCRC:

0x40d270 -> Ins:1 type:0 op1:0 op2:0          ;Backup_Flag_0_To_60

0x40d280 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d290 -> Ins:6 type:0 op1:1 op2:-4         ;Mov [0x44],-4
0x40d2a0 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40d2b0 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]     ;Base4_ESP -= 4

0x40d2c0 -> Ins:4 type:0 op1:1 op2:2          ;Mov [0x44],Base2_ESI
0x40d2d0 -> Ins:7 type:0 op1:0 op2:1          ;Mov ptr [0x40],[0x44]    ;*Base4_ESP = Base2_ESI ; Backup ESI

0x40d2e0 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d2f0 -> Ins:6 type:0 op1:1 op2:c          ;Mov [0x44],c
0x40d300 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40d310 -> Ins:8 type:0 op1:0 op2:0          ;Mov [0x40],ptr [0x40]
0x40d320 -> Ins:3 type:0 op1:2 op2:0          ;Mov Base2_ESI,[0x40]     ;Base2_ESI = *(Base4_ESP+0x0c) ;Length


0x40d330 -> Ins:4 type:0 op1:0 op2:8          ;Mov [0x40],Base8_EAX
0x40d340 -> Ins:6 type:0 op1:1 op2:ffffffff   ;Mov [0x44],ffffffff
0x40d350 -> Ins:16 type:0 op1:0 op2:0         ;OR [0x40],[0x44]
0x40d360 -> Ins:3 type:0 op1:8 op2:0          ;Mov Base8_EAX,[0x40]     ;Base8_EAX = 0xffffffff

0x40d370 -> Ins:4 type:0 op1:0 op2:2          ;Mov [0x40],Base2_ESI
0x40d380 -> Ins:4 type:0 op1:1 op2:2          ;Mov [0x44],Base2_ESI
0x40d390 -> Ins:13 type:0 op1:0 op2:0         ;TEST [0x40],[0x44]
0x40d3a0 -> Ins:d type:0 op1:4 op2:0          ;Check_Flag_60_To_64      ;if (Base2_ESI) jmp Next1 ; if (Length == 0) jmp Next1
0x40d3b0 -> Ins:e type:0 op1:3f op2:0         ;Jmp 63, ByFlagCheckResult64

0x40d3c0 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d3d0 -> Ins:6 type:0 op1:1 op2:8          ;Mov [0x44],8
0x40d3e0 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40d3f0 -> Ins:8 type:0 op1:0 op2:0          ;Mov [0x40],ptr [0x40]
0x40d400 -> Ins:3 type:0 op1:7 op2:0          ;Mov Base7_ECX,[0x40]     ;Base7_ECX = *(Base4_ESP+8); GetDataPointer

0x40d410 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d420 -> Ins:6 type:0 op1:1 op2:-4         ;Mov [0x44],-4
0x40d430 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40d440 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]     ;Base4_ESP -= 4

0x40d450 -> Ins:4 type:0 op1:1 op2:5          ;Mov [0x44],Base5_EBX

0x40d460 -> Ins:7 type:0 op1:0 op2:1          ;Mov ptr [0x40],[0x44]    ;*Base4_ESP = Base5_EBX

Loop1:
0x40d470 -> Ins:4 type:0 op1:0 op2:8          ;Mov [0x40],Base8_EAX
0x40d480 -> Ins:3 type:0 op1:6 op2:0          ;Mov Base6_EDX,[0x40]     ;Base6_EDX = Base8_EAX

0x40d490 -> Ins:4 type:0 op1:0 op2:5          ;Mov [0x40],Base5_EBX
0x40d4a0 -> Ins:4 type:0 op1:1 op2:5          ;Mov [0x44],Base5_EBX
0x40d4b0 -> Ins:15 type:0 op1:0 op2:0         ;XOR [0x40],[0x44]
0x40d4c0 -> Ins:2 type:0 op1:0 op2:0          ;Restore_Flag_60_To_0
0x40d4d0 -> Ins:3 type:0 op1:5 op2:0          ;Mov Base5_EBX,[0x40]     ;Base5_EBX = 0

0x40d4e0 -> Ins:4 type:0 op1:0 op2:7          ;Mov [0x40],Base7_ECX
0x40d4f0 -> Ins:8 type:2 op1:0 op2:0          ;Mov [0x40],ptr [0x40]
0x40d500 -> Ins:3 type:2 op1:5 op2:0          ;Mov Base5_EBX,[0x40]     ;Base5_EBX = *Base7_ECX

0x40d510 -> Ins:4 type:0 op1:0 op2:6          ;Mov [0x40],Base6_EDX
0x40d520 -> Ins:6 type:0 op1:1 op2:ff         ;Mov [0x44],ff
0x40d530 -> Ins:14 type:0 op1:0 op2:0         ;AND [0x40],[0x44]
0x40d540 -> Ins:3 type:0 op1:6 op2:0          ;Mov Base6_EDX,[0x40]     ;Base6_EDX &= 0xff

0x40d550 -> Ins:4 type:0 op1:0 op2:6          ;Mov [0x40],Base6_EDX
0x40d560 -> Ins:4 type:0 op1:1 op2:5          ;Mov [0x44],Base5_EBX
0x40d570 -> Ins:15 type:0 op1:0 op2:0         ;XOR [0x40],[0x44]
0x40d580 -> Ins:2 type:0 op1:0 op2:0          ;Restore_Flag_60_To_0
0x40d590 -> Ins:3 type:0 op1:6 op2:0          ;Mov Base6_EDX,[0x40]     ;Base6_EDX ^= Base5_EBX

0x40d5a0 -> Ins:4 type:0 op1:0 op2:8          ;Mov [0x40],Base8_EAX
0x40d5b0 -> Ins:6 type:0 op1:1 op2:8          ;Mov [0x44],8
0x40d5c0 -> Ins:18 type:0 op1:0 op2:0         ;SHR [0x40],[0x44]
0x40d5d0 -> Ins:3 type:0 op1:8 op2:0          ;Mov Base8_EAX,[0x40]     ;Base8_EAX >> 8

0x40d5e0 -> Ins:4 type:0 op1:0 op2:6          ;Mov [0x40],Base6_EDX
0x40d5f0 -> Ins:6 type:0 op1:1 op2:4          ;Mov [0x44],4
0x40d600 -> Ins:b type:0 op1:0 op2:0          ;MUL [0x40],[0x44]
0x40d610 -> Ins:6 type:0 op1:1 op2:40ece0     ;Mov [0x44],40ece0
0x40d620 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40d630 -> Ins:8 type:0 op1:0 op2:0          ;Mov [0x40],ptr [0x40]
0x40d640 -> Ins:3 type:0 op1:6 op2:0          ;Mov Base6_EDX,[0x40]     ;Base6_EDX = *(0x40ece0 + Base6_EDX*4)

0x40d650 -> Ins:4 type:0 op1:0 op2:8          ;Mov [0x40],Base8_EAX
0x40d660 -> Ins:4 type:0 op1:1 op2:6          ;Mov [0x44],Base6_EDX
0x40d670 -> Ins:16 type:0 op1:0 op2:0         ;OR [0x40],[0x44]
0x40d680 -> Ins:2 type:0 op1:0 op2:0          ;Restore_Flag_60_To_0
0x40d690 -> Ins:3 type:0 op1:8 op2:0          ;Mov Base8_EAX,[0x40]     ;Base8_EAX |= Base6_EDX

0x40d6a0 -> Ins:4 type:0 op1:0 op2:7          ;Mov [0x40],Base7_ECX
0x40d6b0 -> Ins:6 type:0 op1:1 op2:1          ;Mov [0x44],1
0x40d6c0 -> Ins:f type:0 op1:0 op2:0          ;AddEx [0x40],[0x44]
0x40d6d0 -> Ins:3 type:0 op1:7 op2:0          ;Mov Base7_ECX,[0x40]     ;Base7_ECX += 1

0x40d6e0 -> Ins:4 type:0 op1:0 op2:2          ;Mov [0x40],Base2_ESI
0x40d6f0 -> Ins:6 type:0 op1:1 op2:1          ;Mov [0x44],1
0x40d700 -> Ins:10 type:0 op1:0 op2:0         ;SubEx [0x40],[0x44]
0x40d710 -> Ins:3 type:0 op1:2 op2:0          ;Mov Base2_ESI,[0x40]     ;Base2_ESI -= 1

0x40d720 -> Ins:d type:0 op1:2 op2:0          ;Check_Flag_60_To_64      ;if (Base2_ESI > 0 ) jmp Loop1
0x40d730 -> Ins:e type:0 op1:-45 op2:0        ;Jmp -45, ByFlagCheckResult64 ; jmp 0x40d470

0x40d740 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d750 -> Ins:8 type:0 op1:1 op2:0          ;Mov [0x44],ptr [0x40]
0x40d760 -> Ins:3 type:0 op1:5 op2:1          ;Mov Base5_EBX,[0x44]     ;Base5_EBX = *Base4_ESP

0x40d770 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d780 -> Ins:6 type:0 op1:1 op2:4          ;Mov [0x44],4
0x40d790 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]

Next1:
0x40d7a0 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]     ;Base4_ESP += 4

0x40d7b0 -> Ins:4 type:0 op1:0 op2:8          ;Mov [0x40],Base8_EAX
0x40d7c0 -> Ins:17 type:0 op1:0 op2:0         ;NOT [0x40]
0x40d7d0 -> Ins:3 type:0 op1:8 op2:0          ;Mov Base8_EAX,[0x40]     ;~Base8_EAX

0x40d7e0 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d7f0 -> Ins:8 type:0 op1:1 op2:0          ;Mov [0x44],ptr [0x40]
0x40d800 -> Ins:3 type:0 op1:2 op2:1          ;Mov Base2_ESI,[0x44]     ;Base2_ESI = *Base4_ESP

0x40d810 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d820 -> Ins:6 type:0 op1:1 op2:4          ;Mov [0x44],4
0x40d830 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40d840 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]     ;Base4_ESP += 4

0x40d850 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d860 -> Ins:8 type:0 op1:7 op2:0          ;Mov [0x5c],ptr [0x40]    ;[0x5c] = *Base4_ESP ; return to eip of last normal call

0x40d870 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d880 -> Ins:6 type:0 op1:1 op2:4          ;Mov [0x44],4
0x40d890 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40d8a0 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]     ;Base4_ESP += 4

0x40d8b0 -> Ins:2 type:0 op1:0 op2:0          ;Restore_Flag_60_To_0
0x40d8c0 -> Ins:0 type:0 op1:0 op2:0          ;RestoreStack


GetLength:

0x40d948 -> Ins:1 type:0 op1:0 op2:0          ;Backup_Flag_0_To_60

0x40d958 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40d968 -> Ins:6 type:0 op1:1 op2:-4         ;Mov [0x44],-4
0x40d978 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40d988 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]     ;Base4_ESP -= 4

0x40d998 -> Ins:4 type:0 op1:1 op2:2          ;Mov [0x44],Base2_ESI
0x40d9a8 -> Ins:7 type:0 op1:0 op2:1          ;Mov ptr [0x40],[0x44]    ;*Base4_ESP = Base2_ESI

0x40d9b8 -> Ins:4 type:0 op1:0 op2:3          ;Mov [0x40],Base3_EBP
0x40d9c8 -> Ins:6 type:0 op1:1 op2:30         ;Mov [0x44],30
0x40d9d8 -> Ins:a type:0 op1:0 op2:0          ;SUB [0x40],[0x44]
0x40d9e8 -> Ins:8 type:0 op1:0 op2:0          ;Mov [0x40],ptr [0x40]
0x40d9f8 -> Ins:3 type:0 op1:2 op2:0          ;Mov Base2_ESI,[0x40]     ;Base2_ESI = *(Base3_EBP - 0x30)  ; --> Data

0x40da08 -> Ins:4 type:0 op1:0 op2:2          ;Mov [0x40],Base2_ESI
0x40da18 -> Ins:6 type:0 op1:1 op2:8          ;Mov [0x44],8
0x40da28 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40da38 -> Ins:8 type:0 op1:0 op2:0          ;Mov [0x40],ptr [0x40]
0x40da48 -> Ins:3 type:0 op1:8 op2:0          ;Mov Base8_EAX,[0x40]     ;Base8_EAX = *(Base2_ESI + 8)     ; Data length

0x40da58 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40da68 -> Ins:6 type:0 op1:1 op2:-4         ;Mov [0x44],-4
0x40da78 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40da88 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]     ;Base4_ESP -= 4

0x40da98 -> Ins:4 type:0 op1:1 op2:8          ;Mov [0x44],Base8_EAX
0x40daa8 -> Ins:7 type:0 op1:0 op2:1          ;Mov ptr [0x40],[0x44]    ;*Base4_ESP = Base8_EAX            ; Data length

0x40dab8 -> Ins:4 type:0 op1:0 op2:2          ;Mov [0x40],Base2_ESI
0x40dac8 -> Ins:3 type:0 op1:8 op2:0          ;Mov Base8_EAX,[0x40]     ;Base8_EAX = Base2_ESI

0x40dad8 -> Ins:4 type:0 op1:0 op2:8          ;Mov [0x40],Base8_EAX
0x40dae8 -> Ins:6 type:0 op1:1 op2:10         ;Mov [0x44],10
0x40daf8 -> Ins:f type:0 op1:0 op2:0          ;AddEx [0x40],[0x44]
0x40db08 -> Ins:3 type:0 op1:8 op2:0          ;Mov Base8_EAX,[0x40]     ;Base8_EAX += 0x10

0x40db18 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40db28 -> Ins:6 type:0 op1:1 op2:-4         ;Mov [0x44],-4
0x40db38 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40db48 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]     ;Base4_ESP -= 4

0x40db58 -> Ins:4 type:0 op1:1 op2:8          ;Mov [0x44],Base8_EAX
0x40db68 -> Ins:7 type:0 op1:0 op2:1          ;Mov ptr [0x40],[0x44]    ;*Base4_ESP = Base8_EAX           ;Data body

0x40db78 -> Ins:2 type:0 op1:0 op2:0          ;Restore_Flag_60_To_0


CheckCRC:                                     ;Base2_ESI-->Data, *(Base2_ESI+0x0c)-->CRC; Base8_EAX-->Calculated CRC

0x40db88 -> Ins:1 type:0 op1:0 op2:0          ;Backup_Flag_0_To_60

0x40db98 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40dba8 -> Ins:6 type:0 op1:1 op2:8          ;Mov [0x44],8
0x40dbb8 -> Ins:f type:0 op1:0 op2:0          ;AddEx [0x40],[0x44]
0x40dbc8 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]    ;Base4_ESP += 8

0x40dbd8 -> Ins:4 type:0 op1:0 op2:2          ;Mov [0x40],Base2_ESI
0x40dbe8 -> Ins:6 type:0 op1:1 op2:c          ;Mov [0x44],c
0x40dbf8 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40dc08 -> Ins:8 type:0 op1:1 op2:0          ;Mov [0x44],ptr [0x40]   ;[0x44] = *(Base2_ESI+0x0c)
0x40dc18 -> Ins:4 type:0 op1:0 op2:8          ;Mov [0x40],Base8_EAX   
0x40dc28 -> Ins:10 type:0 op1:0 op2:0         ;SubEx [0x40],[0x44]     ;[0x40] = Base8_EAX - *(Base2_ESI+0x0c))
0x40dc38 -> Ins:d type:0 op1:2 op2:0          ;Check_Flag_60_To_64     ;if ( Base8_EAX > 0 ) jmp Next1
0x40dc48 -> Ins:e type:0 op1:5 op2:0          ;Jmp 5, ByFlagCheckResult64

0x40dc58 -> Ins:4 type:0 op1:0 op2:3          ;Mov [0x40],Base3_EBP
0x40dc68 -> Ins:6 type:0 op1:1 op2:2c         ;Mov [0x44],2c
0x40dc78 -> Ins:a type:0 op1:0 op2:0          ;SUB [0x40],[0x44]       ;[0x40] = Base3_EBP - 0x2c
0x40dc88 -> Ins:6 type:0 op1:1 op2:1          ;Mov [0x44],1            ;[0x44] = 1
0x40dc98 -> Ins:7 type:0 op1:0 op2:1          ;Mov ptr [0x40],[0x44]   ;*[0x40] = [0x44],  1->OK, CRC->Error ; Base3_EBP - 0x2c ->OK, Base8_EAX - *(Base2_ESI+0x0c)) -> Crash

Next1:
0x40dca8 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40dcb8 -> Ins:8 type:0 op1:1 op2:0          ;Mov [0x44],ptr [0x40]
0x40dcc8 -> Ins:3 type:0 op1:2 op2:1          ;Mov Base2_ESI,[0x44]    ;Base2_ESI = *Base4_ESP

0x40dcd8 -> Ins:4 type:0 op1:0 op2:4          ;Mov [0x40],Base4_ESP
0x40dce8 -> Ins:6 type:0 op1:1 op2:4          ;Mov [0x44],4
0x40dcf8 -> Ins:9 type:0 op1:0 op2:0          ;Add [0x40],[0x44]
0x40dd08 -> Ins:3 type:0 op1:4 op2:0          ;Mov Base4_ESP,[0x40]    ;Base4_ESP += 4

0x40dd18 -> Ins:2 type:0 op1:0 op2:0          ;Restore_Flag_60_To_0
问题一解决方案、
检测固定CRC值
VM指令修改
0x40dc18 -> Ins:4 type:0 op1:0 op2:8          ;Mov [0x40],Base8_EAX   
---------->     6      0     0     2c09709d                           ;Mov [0x40],0x2c09709d
文件修改
c418 04 -> 06
c420 00 00 00 00 -> 9d 70 09 2c

问题二解决方案、
只检验word长度,0x10016->0x16
VM指令修改
0x40d700 -> Ins:10 type:0 op1:0 op2:0         ;SubEx [0x40],[0x44]
---------->     10      1     0     0
文件修改
bf02 00 -> 01

也许出题者的思路是要求答题者更正CRC算法,但对答题者来说,修改CRC算法部分的VM指令和修改CRC校验部分的VM指令,本质上是一样的,都满足此题目要求。