htmlnbsp:13.5.1  寻找OEP

当DLL被初次映射到进程地址空间中时系统将DllMain当卸载DLL时也会再次DllMain也就是说DLL文件相比EXE文件运行有些特殊性EXE入口点只在开始时执行而DLL入口点在整个执行过程中至少要执行两次次是在开始时用来对DLL做至少还有次是在退出时用来清理DLL再退出所以DLL找OEP也有两条路可以走是载入时找思路方法是在退出时找而且般来说前种思路方法外壳代码较复杂建议用第 2种思路方法
UPX壳比较简单往下翻翻就可看到跳到OEP代码:
代码:
003DE7F5   .  58              pop     eax 003DE7F6   .  61              popad 003DE7F7   .  8D4424 80       lea     eax, dword ptr [esp-80] 003DE7FB   >  6A 00           push    0 003DE7FD   .  39C4            cmp     esp, eax 003DE7FF   .^ 75 FA           jnz      003DE7FB 003DE801   .  83EC 80         sub     esp, -80 003DE804   >- E9 372AFFFF     jmp     003D1240  //跳到OEP


 
13.5.2 Dump映像文件
 
停在OEP后运行LordPE在进程窗口选择loaddll.exe进程在下方窗口中EdrLib.dll模块上单击右键执行“dump full”菜单命令将文件抓取并保存到文件里如图13.43所示
 

图13.45 抓取DLL内存映像
 
对于DLL文件来说Windows系统没有办法保证每次运行时提供相同基地址如果DLL基址所在内存空间被占用或该区域不够大系统会寻找另个地址空间区域来映射DLL此时外壳将对DLL执行某些重定位操作从图13.43得知此时DLL被映射到内存地址是03D000h和EdrLib.dll默认基址400000h区别被重定位项所指向地方是已经重定位了代码数据
例如这句:
代码:
003D1266     A1 58B43D00        mov     eax, dword ptr [3DB458]


为了得到和加壳前文件必须找到重定位代码跳过它让其不被重定位重新加载DLL对上句重定位地址3D1267h下内存写断点中断几下就可来到重定位处理代码
 
代码:
003DE79E  mov     al,  ptr [edi]              ;指向UPX自己加密过重定位表 003DE7A0  inc     edi                                  ;指针移向下位 003DE7A1  or      eax, eax                            ;EAX=0?结束标志 003DE7A3  je       003DE7C7                003DE7A5  cmp     al, 0EF 003DE7A7  ja       003DE7BA                    003DE7A9  add     ebx, eax                          ;EBX初值为(0xFFC+基址) 003DE7AB  mov     eax, dword ptr [ebx]             ;EBX指向需要重定位数据取出放到EAX 003DE7AD  xchg    ah, al 003DE7AF  rol     eax, 10 003DE7B2  xchg    ah, al 003DE7B4  add     eax, esi                          ; ESI指向UPX0区块VA本例=3D1000 003DE7B6  mov     dword ptr [ebx], eax           ;重定位 003DE7B8  jmp      003DE79C               003DE7BA  and     al, 0F 003DE7BC  shl     eax, 10 003DE7BF  mov     ax, word ptr [edi] 003DE7C2  add     edi, 2 003DE7C5  jmp      003DE7A9             003DE7C7  mov     ebp, dword ptr [esi+E044]        ;改好ESI为401000后按F4到这里


 
UPX壳己将原基址重定位表清零重定位操作时使用其自己重定位表地址3DE7B4h处ESI指向UPX0区块VA本例为3D1000h为了让代码以默认ImageBase值400000h重定位代码可以在这句强制将ESI值改为401000h来到这句后双击ESI寄存器改成401000h然后按F4来到3DE7C7h这时此时代码段数据没被重定位可以Dump了
代码:
003D1253     833D 68AD4000 00     cmp     dword ptr [40AD68], 0


运行LordPE将DLL映像抓取并保存为upx_dumped.dll

  • 篇文章: 13.5.2 Dump映像文件

  • 篇文章: “破壳而出,自由自在”的Jdpack1.01篇
  • Tags:  nbspnbsp nbsp什么意思 nbsp是什么意思 htmlnbsp

    延伸阅读

    最新评论

    发表评论