①内存镜像法脱壳:
00468000 >POP EBX; //程序入口点。
00468001AND EBX,FFFFFF00
00468007CMP WORD PTR DS:[EBX],5A4D
0046800CJNZ SHORT UnPackMe.00468041
0046800EMOV ESI,EBX
00468010ADD ESI,DWORD PTR DS:[EBX+3C]
第一次:
alt+m
F2在 Section=.rsrc段下断,shif+f9运行,停在下面:
7C9322DDMOV DX,WORD PTR DS:[EAX+C]//停在这里。
7C9322E1MOV WORD PTR SS:[EBP-4C],DX
7C9322E5LEA ESI,DWORD PTR DS:[EAX+10]
第二次: alt+m
F2在 Section=.code段下断,shif+f9运行,停在程序OEP: 0045159C55PUSH EBP ; 程序OEP
0045159D8BECMOV EBP,ESP
0045159F83C4 F0 ADD ESP,-10
004515A2B8 BC134500 MOV EAX,UnPackMe.004513BC
004515A7E8 8846FBFF CALL UnPackMe.00405C34
004515ACA1 E02F4500 MOV EAX,DWORD PTR DS:[452FE0]
004515B18B00MOV EAX,DWORD PTR DS:[EAX]
004515B3E8 F8E5FFFF CALL UnPackMe.0044FBB0
004515B8A1 E02F4500 MOV EAX,DWORD PTR DS:[452FE0]
004515BD8B00MOV EAX,DWORD PTR DS:[EAX]
004515BFBA FC154500 MOV EDX,UnPackMe.004515FC; ASCII "www.52pojie.cn"
004515C4E8 F7E1FFFF CALL UnPackMe.0044F7C0
004515C98B0D C0304500 MOV ECX,DWORD PTR DS:[4530C0]; UnPackMe.00454BD0 DUMP程序, 利用importREC进行修复处理IAT加密: 在OD载入的时候不能进行修复。重新打开一个新的加壳程序,填入OEP,5159C,自动查找,指针全部无效,用等级三修复,完全修复,正常运行。 ②手动处理IAT加密。 在第一处无效指针处记下地址:RAV:5512c,即为地址45512C,下内存写入断点。重新运行程序。 第一次停在这里。没有指针相关的东西,再次F9运行, 00468232300431XOR BYTE PTR DS:[ECX+ESI],AL
00468235C1CA 08 ROR EDX,8
0046823881EA 3B1FE120 SUB EDX,20E11F3B 跳过上面断点后,断在下面: 00468338893C8AMOV DWORD PTR DS:[EDX+ECX*4],EDI ; UnPackMe.00468384 edi给第一个无效指针赋值。EDI不是系统函数,而EAX是。 此时观查寄存器: EAX 7C93135A ntdll.RtlDeleteCriticalSection
ECX 00000000
EDX 0045512C UnPackMe.0045512C
EBX 00400000 ASCII "MZP"
ESP 0012FFB4
EBP 7C800000 kernel32.7C800000
ESI 00455000 UnPackMe.00455000
EDI 00468384 UnPackMe.00468384
再用上面的方法在第二个无效指针地址:455130,下内存写入断点。重新运行程序。
第一次又停在这里。没有指针相关的东西,再次F9运行
00468232300431XOR BYTE PTR DS:[ECX+ESI],AL
00468235C1CA 08 ROR EDX,8
0046823881EA 3B1FE120 SUB EDX,20E11F3B
0046823EF7D0NOT EAX 跳过上面断点后,断在下面: 00468338893C8AMOV DWORD PTR DS:[EDX+ECX*4],EDI; UnPackMe.00468391 edi给第一个无效指针赋值。EDI不是系统函数,而EAX是。 此时观查寄存器: EAX 7C9210E0 ntdll.RtlLeaveCriticalSection
ECX 00000001
EDX 0045512C UnPackMe.0045512C
EBX 00400000 ASCII "MZP"
ESP 0012FFB4
EBP 7C800000 kernel32.7C800000
ESI 00455000 UnPackMe.00455000
EDI 00468391 UnPackMe.00468391
EIP 00468338 UnPackMe.00468338 跟上面的情形一样。所以可以确定,MOV DWORD PTR DS:[EDX+ECX*4],EDI是给IAT加密的。将不是系统指针的EDI改为EAX,试试。 修改后直接用OD插件DUMP后可以正常运行。
|