【脱壳作者】 CCDebuger
【使用工具】 OllyDBG 1.10,PE Tools 1.5,ImportREC 1.6 修正版
【脱壳平台】 WinXP_SP2
【实例下载】 http://www.un4seen.co.uk/files/xmplay33.zip
【文件大小】 322.6k
【软件简介】 XMPlay 是一款小巧玲珑的音频播放器,支持多种音频格式。
1、流媒体格式:OGG/MP3/MP2/MP1/WMA/WAV;
2、Module(指令模块)格式:MO3/IT/XM/S3M/MTM/MOD/UMX;
3、播放清单:PLS/M3U/ASX;
4、其它格式:除了上述内置支持的格式外,通过使用 Winamp 的输入插件,XMPlay 能播放所有 Winamp 所支持的音频文件。
  XMPlay 支持定制外观和插件,外观和插件均可从其主页插件下载或自己制作(其主页上有制作教材)。通过插件,XMPlay 能直接播放压缩包中的音频文件(包括 rar、arj、lzh、zip、pp……等压缩格式)及其它一些音频格式。
  XMPlay 支持拖放文件进行播放或添加到清单(这取决于你的设置);有完整的快捷键系统,另外,还可定义全局热键——你随时都能进行播放控制;内置几个可视化效果——频谱和 3D 频谱,MOD 图表显示;还支持文件格式转换。3.2 版起,增加了媒体库功能。
  XMPlay 还有一些绝活:能够实现选曲(或称编程)播放——在播放清单中右键点击曲目标题,选择加入队列;实现记忆播放——右键点击“关闭”按钮……
【作者声明】 只是感兴趣,不当之处还请各位大侠指教!
--------------------------------------------------------------------------------
【脱壳过程】


今天脱这个东西,里面有十几个 PEtite 2.2 加壳的 DLL 文件(从官方网站上下的压缩包里只有3个DLL,我这里的十几个DLL都是其它插件,也可以在官方网站下载),开始想找看雪兄的那个工具来修复重定位表的,可遍寻都未找到。没办法,就算用 fly 介绍的 ReloX 来手工修改这么多文件的重定位表也会死人的。看 PE Tools 1.5 里带了个修复重定位表的插件,试用了一下,哈哈,真是一个爽啊。不敢独享,特记下来给象我这样的壳盲参考。这里我所使用的工具都是我自己汉化的版本,如有些名词给你造成误解还望原谅!我这篇文章是写给象我这样的壳盲看的,高手要看的话,请先保护好你的大牙!不多说了,下面开始:
我们从官方网站下载的原始压缩包中选一个 xmp-wma.dll 来测试一下。用 OllyDBG 载入,会有一个请求载入 DLL 文件的对话框,问是否用 LOADDLL.EXE 载入,我们选“是”。稍等一会又出来一个入口点警告的对话框,点“确定”,接着又有个询问是否为压缩代码,是否需要分析的对话框,这里我们选“否”。进入程序,我们停在这:

10017039 >  B8 00700110     MOV EAX,xmp-wma.10017000                 ; 开始停在这
1001703E    68 00500110     PUSH xmp-wma.10015000
10017043    64:FF35 0000000>PUSH DWORD PTR FS:[0]
1001704A    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
10017051    66:9C           PUSHFW
10017053    60              PUSHAD
10017054    50              PUSH EAX

不要管它,直接 F9 运行(在我这跳出一个异常对话框,不管它,点确定,SHIFT+F9继续运行),稍后 OllyDBG 的左下角会显示“要调试的 DLL 初始化结束”,我们暂停在这里:

10001000  /$  55            PUSH EBP                                 ;  停在这里
10001001  |.  8BEC          MOV EBP,ESP
10001003  |.  83EC 20       SUB ESP,20
10001006  |.  53            PUSH EBX
10001007  |.  56            PUSH ESI
10001008  |.  8BF1          MOV ESI,ECX
1000100A  |.  33DB          XOR EBX,EBX
1000100C  |.  57            PUSH EDI
1000100D  |.  8B46 0C       MOV EAX,DWORD PTR DS:[ESI+C]


