一个程序如果用普通的加壳程序处理之后,脱壳之后的程序应该和原来的程序是一模一样的,压缩壳普遍都是这种情况,但是对于某些加密壳来说有入口点保护的功能,会把你原本程序的入口点的代码改变,同时在其中加入一些垃圾代码,导致你脱壳后的入口点代码和未加壳程序入口点代码是不一样的,但是不影响程序的结果,相当于把你入口点的代码给变形了。某个vb程序用asprotect 加壳之后用脚本顺利到达入口点处,我们看下入口点的代码
01140253 68 26AE4500 push 45AE26 ; OEP
01140258 66:9C pushfw
0114025A 52 push edx
0114025B 035424 18 add edx, dword ptr [esp+18]
0114025F C1DA E7 rcr edx, 0E7
01140262 BA BE204600 mov edx, 4620BE
01140267 035424 18 add edx, dword ptr [esp+18] ; 上面是垃圾操作
0114026B 8D5424 52 lea edx, dword ptr [esp+52] ; 这步是对edx的有效操作
0114026F 83EA 52 sub edx, 52 ; edx=esp+52-52=esp
01140272 8D52 14 lea edx, dword ptr [edx+14] ; edx=edx+14
01140275 57 push edi
01140276 51 push ecx
01140277 F3: prefix rep:
01140278 EB 02 jmp short 0114027C
0114027A CD20 81DFCB0D vxdjump DCBDF81
01140280 90 nop
01140281 70 68 jo short 011402EB
01140283 26:09F7 or edi, esi
01140286 42 inc edx
01140287 53 push ebx
01140288 03DF add ebx, edi
0114028A EB 02 jmp short 0114028E
0114028C CD20 81CBDD83 vxdjump 83DDCB81
01140292 ^ E3 A6 jecxz short 0114023A
01140294 3E:EB 02 jmp short 01140299
01140297 CD20 8D5C35AB vxdcall AB355C8D
0114029D 2BDE sub ebx, esi
0114029F 8D5C0C 28 lea ebx, dword ptr [esp+ecx+28]
011402A3 2BD9 sub ebx, ecx
011402A5 8D5C03 D8 lea ebx, dword ptr [ebx+eax-28]
011402A9 2BD8 sub ebx, eax
011402AB 8D5C3B FC lea ebx, dword ptr [ebx+edi-4]
011402AF 83C3 04 add ebx, 4
011402B2 2BDF sub ebx, edi
011402B4 2E:EB 01 jmp short 011402B8
011402B7 - 0F8D 5C0B042B jge 2C180E19
011402BD D968 77 fldcw word ptr [eax+77]
011402C0 804D E6 8F or byte ptr [ebp-1A], 8F
011402C4 035B 33 add ebx, dword ptr [ebx+33]
011402C7 7C 24 jl short 011402ED
011402C9 0833 or byte ptr [ebx], dh
011402CB 7C 24 jl short 011402F1
011402CD 285F 57 sub byte ptr [edi+57], bl
011402D0 33CF xor ecx, edi
011402D2 59 pop ecx
011402D3 83C1 A0 add ecx, -60
011402D6 81C1 E37FB299 add ecx, 99B27FE3
011402DC F7D9 neg ecx
011402DE 87F9 xchg ecx, edi
011402E0 C1C7 01 rol edi, 1
011402E3 47 inc edi
011402E4 2BD7 sub edx, edi ; 这里edx变成了12FFC0的
011402E6 81E1 68CCB6D2 and ecx, D2B6CC68
011402EC 59 pop ecx
011402ED C1CF BF ror edi, 0BF
011402F0 C1CF 5B ror edi, 5B
011402F3 5F pop edi ; edi
011402F4 55 push ebp
011402F5 036C24 38 add ebp, dword ptr [esp+38]
011402F9 83ED 4B sub ebp, 4B
011402FC 8DAC26 EC444300 lea ebp, dword ptr [esi+4344EC] ; EBP=ESI+4344EC
01140303 2BEE sub ebp, esi ; EBP=EBP-ESI=4344EC
01140305 892A mov dword ptr [edx], ebp ; 这步相当于push 004344EC edx啥时候等于12FFC0呢?
01140307 5D pop ebp
01140308 5A pop edx
01140309 66:9D popfw
0114030B E8 0C122CFF call xp.0040151C ; jmp 到 msvbvm60.ThunRTMain
我们都知道VB程序的入口点是push XXXXXX call YYYYYYYY, 这样的。
在0114030B处已经有了call YYYYYYYY了,所以从01140253到01140309之间的代码就相当于执行了push XXXXXX代码的操作。
总结下,某些程序脱壳后的入口点的代码和程序加壳之前的入口点代码可能是不一样的,但是代码执行的最终结果是一样的。
顺便爆下某盗号的收信地址:http://14.102.255.51/wwwroot/user/t101/conn2.asp