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
最新评论