asprotect的入口点变形
一个程序如果用普通的加壳程序处理之后,脱壳之后的程序应该和原来的程序是一模一样的,压缩壳普遍都是这种情况,但是对于某些加密壳来说有入口点保护的功能,会把你原本程序的入口点的代码改变,同时在其中加入一些垃圾代码,导致你脱壳后的入口点代码和未加壳程序入口点代码是不一样的,但是不影响程序的结果,相当于把你入口点的代码给变形了。某个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