脱UPX壳后程序运行无反映, OD跟踪程序异常退出,求助!
这是我第一次发贴,请多指教=。=最近刚刚接触脱壳,学习了几天,决定拿VS对战平台1.9.10练手,(下载地址http://game1.vsa.com.cn/starcraft/jsp/comm/down.html)按照高手的脱壳思路,先查壳,后OD载入找OEP,然后用LORDPE脱壳,用ImportREC修复,但进行完毕后,VS不运行,具体如下:
1、PEID查VS壳:
显示UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo;
2、OD载入:
00584040 >60 PUSHAD
00584041 BE 00205300 MOV ESI,VSClient.00532000
00584046 8DBE 00F0ECFF LEA EDI,DWORD PTR DS:
0058404C 57 PUSH EDI
0058404D 83CD FF OR EBP,FFFFFFFF
00584050 EB 10 JMP SHORT VSClient.00584062
按F8单步一次,ESP值变红,决定用ESP定律脱壳,ESP值为0012FFA4,数据窗口跟随,然后下硬件断点(字)。
按F9运行。出现如下代码:
005841E7 8D4424 80 LEA EAX,DWORD PTR SS:
005841EB 6A 00 PUSH 0
005841ED 39C4 CMP ESP,EAX
005841EF^ 75 FA JNZ SHORT VSClient.005841EB //此处循环
005841F1 83EC 80 SUB ESP,-80//F4运行
005841F4- E9 F1F9F5FF JMP VSClient.004E3BEA//到达OEP
按F8单步会在0058413B和005841EF中间循环,因为每PUSH一下ESP值-4,值到ESP值和EAX相等时他才不再循环,直接在005841F1处按F4断点运行,按F8单步,跳到OEP。
程序如下:
004E3BEA 55 PUSH EBP //各位大大这是OEP吗,我看了好多教程,好象都是到了55 PUSH EBP就是OEP,不是很明白为什么,好象VC++程序都是这样?????
004E3BEB 8BEC MOV EBP,ESP
004E3BED 6A FF PUSH -1
004E3BEF 68 208B4F00 PUSH VSClient.004F8B20
004E3BF4 68 543D4E00 PUSH VSClient.004E3D54 ; JMP 到 MSVCRT._except_handler3
004E3BF9 64:A1 00000000MOV EAX,DWORD PTR FS:
004E3BFF 50 PUSH EAX
004E3C00 64:8925 0000000>MOV DWORD PTR FS:,ESP
004E3C07 83EC 68 SUB ESP,68
004E3C0A 53 PUSH EBX
004E3C0B 56 PUSH ESI
004E3C0C 57 PUSH EDI
004E3C0D 8965 E8 MOV DWORD PTR SS:,ESP
004E3C10 33DB XOR EBX,EBX
004E3C12 895D FC MOV DWORD PTR SS:,EBX
004E3C15 6A 02 PUSH 2
004E3C17 FF15 78245300 CALL DWORD PTR DS: ; MSVCRT.__set_app_type
3、打开LORDPE,发现VSCLIENT。EXE已经存在,纠正IMANGESIZE(发现好多跟没纠正一样,好象没变啊,不知道这步为什么,高手解释下),然后完全脱壳,生成DUMP。EXE。
4、然后打开ImportREC,选择VSCLIENT进程,由于OEP处为004E3BEA,则修改OEP为000E3BEA,(程序入口点好象都是400000吧,高手可以解释下,我接触破解没一个星期。。想找个师傅带我:( )然后IAT自动搜索。
RAV和大小好象可以不改,然后我2种都试了,说下改的吧。
刚OD的程序继续单步进入F7,遇到CALL就进,直到找到kernel32.*****,解释说明为这个的一大串东西,然后找到他的开头,
004E3D94- FF25 6C245300 JMP DWORD PTR DS: ; MSVCRT.__p__commode
004E3D9A- FF25 70245300 JMP DWORD PTR DS: ; MSVCRT.__p__fmode
004E3DA0- FF25 78245300 JMP DWORD PTR DS: ; MSVCRT.__set_app_type
004E3DA6- FF25 74245300 JMP DWORD PTR DS: ; MSVCRT._controlfp
004E3DAC- FF25 84195300 JMP DWORD PTR DS: ; kernel32.GetVersionExA
记下53246C这个值,找到他的最下面
004E4528- FF25 A42A5300 JMP DWORD PTR DS: ; c8SDK.c8SDK_ShowRotatorWindow
004E452E- FF25 B02A5300 JMP DWORD PTR DS: ; c8SDK.c8SDK_Close
004E4534- FF25 00285300 JMP DWORD PTR DS: ; VSFace.?LoadVSFaceBig@@YAPAVCBitmap@@PBD@Z
004E453A- FF25 FC275300 JMP DWORD PTR DS: ; VSFace.?LoadVSFace@@YAPAVCBitmap@@PBD@Z
004E4540- FF25 F8275300 JMP DWORD PTR DS: ; VSFace.?LoadVSManagerFace@@YAPAVCBitmap@@PBD@Z
记下5327F8这个值,这个具体的范围我也不知道对不对,望高手指教,
然后输入RAV值13246C,大小5327F8-53246C=38C,(这个算的大小好象不准,我用他们说的1000得到的输入表会更多,谁能解释下为什么)
然后选择获得输入表,然后修理DUMP,选取刚才的DUMP。EXE,然后修理成功,得到了最后的VS。EXE。
然后我运行就出现了上面说的问题,程序不运行,OD重新载入很多异常发生,最后异常退出,在线等待高手解答!!!!呵呵~~
用PEID查壳显示无壳,但用OD载入,他说入口点超出代码范围,可能是个自解压或自修改文件,好象还是没有脱完壳啊。。不懂。。
[ 本帖最后由 duwangduwa 于 2008-1-5 17:38 编辑 ] VC++程序都是以PUSH EBP
MOVEBP, ESP
开始的,, 在VC里直接看工程的汇编代码就明白了~~ 自校验吧,兄弟,跟下看 自效验???能不能具体说下,我新手不是很明白=。= 看了下程序,应该是自校验的问题, 不过我也没有跟明白(初学脱壳),
在initterm里出现异常..感觉这个函数是VC自己调用的啊。.~
希望高手来解答 有问题。。。。。
[ 本帖最后由 月之精灵 于 2008-1-5 22:30 编辑 ] 我跟踪了004D096C 这个地址,不是 JNZ dumped_.004D1188这段代码。
是不是上面我找的OEP不是真正的OEP,因为我在那下断点,OD警告说你在代码部分外下断点。后面我按照这个OEP脱壳的话,是错误的,因为脱了壳后OD载入,直接就说入口点超出代码范围,可能是个自解压或自修改文件。精灵帮分析下
[ 本帖最后由 duwangduwa 于 2008-1-5 17:38 编辑 ] 为免误人,删了,因为程序运行有问题。对不起各位了,
请不要下载附件,因为程序运行会出现问题
[ 本帖最后由 月之精灵 于 2008-1-5 22:32 编辑 ] 我看了,你给的OEP为004E3B7A >55 PUSH EBP
而我得到的是004E3BEA 55 PUSH EBP
我找了004E3B7A,得到的数据为004E3B7A F0:2353 00 LOCK AND EDX,DWORD PTR DS: ; 不允许锁定前缀
这是为什么。。 我得到的OEP也是004E3B7A >55 PUSH EBP
你得到的那个错了。
页:
[1]
2