【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教
【调试环境】:WinXP、OllyDbg、PEiD、LordPE、ImportREC
【脱壳过程】:
RLPack是ap0x新出的一款压缩壳,这篇教程以RLPack V1.17完整版自带的iBox.dll演示RLPack加壳的DLL手动脱壳。
RLPack加壳的eXe脱壳方法可以参看我以前写的脚本
值得一提的是,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] 下一页