现在我们来保存输入表,下指令
PAGEIN D 40D000 C40 C:TEMPDUMP.BIN
现在再来确定程序真正的Entry Point
1、这里我为了省事,干脆
BD *
禁止所有中断,然后按F5运行程序,重新在SoftICE的Loader中单击Load按钮运行程序,(当然这种方法在对PECompact.exe的脱壳中可以用,其他的就不一定了)又中断在第一条指令。窗口显示如下:015F:0041E800 EB06 JMP 0041E808 (JUMP )015F:0041E802 6800E00100 PUSH 0001E000015F:0041E807 C3 RET==> 0041E808 9C PUSHFD015F:0041E809 60 PUSHAD015F:0041E80A E802000000 CALL 0041E811 (注意了,这里可不是什么过程调用,只是JMP的变形而已)015F:0041E80F 33C0 XOR EAX,EAX015F:0041E811 8BC4 MOV EAX,ESP015F:0041E813 83C004 ADD EAX,04
注意,在Call 0041E811语句处我们要按F8键继续,不然就Over了。这里的Call语句可不是什么真正的过程调用。无非是变相的一种Jmp跳转语句而已。要识别它也不难。看看它跳转的地址是否就在附近。如果是就小心了。按F8键不要按F10键。
好了,转过了一道小小的弯,一路F10下来,还顺风顺水。直到如下015F:0041E860 5F POP EDI015F:0041E861 8DB570804000 LEA ESI,[EBP+00408070]015F:0041E867 B99F030000 MOV ECX,0000039F015F:0041E86C F3A5 REPZ MOVSD015F:0041E86E 5F POP EDI015F:0041E86F C3 RET
到了第一个ret。看!它要跳转了。又一段旅程开始。按F8继续,这一段就要小心一点,直到。
015F:00420121 8BB53E854000 MOV ESI,[EBP+0040853E]015F:00420127 8BBD42854000 MOV EDI,[EBP+00408542]015F:0042012D E82E0A0000 CALL 00420B60015F:00420132 61 POPAD015F:00420133 9D POPFD015F:00420134 50 PUSH EAX015F:00420135 6800E04100 PUSH 0041E000015F:0042013A C20400 RET 0004
又要跳转到41E000了。瞧这里,又要小心了。不要在Call 0041E009语句处按F10哦
015F:0041E000 9C PUSHFD015F:0041E001 60 PUSHAD015F:0041E002 E802000000 CALL 0041E009015F:0041E007 33C0 XOR EAX,EAX015F:0041E009 8BC4 MOV EAX,ESP015F:0041E00B 83C004 ADD EAX,04
一路下来到
015F:0041E092 FFD0 CALL EAX015F:0041E094 FFA59A214000 JMP [EBP+0040219A]015F:0041E09A 61 POPAD015F:0041E09B 9D POPFD015F:0041E09C 6800704100 PUSH 00417000015F:0041E0A1 C3 RET
又要跳到417000了。这里又要小心Call 00417009语句了。
015F:00417000 9C PUSHFD015F:00417001 60 PUSHAD015F:00417002 E802000000 CALL 00417009015F:00417007 33C0 XOR EAX,EAX015F:00417009 8BC4 MOV EAX,ESP015F:0041700B 83C004 ADD EAX,04
一路下来,终于到终点站了。万岁!
015F:00417090 6A00 PUSH 00015F:00417092 FFD0 CALL EAX015F:00417094 FFA59A214000 JMP [EBP+0040219A]015F:0041709A 61 POPAD015F:0041709B 9D POPFD015F:0041709C 6800104000 PUSH 00401000015F:004170A1 C3 RET
程序真正的入口到了。在ret指令处我们下指令:
PAGEIN D 400000 31000 C:TEMPDUMP.EXE
第三步。开始我们的后期修补工作。(Zzzzzz.....Zzzzzz......什么,大家都睡着了,没办法我总不能就此结束吧。咬牙继续写下去。)
1、启动HexWorkShop,打开Dump.exe。用菜单中的Go命令定位到0000D000处。用Select Block命令选择C40个字节,按Del键删除。
然后打到Dump.bin文件,用菜单中的Select Block命令选择C40个字节(用Select All一样)。用Copy命令复制到剪贴板。切换到Dump.exe窗口用菜单中的Paste命令粘贴过来。(注意当前位置是从D000开始的,不要贴错位置哦)
2、启动ProcDump。单击PE Editor打开Dump.exe文件。然后单击Sections,把每个Section中
PSize改成和VSize同样大小,Offset改成和RVA同样大小。按OK确定。
3、然后修改Entry Point为00001000。单击Directory按钮修改其中的Import Table的RVA为0000D000,Size为00000C40,然后保存。
4、该收工吧。看看成果。运行Dump.exe。屏幕显示 "找不到所需的.Dll文件 - JCALG1.DLL"不存在。 (险些晕倒)。
5、再看看,回到HexWorkShop窗口。用菜单中的Go命令定位到00D000处,找到如下位置:
0000D000 0000D0C8 00000000 00000000 0000D4A0 ................0000D010 0000D2B4 0000D1A0 00000000 00000000 ................0000D020 0000D4AD 0000D38C 0000D1CC 00000000 ................0000D030 00000000 0000D4B7 0000D3B8 0000D260 ............`...0000D040 00000000 00000000 0000D4C2 0000D44C ............L...0000D050 0000D284 00000000 00000000 0000D4CF ................0000D060 0000D470 0000D28C 00000000 00000000 p...............0000D070 0000D4DC 0000D478 0000D294 00000000 ....x...........0000D080 00000000 0000D4E9 0000D480 0000D2A4 ................0000D090 00000000 00000000 0000D4F5 0000D490 ................0000D0A0 0000D2AC 00000000 00000000 0000D500 ................0000D0B0 0000D498 00000000 00000000 00000000 ................0000D0C0 00000000 00000000 0000D50A 0000D51A ................0000D0D0 0000D526 0000D538 0000D548 0000D556 &...8...H...V...
6、把从0000D08C开始到0000D0B2之间的字节全部改为00。保存。为什么这样改?因为这之间的字节分成两段,分别对应着输入表中对JCALG1.DLL和aplib.dll的引入。
0000D2A4 00000000 00000000 0000D4F5 0000D4900000D2AC 00000000 00000000 0000D500 0000D498
7、运行,Ok!
附:
我写了个ProcDump的Script如下,可以省略大部分步骤。现在简要说明一下。
运行ProcDump。用Script脱壳出文件Dump.exe,然后按修补工作中的第3-5步修改即可。不过第5步时定位到0000C600字节处。因为ProcDump脱壳出的Dump.exe文件头只有600个字节,而内存中文件头要占1000个字节。所以可以得到VA=D000-1000-600=C600字节。[5'My ONE PECompact v1.34]L1=OBJRL2=LOOK 60L3=BPL4=OBJRL5=LOOK C3L6=BPL7=WALKL8=OBJRL9=LOOK EB,14LA=BPLB=WALKLC=OBJRLD=LOOK C2,04,00LE=BPLF=WALKL10=OBJRL11=LOOK C3L12=BPL13=WALKL14=OBJRL15=LOOK 68,??,??,??,??,C3L16=BPL17=STEPOPTL1=00000000OPTL2=01010001OPTL3=01010001OPTL4=00030000OPTL5=00000000