没有发现什么难的啊!简单写下步骤
0046B060 > 90 nop //OD载入
0046B061 90 nop
0046B062 60 pushad
0046B063 E8 00000000 call UnPackMe.0046B068 //在此执行ESP定律
0046B068 5D pop ebp
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046B7DF 50 push eax //ESP定律后程序停在这里
0046B7E0 33C0 xor eax,eax
0046B7E2 64:FF30 push dword ptr fs:[eax]
0046B7E5 64:8920 mov dword ptr fs:[eax],esp
0046B7E8 EB 01 jmp short UnPackMe.0046B7EB //单步F8走过这个JMP
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046B7EB 0000 add byte ptr ds:[eax],al //停在这里一串空代码,注意堆栈窗口
0046B7ED 0000 add byte ptr ds:[eax],al
0046B7EF 0000 add byte ptr ds:[eax],al
0046B7F1 0000 add byte ptr ds:[eax],al
━━━━━━━堆栈窗口━━━━━━━━━━━━━━
0012FFBC 0012FFE0 指针到下一个 SEH 记录
0012FFC0 0046B78E SE 句柄 //SE句柄处,右键数据窗口跟随
0012FFC4 7C816FD7 返回到 kernel32.7C816FD7
0012FFC8 7C930738 ntdll.7C930738
0012FFCC FFFFFFFF
━━━━━━━数据窗口━━━━━━━━━━━━━━
0046B78E 57EC8B55 //右键断点---内存访问
0046B792 8B10458B //下好断,shift+f9运行
0046B796 0000C4B8
0046B79A 3337FF00
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046B78E 55 push ebp //程序停在这里
0046B78F 8BEC mov ebp,esp //取消内存断点,F8单步向下走
0046B791 57 push edi
0046B792 8B45 10 mov eax,dword ptr ss:[ebp+10]
0046B795 8BB8 C4000000 mov edi,dword ptr ds:[eax+C4]
0046B79B FF37 push dword ptr ds:[edi]
0046B79D 33FF xor edi,edi
0046B79F 64:8F07 pop dword ptr fs:[edi]
0046B7A2 8380 C4000000 0>add dword ptr ds:[eax+C4],8
0046B7A9 8BB8 A4000000 mov edi,dword ptr ds:[eax+A4]
0046B7AF C1C7 07 rol edi,7
0046B7B2 89B8 B8000000 mov dword ptr ds:[eax+B8],edi //走到这里时注意EDI里的值就是我们的OEP
0046B7B8 B8 00000000 mov eax,0 //CTRL+G输入EDI的值004271B0
0046B7BD 5F pop edi
0046B7BE C9 leave
0046B7BF C3 retn
━━━━━━━━━━━━━━━━━━━━━━━━━━
004271B0 55 push ebp //F2下断,SHIFT+F9运行
004271B1 8BEC mov ebp,esp //运行importRCE把程序修复,修复时无效指针用等级1就可以解决
004271B3 6A FF push -1 //直接importRCE把程序DUMP,修复即可
004271B5 68 600E4500 push UnPackMe.00450E60
004271BA 68 C8924200 push UnPackMe.004292C8
004271BF 64:A1 00000000 mov eax,dword ptr fs:[0]
004271C5 50 push eax
IAT加密指令是这个
0046B66C 8932 mov dword ptr ds:[edx],esi
这句NOP掉就可以啦!
[ 本帖最后由 小生我怕怕 于 2008-12-28 17:35 编辑 ] |