论坛帮助 |
社区圈子 |
日历事件 |
2005-10-05, 01:28 | #1 | ||
|
|||
见习会员
等级: 小兄弟
|
-------------------------------------------------------------------------------- 上次来上网下载了FLY大侠的Ultra Protect的脱壳文章 回去后,就碰到了一个PEID检查为UltraProtect 1.x的软件。 本着提高技术的想法,决定先不看fly的文章,自己脱。 载入运行后,过了一个异常后(后面发现有时是两个),到了一个INT3指令,再下去程序就挂了。在异常处理处设断,F8跟进,进入了系统 空间,执行到一条sysener指令(我在网吧,记得不是很清楚。大约是这个样子,从来没见过,跳过去程序就退了)。 用ESP定律,不行。 自己单步跟,过了百把个CALL,全部是变形的JMP,手误一个程序就去退出的 指令处(我连续错了三次),到了一个很像OEP的地方,用插件DUMP,运行, 提示不是有效的文件,重新运行程序,用ImportREC v1.42填入跟到的OEP,提示不是,改用v1.6拿到了输入函数,修复DUMP程序,运行还是提示不是有效的文件,LoadPE重建也不行,改用LoadPE去DUMP FULL,再修复,这次是运行就出错误框。 看了FLY大侠的文章,决定从ESP定律再次入手 程序载入PUSHAD指令后下硬件访问断点, 到达INT3中断处时,看到接有一个PUSHAD指令 F8过了INT3,PUSHAD,再根据ESP,又下了一个硬件断点 F9,中断,取消第二个断点, F9,断到了一个长得也很像OEP的地址,ImportREC填入地址,提示这就是OEP 但取道了两个函数,还是无效的,OD里再运行,又断在一个地方,下个指令是 一个RET指令,F9进,到了一个地方也很像OEP。ImportREC填入地址,提示这就是OEP,但取道了四个函数,也是无效的,(三种追踪全试过也无用) 本来还要试一试,用第一个OEP得到的输入表去修复其他OEP DUMP的程序. 但是要确定OEP的位置在我看来没有别的技巧,只有不断调试寻找,基本上调试多了就会知道那里是OEP。 OEP一般有以下特征,基本上C++编写的OEP处会这样: 0040224E > 55 push ebp 0040224F 8BEC mov ebp,esp 00402251 6A FF push -1 00402253 68 08394000 push unpacked.00403908 00402258 68 D4234000 push <jmp.&msvcrt._except_handler3> 0040225D 64:A1 00000000 mov eax,dword ptr fs:[0] 00402263 50 push eax 00402264 64:8925 00000000 mov dword ptr fs:[0],esp VB程序会是这样的: 00403004 > 68 9C334000 push llk.0040339C ; ASCII "VB5!6&*" 00403009 E8 EEFFFFFF call <jmp.&MSVBVM60.ThunRTMain> Delphi程序会是: 恨delphi程序,调试麻烦,总是发送消息!! 总之这个是平日里多积累,慢慢就会有感觉的 |
||