004254C9 55 push ebp
004254CA 8BEC mov ebp,esp
004254CC 83EC 44 sub esp,44
脱ACProtected的壳的过程:
当拿到它的时候,用PEID查壳UltraProtect 1.x -> RISCO Software ,用OD载入后,运行后,记事本直接打开,然后重新开始,右键 分析代码 ,shift + F9 运行,
当停止后,在堆栈窗口找到 SE处理程序,右键 在数据窗口处跟随 ,选中数据窗口前四个数据,下内存访问,shift + F9,当停止时,删除分析的部分,取消所有断点,shift + F9运行,接着来到一个程序的运行领空,F8来到RET, 因为除了 BC++,
汇编的程序外,其他程序的入口都是 PUSH EBP; 在调试那选中设置条件-->命令是一个选上。。打入 PUSH EBP 。。 然后就是 跟踪步入。。耐心==吧。。
当程序再次停下来后,004254C9 55 push ebp
004254CA 8BEC mov ebp, esp
004254CC 83EC 44 sub esp, 44
你会看到它,可以知道他站6个字节。。 也就是说 Stole code ,偷取了六个字节,选中他们,用二进制复制一下, ALT + M 打开内存镜像, 在.Text 处下段,运行后来到
004010D0 /70 4B jo short 0040111D
004010D2 |0100 add dword ptr [eax], eax
004010D4 |0000 add byte ptr [eax], al
004010D6 |0100 add dword ptr [eax], eax
004010D8 |0000 add byte ptr [eax], al
004010DA |0100 add dword ptr [eax], eax
004010DC |0000 add byte ptr [eax], al
004010DE |0100 add dword ptr [eax], eax
004010E0 |0000 add byte ptr [eax], al
004010E2 |0100 add dword ptr [eax], eax
004010E4 |0000 add byte ptr [eax], al
004010E6 |0100 add dword ptr [eax], eax
004010E8 |0000 add byte ptr [eax], al
004010EA |0100 add dword ptr [eax], eax
004010EC |0000 add byte ptr [eax], al
004010EE |0100 add dword ptr [eax], eax
004010F0 |0000 add byte ptr [eax], al
004010F2 |0100 add dword ptr [eax], eax
004010F4 |0000 add byte ptr [eax], al
004010F6 |0100 add dword ptr [eax], eax
004010F8 |0000 add byte ptr [eax], al
004010FA |EB 12 jmp short 0040110E
004010FC |3C 20 cmp al, 20
004010FE |7E 0E jle short 0040110E
00401100 |56 push esi //看到了吗??向上数六字节,
用nop填充 也就是 004010FA ---004010FE ,将前面的那个入口用二进制复制后粘到这,最后重新建一下 EIP
00401101 |FF15 F4644000 call dword ptr [4064F4] ; UltraPro.0040D4C6
最后用 LORDEPE 纠正一下,用 ImportREC 修复;
修复时,填入OEP, 回去输入表时,会发现有很多无效指针,可别剪掉和删除,
机器好的可以用 修复等级三,,还可以用插接 ACProtected(比较快),
修复完成后,会发现还有一个没有处理,别急,双击进入后发现无效指针在 MssageBeep 后,可以断定应该是 MessageBoxExA 了。。确定。。抓取。。
修复。。。运行 OK!!!
就这样搞定了 UltraProtect 1.x -> RISCO Software;;
在调试前,应对OD进行设置:在异常哪,可不要忽略 非法访问内存;