兄弟说有个二次加密的软件需求处理,PEID看一下是EXECryptor 2.X的,论坛上说EXECryptor 2.X无KEY能够脱去的,所以参阅了有关文章后写出了进程。 一、越过输入表加密:
EXECryptor专用OD或advancedolly插件设置ANTI-DEBUG后再载入原程序:
0055F2AA E8 EBFEFFFF CALL KeyGen.0055F19A ; 载入后停在这儿
0055F2AF 05 25180000 ADD EAX,1825
0055F2B4 FFE0 JMP NEAR EAX
0055F2B6 E8 04000000 CALL keygen.0055F2BF
0055F2BB FFFF ??? ; Unknown command
0055F2BD FFFF ??? ; Unknown command
0055F2BF 5E POP ESI
0055F2C0 C3 RETN
ALT+B翻开断点检查窗口,发现体系主动设置了一个断点One-shot,删去断点。
Breakpoints, item 0
Address=0055F29E keygen.
Module=keygen
Active=One-shot
Disassembly=CALL keygen.0055F19A
ALT+M翻开内存镜像,CODE段F2下断,SHIFT+F9运转:
0055C660 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>; 停在这儿,
0055C662 31DB XOR EBX,EBX
0055C664 5E POP ESI
0055C665 ^ EB 9D JMP SHORT keygen.0055C604
0055C667 89F0 MOV EAX,ESI
0055C669 5B POP EBX
CTRL+N翻开导入表,右击GetProcAddress,在导入表中跟从,双击:
0055F0C2 FF15 BC804D00 CALL NEAR DWORD PTR DS:[<&kernel32.GetPr>; 来到这儿,下硬件履行断点
0055F0C8 09C0 OR EAX,EAX
0055F0CA 0F84 0D000000 JE keygen.0055F0DD
0055F0D0 8907 MOV DWORD PTR DS:[EDI],EAX
0055F0D2 8345 F4 04 ADD DWORD PTR SS:[EBP-C],4
0055F0D6 ^ E9 A6FFFFFF JMP keygen.0055F081
0055F0DB 0000 ADD BYTE PTR DS:[EAX],AL
0055F0DD 53 PUSH EBX
0055F0DE 89D8 MOV EAX,EBX
0055F0E0 E8 09000000 CALL keygen.0055F0EE
0055F0E5 5B POP EBX
0055F0E6 5F POP EDI
0055F0E7 5E POP ESI
0055F0E8 8BE5 MOV ESP,EBP
0055F0EA 5D POP EBP
0055F0EB C3 RETN
CTRL+F2从头载入原程序,ALT+B翻开断点检查窗口,删去断点后F9,断在硬件履行断点处,撤销硬件履行断点,F4到0055F0E5:
0055F0C2 FF15 BC804D00 CALL NEAR DWORD PTR DS:[<&kernel32.GetPr>; 来到这儿,下硬件履行断点
0055F0C8 09C0 OR EAX,EAX
0055F0CA 0F84 0D000000 JE keygen.0055F0DD
0055F0D0 8907 MOV DWORD PTR DS:[EDI],EAX
0055F0D2 8345 F4 04 ADD DWORD PTR SS:[EBP-C],4
0055F0D6 ^ E9 A6FFFFFF JMP keygen.0055F081
0055F0DB 0000 ADD BYTE PTR DS:[EAX],AL
0055F0DD 53 PUSH EBX
0055F0DE 89D8 MOV EAX,EBX
0055F0E0 E8 09000000 CALL keygen.0055F0EE
0055F0E5 5B POP EBX ; 走到这儿后IAT就填充结束了,在这儿F4
0055F0E6 5F POP EDI
0055F0E7 5E POP ESI
0055F0E8 8BE5 MOV ESP,EBP
0055F0EA 5D POP EBP
0055F0EB C3 RETN
F4下来后咱们就能够转储了,为了测验IAT是不是完好,咱们CTRL+B,查找FF 25,在内存地址中能够看到完好的IAT表,关于转储,这儿要讲一下,我起先用LOADPE转储,竟然发现IAT表中有三个函数丢掉,后来换用PETools就能完结的得到IAT表。不知是何原因。
LOADPE转储的:
…
00470228 77DA7883 advapi32.RegQueryValueExA
0047022C 77DA761B advapi32.RegOpenKeyExA
00470230 77DA6BF0 advapi32.RegCloseKey
00470234 00000000
00470238 770F4850 //这个没了
0047023C 7711C99D //这个没了
00470240 770F4B59 //这个也没了
00470244 00000000
00470248 >7C809BF5 kernel32.TlsSetValue
0047024C >7C809750 kernel32.TlsGetValue
00470250 >7C8099BD kernel32.LocalAlloc
…
PETools转储:
00470228 >77DA7883 advapi32.RegQueryValueExA
0047022C >77DA761B advapi32.RegOpenKeyExA
00470230 >77DA6BF0 advapi32.RegCloseKey
00470234 00000000
00470238 >770F4850 oleaut32.SysFreeString
0047023C >7711C99D oleaut32.SysReAllocStringLen
00470240 >770F4B59 oleaut32.SysAllocStringLen
00470244 00000000
00470248 >7C809BF5 kernel32.TlsSetValue
0047024C >7C809750 kernel32.TlsGetValue
00470250 >7C8099BD kernel32.LocalAlloc
二、寻觅OEP
从区段中的BBS区段能够判别该程序应该为DELHI程序,那就依据这个言语的特色找寻OEP。
用WINHEX载入转储的文件DUMP.EXE程序,查找文本“runtime”:
00446544 E1 E3 00 E4 E5 8D 40 00 52 75 6E 74 69 6D 65 20 徙.溴?.Runtime
00446560 65 72 72 6F 72 20 20 20 20 20 61 74 20 30 30 30 error at 000
向上查找近来的十六进制数字“55 8B EC”:
0006C760 55 8B EC 83 C4 F0 B8 78 C4 46 00 E8 74 A1 F9 FF U??鸶x钠.梏※
0006C770 A1 E4 EC 46 00 8B 00 E8 88 C1 FE FF A1 E4 EC 46 ′炱.??窿?潇F
所以,OEP为0046C760。
更改转储后的程序的OEP为004C760即可。
0046C760 > $ 55 PUSH EBP ; OEP
0046C761 . 8BEC MOV EBP,ESP
0046C763 . 83C4 F0 ADD ESP,-10
0046C766 . B8 78C44600 MOV EAX,复件_dum.0046C478
0046C76B . E8 74A1F9FF CALL 复件_dum.004068E4
0046C770 . A1 E4EC4600 MOV EAX,DWORD PTR DS:[46ECE4]
0046C775 . 8B00 MOV EAX,DWORD PTR DS:[EAX]
这时程序现已能够正常运转。因为没有OEP被偷,这个脱壳进程比较简单。
关于用lord-PE把数据目录(Directories)中TLS表的回调表VA一项置0,然后保留,我试了下,这样修正后用OD载入脱壳后的程序能够直接停在OEP处,而且断点表中没有断点。而没有清0则停在壳的EP处,并主动设置一个断点,也即是说,这个项的效果即是在壳的EP处主动做个断点。咱们能够看看那个回调地址为004D813C,OD中CTRL+G到004D813C:
004D813C AA STOS BYTE PTR ES:[EDI] ; 这儿即是回调地址,内存中的值正好是壳的OEP值
效果即是使这个地址比ep先取得履行权(不包括98)。
|