我对壳的分析也是刚学,不敢妄言。
简单看了一下,试试这样能有没有效果:
按照你原来的方法,在idata节上下内存写入断点,F9运行后来到这里:
015CA48C 8366 0C 00 AND DWORD PTR DS:[ESI+C], 0
015CA490 03C2 ADD EAX, EDX
015CA492 8BD8 MOV EBX, EAX
015CA494 56 PUSH ESI
015CA495 57 PUSH EDI
015CA496 50 PUSH EAX
015CA497 8BF3 MOV ESI, EBX
...
往下拉,一直到这里:
015CA63A 53 PUSH EBX
[COLOR="Red"]015CA63B 50 PUSH EAX[/COLOR]
015CA63C E8 8DB2FFFF CALL B.015C58CE
015CA641 8BD8 MOV EBX, EAX
[COLOR="Red"]015CA643 58 POP EAX
015CA644 33C3 XOR EAX, EBX[/COLOR]
015CA646 C606 68 MOV BYTE PTR DS:[ESI], [COLOR="Red"]68[/COLOR]
015CA649 8946 01 MOV DWORD PTR DS:[ESI+1], EAX
015CA64C C746 05 8134240>MOV DWORD PTR DS:[ESI+5], [COLOR="Red"]243481[/COLOR]
015CA653 895E 08 MOV DWORD PTR DS:[ESI+8], EBX
015CA656 C646 0C C3 MOV BYTE PTR DS:[ESI+C], 0C3
015CA65A 5B POP EBX
015CA65B 8BC6 [COLOR="Red"]MOV EAX, ESI[/COLOR]
015CA65D 8385 0BF94000 0>ADD DWORD PTR SS:[EBP+40F90B], 0D
015CA664 5E POP ESI
015CA665 60 PUSHAD
...
这一段是对输入表进行处理的,其中push eax时,eax中就是API的地址。
下面的0x68是push XXXXXXXX的机器码。
也就是说,这一段代码是构造调用原来API的stub代码。(thunk??)
把
015CA644 33C3 XOR EAX, EBX
和
015CA65B 8BC6 MOV EAX, ESI
这两行全部改成nop,貌似就跳过了对导入表的处理了。
剩下的事就是走到OEP,然后用LordPE将其dump出来。
此时再用ImportRec来修复,应该可以修复了。
因为我的Windows XP x64系统,系统带的kernel32.dll和user32.dll等系统模块与32位的系统不一样,缺少很多函数,这些函数都在其它模块中实现了。这就导致ImportRec在我的机器上无法工作,所以我没办法亲自试验一下。抱歉。你先试试,如果还有问题,咱们继续讨论。