- 纯手工打造:
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指令,本质上是一样的,都满足此题目要求。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法