【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg V1.10、LordPE、ImportREC、ReloX
【实例下载】:点击下载
—————————————————————————————————
【脱壳过程】:
Petite也加密了重定位表,写这篇简单的笔记只是再次推荐一下用ReloX来修复重定位表。
—————————————————————————————————
一、EP和OEP
设置Ollydbg忽略所有的异常选项,载入Petite加壳的EdrLib.dll。
003D7042 B8 00703D00 mov eax,EdrLib.003D7000
//进入Ollydbg后暂停在这
003D7047 68 0E493D00 push EdrLib.003D490E
003D704C 64:FF35 00000000 push dword ptr fs:[0]
003D7053 64:8925 00000000 mov dword ptr fs:[0],esp
Petite加壳程序的OEP非常好找,在EP处下断:HE EIP
如果不想脱壳后修改基址,可以在适当的时机Dump。
下断:BP GetProcAddress
中断后取消断点,Alt+F9返回
003D4AC4 FF95 94070000 call dword ptr ss:[ebp+794]; kernel32.GetProcAddress
003D4ACA 85C0 test eax,eax ; kernel32.lstrlenW
//返回这里
003D4ACC 74 7F je short EdrLib.003D4B4D
//下面的循环是处理输入表的
Ctrl+S 在当前位置下搜索命令序列:
mov edi,ecx
mov edx,ebp
mov eax,dword ptr ds:[ecx]
test eax,eax
找到在003D4C60处,直接F4至003D4C5A
003D4C54 8DB5 0000C0FF lea esi,dword ptr ss:[ebp+FFC00000]
003D4C5A 8D8D 00600000 lea ecx,dword ptr ss:[ebp+6000]
//这里[ebp+6000]的6000是原来重定位表的RVA
003D4C60 8BF9 mov edi,ecx
003D4C62 8BD5 mov edx,ebp
003D4C64 8B01 mov eax,dword ptr ds:[ecx]
003D4C66 85C0 test eax,eax
003D4C68 74 1B je short EdrLib.003D4C85
003D4C6A 3C FF cmp al,0FF
003D4C6C 75 0B jnz short EdrLib.003D4C79
此时输入表已经处理完毕,程序还没有进行重定位,运行LordPE完全Dump出这个dll。
F9运行,中断在刚开始下的硬件断点处:
003D7042 E9 82A1FFFF jmp EdrLib.003D11C9
//飞向光明之点巅!
003D11C9 55 push ebp
//OEP ^O^
003D11CA 8BEC mov ebp,esp
003D11CC 53 push ebx
003D11CD 8B5D 08 mov ebx,dword ptr ss:[ebp+8]
—————————————————————————————————
二、输入表
随便从程序找一个API调用,如:
003D10FD FF15 20403D00 call dword ptr ds:[3D4020]; kernel32.GetVersion
在转存中跟随3D4020,上下看到许多函数地址,很明显的可以找到IAT开始和结束的地址:
003D3FF0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
003D4000 74 81 EF 77 E8 7C EF 77 49 C4 EF 77 3B D7 EF 77 t侊w鑭飛I娘w;罪w
…… ……
003D40C0 79 70 3D 00 40 7A 95 7C 00 00 00 00 00 00 00 00 yp=.@z晐........
开始地址=003D4000
结束地址=003D40C8
运行ImportREC。注意:去掉“使用来自磁盘的PE部首”的选项,选择“重建原始FT”选项!
选中Ollydbg的loaddll.exe的进程,然后点“选取DLL”,选择EdrLib.dll,填入RVA=00004000、大小=000000C8 ,点“Get Import”,得到输入表,用追踪层次1修复无效函数。改OEP=000011C9,FixDump!
—————————————————————————————————
三、ReloX:修复重定位表的“通用”简便方法
把EdrLib.dll复制一份,然后用DLL_LoadEX载入EdrLib.dll和复制EdrLib.dll,注意两个DLL进程的基址。
用LordPE直接把这2个DLL进程Dump出来,另存为1.dll(ImageBase=01060000)和2.dll(ImageBase=01080000)
运行ReloX,选择1.dll和2.dll,分别填入其相应的基址,点ComPare,稍等,分析完毕。
Fix PE Module,提示dumped_.dll保存成功。ReloX已经自动修正了Relocation RVA和Size!
如果想删除壳区段,则需要挪移输出表数据,具体操作看《用Ollydbg手脱Neolite加壳的DLL》教程。
可以用LordPE或者FileScanner优化一下脱壳后的文件。
测试一下,正常运行,脱壳完成了。
—————————————————————————————————
, _/
/| _.-~/ \_ , 青春都一晌
( /~ / \~-._ |\
`\\ _/ \ ~\ ) 忍把浮名
_-~~~-.) )__/;;,. \_ //'
/'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 换了破解轻狂
`~ _( ,_..--\ ( ,;'' / ~-- /._`\
/~~//' /' `~\ ) /--.._, )_ `~
" `~" " `" /~'`\ `\\~~\
" " "~' ""
UnPacked By : fly
2004-12-27 20:00