【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教 【调试环境】:WinXP、OllyDbg、PEiD、LordPE、ImportREC
【脱壳过程】:
RLPack是ap0x新出的一款压缩壳,这篇教程以RLPack V1.17完整版自带的iBox.dll演示RLPack加壳的DLL手动脱壳。 RLPack加壳的eXe脱壳方法可以参看我以前写的脚本
引用: RLPack.Basic.Edition.V1.0b-V1.17+Full.Edition.V1.16-V1.17.UnPacK.Script http://www.unpack.cn/viewthread.php?tid=9965 值得一提的是,RLPack V1.18越来越像RLProtect,其Code Splicing和Import Elimination是很多的
设置OllyDbg暂停在WinMain,忽略所有异常选项,开始吧 _____________________________________________________________ 一.OEP
通常压缩壳加壳的DLL找OEP是比较简单的 DLL卸载时会再次从EP处运行,几个跳转后就会到OEP了
0094BEA0 807C24 08 01 cmp byte ptr ss:[esp+8],1 //进入OllyDBG后暂停在EP 0094BEA5 0F85 7E010000 jnz 0094C029 //这里在DLL卸载时会跳转,就是去OEP的捷径了
0094C029 E9 BE3AFAFF jmp 008EFAEC //这里就是跳OEP了
_____________________________________________ 二.输入表
RLPack V1.1X Full Edition加壳exe文件会加密某些输入表,而加壳DLL则很少加密输入表的 BP GetProcAddress Shift+F9,中断后取消断点,Alt+F9返回
0094BF57 56 push esi 0094BF58 FF95 E3090000 call near dword ptr ss:[ebp+9E3] ; kernel32.LoadLibraryA 0094BF5E 8985 4E0A0000 mov dword ptr ss:[ebp+A4E],eax 0094BF64 85C0 test eax,eax 0094BF66 0F84 C2000000 je 0094C02E 0094BF6C 8BC6 mov eax,esi 0094BF6E EB 5F jmp short 0094BFCF 0094BF70 8B85 520A0000 mov eax,dword ptr ss:[ebp+A52] 0094BF76 8B00 mov eax,dword ptr ds:[eax] 0094BF78 A9 00000080 test eax,80000000 0094BF7D 74 14 je short 0094BF93 0094BF7F 35 00000080 xor eax,80000000 0094BF84 50 push eax 0094BF85 8B85 520A0000 mov eax,dword ptr ss:[ebp+A52] 0094BF8B C700 20202000 mov dword ptr ds:[eax],202020 ; UNICODE " Hercegovina" 0094BF91 EB 06 jmp short 0094BF99 0094BF93 FFB5 520A0000 push dword ptr ss:[ebp+A52] 0094BF99 FFB5 4E0A0000 push dword ptr ss:[ebp+A4E] 0094BF9F FF95 E7090000 call near dword ptr ss:[ebp+9E7] ; kernel32.GetProcAddress 0094BFA5 85C0 test eax,eax //返回这里 0094BFA7 0F84 81000000 je 0094C02E 0094BFAD 8907 mov dword ptr ds:[edi],eax ; ntdll.RtlDeleteCriticalSection //填充系统函数地址 //EDI=008F3154 注意观察这个地址 0094BFAF 83C7 04 add edi,4 0094BFB2 8B85 520A0000 mov eax,dword ptr ss:[ebp+A52] 0094BFB8 EB 01 jmp short 0094BFBB 0094BFBA 40 inc eax 0094BFBB 8038 00 cmp byte ptr ds:[eax],0 0094BFBE 75 FA jnz short 0094BFBA 0094BFC0 40 inc eax 0094BFC1 8985 520A0000 mov dword ptr ss:[ebp+A52],eax 0094BFC7 66:8178 02 0080 cmp word ptr ds:[eax+2],8000 0094BFCD 74 A1 je short 0094BF70 0094BFCF 8038 00 cmp byte ptr ds:[eax],0 0094BFD2 75 9C jnz short 0094BF70 0094BFD4 EB 01 jmp short 0094BFD7 0094BFD6 46 inc esi 0094BFD7 803E 00 cmp byte ptr ds:[esi],0 0094BFDA 75 FA jnz short 0094BFD6 0094BFDC 46 inc esi 0094BFDD 40 inc eax 0094BFDE 8B38 mov edi,dword ptr ds:[eax] 0094BFE0 E8 4B000000 call 0094C030 0094BFE5 83C0 04 add eax,4 0094BFE8 8985 520A0000 mov dword ptr ss:[ebp+A52],eax 0094BFEE 803E 01 cmp byte ptr ds:[esi],1 0094BFF1 0F85 60FFFFFF jnz 0094BF57 //循环处理输入表
现在来手动确定输入表的RVA和Size 在左下角的数据窗口Ctrl+G:008F3154,点右键->Long->Address 008F3150 00000000 008F3154 7C93188A ntdll.RtlDeleteCriticalSection 008F3158 7C9210ED ntdll.RtlLeaveCriticalSection …… 008F37E0 7D610EC0 shell32.ShellExecuteA 008F37E4 00000000 008F37E8 76337CD8 008F37EC 7632311E 008F37F0 00000000
输入表开始RVA=008F3154-00870000=00083154 输入表Size=008F37F0-008F3154=0000069C
1 2 下一页 |