现在继续不管,还是在 OllyDBG 中 F9 运行,再用鼠标左键点击任务栏那的绿色的 LOADDLL.EXE 的图标,出来一个小窗口,点关闭图标关掉它,我们将在 OllyDBG 中停在这里:

10017039 > $- E9 08B5FFFF   JMP xmp-wma.10012546                     ;  停在这里,跳转目标就是OEP
1001703E   $- E9 84307F6C   JMP kernel32.WideCharToMultiByte
10017043   $- E9 75297F6C   JMP kernel32.LocalAlloc
10017048   $- E9 79BA7F6C   JMP kernel32.GetSystemInfo
1001704D   $- E9 24A47F6C   JMP kernel32.DisableThreadLibraryCalls
10017052   $- E9 CEA57E6C   JMP kernel32.DeviceIoControl
10017057   $- E9 5B81806C   JMP kernel32.GlobalMemoryStatus
1001705C   $- E9 4C38D067   JMP USER32.wsprintfA
10017061   $- E9 C65F9966   JMP ole32.CoTaskMemFree

大家可以注意看一下,和刚开始进入的地址是不是一样啊?呵呵。这时按一下 F8 单步一下,来到这里:

10012546  /.  55            PUSH EBP                                 ;  OEP,可直接用插件  OllyDump 脱壳
10012547  |.  8BEC          MOV EBP,ESP
10012549  |.  53            PUSH EBX
1001254A  |.  8B5D 08       MOV EBX,DWORD PTR SS:[EBP+8]
1001254D  |.  56            PUSH ESI
1001254E  |.  8B75 0C       MOV ESI,DWORD PTR SS:[EBP+C]
10012551  |.  57            PUSH EDI
10012552  |.  8B7D 10       MOV EDI,DWORD PTR SS:[EBP+10]


这里找 OEP 的方法是利用了 DLL 退出时会再次中断在EP处的原理,记得 fly 曾经说过。如果你和我一样用的是 OllyDump v3.00.110 版的插件的话,这个 DLL 脱出来后都不需修复输入表。如果不是的话,修复也很简单:
用插件脱壳后先不要关 OllyDBG ,继续让 OllyDBG 暂停在上面 10012546 地址处,启动 ImportREC_fix.exe,在进程列表中选择 loaddll.exe,再点后面的“选取 DLL”按钮,选择 xmp-wma.dll 后按确定,把选项中的“使用来自磁盘的 PE 文件头”选项去掉,“重建原始 FT”选项勾上,在OEP中填12546,点“自动查找 IAT”按钮,出来一个对话框,点“确定”,再点“获取输入表按钮”,会有一些函数无效。点“显示无效的”按钮,在无效函数上右击,选“跟踪级别 1 (反汇编)”菜单,这时所有无效函数都已修复,现在点“修复转存文件”按钮把你刚才脱出来的文件修复一下就可以了。

到此为止我们的脱壳工作已告一段落,剩下的就是修复重定位表的问题了。现在我们打开 PE Tools 1.5,点菜单 插件->Reloc 重建器,选择我们刚才脱壳后的文件,点“重建”按钮,OK,完工!测试一下,一切正常!到此可再用 PE Tools 优化一下文件,减小一下体积。

--------------------------------------------------------------------------------
【脱壳总结】

这种修复重定位的方法并非完全有效,我在测试精华6中 fly 那篇《用Ollydbg手脱Petite V2.2加壳的DLL》文章中附带的例子程序时,用 PE Tools 1.5 修复重定位表的话则提示无法修复,不过前面找OEP的方法倒是通用。写这篇文章主要是希望大家在修复DLL的重定位表时多一种选择而已,希望能给象我这样的壳盲提供一点参考!

--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!