• 标 题:用Ollydbg手脱Petite V2.2加壳的DLL
  • 作 者:fly
  • 时 间:2004-12-27,21:44
  • 链 接:http://bbs.pediy.com

【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
             
【调试环境】: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