- UID
- 45135
注册时间2008-2-10
阅读权限20
最后登录1970-1-1
以武会友
TA的每日心情 | 怒 2017-7-19 15:45 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
【脱壳作者】 yayazhi
【作者邮箱】 [email protected]
【使用工具】 Ollyice,LordPE,ImportREC v1.7c,PEiD
【脱壳平台】 WinXP SP2
【脱壳目标】 Armadillo v4.40 加过壳的 Iplocal.dll 文件
【保护选项】 Standard protection only 仅仅标准保护 (单进程)
【加壳方式】 Armadillo v4.40
这个壳迷糊了好长时间,看了unpackcn论坛上N多脱壳教程,今天终于搞定了,写个日记,一是为了勉励自己,作个纪念;二是给像我这样的菜鸟们留个教程。
--------------------------------------------------------------------------------
【脱壳内容】
一、准备工作
1 侦壳:用PEiD查壳 Armadillo 2.51 - 3.xx DLL Stub -> Silicon Realms Toolworks
OD 载入
下断点 HE OutputDebugStringA
Shift+F9 运行,中断下来。看堆栈:
0006E8A4 00AD5B30 /CALL 到 OutputDebugStringA 来自 00AD5B2A
0006E8A8 0006F21C \String = "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
出现这个说明这个DLL是经过Armadillo 4.X压缩过
2 判断进程:DLL文件加壳应该是不可以双进程,所以这里是单进程方式
二 、脱壳
OD 重新载入
0090C897 >/$ 55 push ebp<---------停在这里
0090C898 |. 8BEC mov ebp, esp
0090C89A |. 53 push ebx
0090C89B |. 8B5D 08 mov ebx, dword ptr [ebp+8]
0090C89E |. 56 push esi
0090C89F |. 8B75 0C mov esi, dword ptr [ebp+C]
0090C8A2 |. 57 push edi
0090C8A3 |. 8B7D 10 mov edi, dword ptr [ebp+10]
0090C8A6 |. 85F6 test esi, esi
---------------------------------------------------------------
下断:BP GetModuleHandleA+5,Shift+F9运行,注意看堆栈:
---------------------------------------------------------------
00068EBC /0006915C
00068EC0 |00AC5FC9 返回到 00AC5FC9 来自 kernel32.GetModuleHandleA
00068EC4 |00069010 ASCII "kernel32.dll"
---------------------------------------------------------------
当堆栈变成上面的样子就可以返回了,清除断点后ALT+F9返回程序!
---------------------------------------------------------------
00AC5FC9 8B0D AC40AF00 mov ecx, dword ptr [AF40AC]<---------返回到这
00AC5FCF 89040E mov dword ptr [esi+ecx], eax
00AC5FD2 A1 AC40AF00 mov eax, dword ptr [AF40AC]
00AC5FD7 391C06 cmp dword ptr [esi+eax], ebx
00AC5FDA 75 16 jnz short 00AC5FF2
00AC5FDC 8D85 B4FEFFFF lea eax, dword ptr [ebp-14C]
00AC5FE2 50 push eax
00AC5FE3 FF15 BC62AE00 call dword ptr [AE62BC] ;kernel32.LoadLibraryA
00AC5FE9 8B0D AC40AF00 mov ecx, dword ptr [AF40AC]
00AC5FEF 89040E mov dword ptr [esi+ecx], eax
00AC5FF2 A1 AC40AF00 mov eax, dword ptr [AF40AC]
00AC5FF7 391C06 cmp dword ptr [esi+eax], ebx
00AC5FFA 0F84 2F010000 je 00AC612F<--------------majic jump,改JMP
00AC6000 33C9 xor ecx, ecx
00AC6002 8B07 mov eax, dword ptr [edi]
00AC6004 3918 cmp dword ptr [eax], ebx
00AC6006 74 06 je short 00AC600E
----------------------------------------------------------------
现在Alt+M打开内存查看窗口,看到这个DLL的给个区段
----------------------------------------------------------------
00870000 00001000 IPLocal PE 头文件 //★ 下内存访问断点
00871000 00053000 IPLocal CODE
008C4000 00003000 IPLocal DATA
008C7000 00003000 IPLocal BSS
----------------------------------------------------------------
现在F9运行程序,中断在下面地址
----------------------------------------------------------------
00AD9ED6 0348 3C add ecx, dword ptr [eax+3C]〈------中断在这
00AD9ED9 898D FCD7FFFF mov dword ptr [ebp-2804], ecx
00AD9EDF A1 FC00AF00 mov eax, dword ptr [AF00FC]
00AD9EE4 8985 B0AAFFFF mov dword ptr [ebp+FFFFAAB0], eax
00AD9EEA 8B85 B0AAFFFF mov eax, dword ptr [ebp+FFFFAAB0]
00AD9EF0 8985 0CD8FFFF mov dword ptr [ebp-27F4], eax
00AD9EF6 8B85 FCD7FFFF mov eax, dword ptr [ebp-2804]
00AD9EFC 8B40 50 mov eax, dword ptr [eax+50]
----------------------------------------------------------------
现在CTRL+S在整个区段搜索
mov edx,dword ptr ds:[ecx+C]
add edx,dword ptr ds:[ecx+8]
找到下面的地址
----------------------------------------------------------------
00ADFD81 8D74C1 D8 lea esi, dword ptr [ecx+eax*8-28]
00ADFD85 33C0 xor eax, eax
00ADFD87 3BCE cmp ecx, esi
00ADFD89 73 11 jnb short 00ADFD9C
00ADFD8B 8B51 0C mov edx, dword ptr [ecx+C]〈--------找到这
00ADFD8E 0351 08 add edx, dword ptr [ecx+8]〈-------在这下断
00ADFD91 3BD0 cmp edx, eax
----------------------------------------------------------------
在上面地址下断以后,ALT+M取消内存断点,F9运行断下,继续F9,会在这多次
中断,看“寄存器”窗口的ECX 008702C0 ASCII ".reloc" 当出现这个的时候,
再看 下面,这个时候显示的就是重定位表RVA和大小
现在我们记下来,取消断点。
----------------------------------------------------------------
ds:[008702C8]=0000597C 〈----大小
edx=0005D000 〈-------重定位RVA
----------------------------------------------------------------
现在ALT+M
----------------------------------------------------------------
00870000 00001000 IPLocal PE 头文件
00871000 00053000 IPLocal CODE //★ 这里下 内存访问 断点
008C4000 00003000 IPLocal DATA
008C7000 00003000 IPLocal BSS
---------------------------------------------------------------
继续F9就到了OEP
---------------------------------------------------------------
008C324C 55 push ebp〈------OEP
008C324D 8BEC mov ebp, esp
008C324F 83C4 C4 add esp, -3C
008C3252 B8 24308C00 mov eax, 008C3024
008C3257 E8 5C34FBFF call 008766B8
008C325C E8 4314FBFF call 008746A4
008C3261 8D40 00 lea eax, dword ptr [eax]
008C3264 0000 add byte ptr [eax], al
008C3266 0000 add byte ptr [eax], al
008C3268 0000 add byte ptr [eax], al
008C326A 0000 add byte ptr [eax], al
用LordPE选中Ollydbg的loaddll.exe的进程,在下面的列表里选择这个dll,然后完整脱壳,得到dumped.dll。
----------------------------------------------------------------------------------------
三、输入表
因为已经修改了Magic Jump,所以现在可以得到完整的输入表。随便从程序找个API调用:
在cpu窗口cttl+B输入FF25
找到008711F4 - FF25 88A18C00 jmp dword ptr [8CA188] ; kernel32.GetStdHandle
跟随到数据窗口,在数据窗口中用长型地址的方式显示数据将看到许多函数:
008CA118 7C809915 kernel32.GetACP
008CA11C 7C802442 kernel32.Sleep
008CA120 7C809AE4 kernel32.VirtualFree
008CA124 7C809A51 kernel32.VirtualAlloc
008CA128 7C809728 kernel32.GetCurrentThreadId
008CA12C 7C80977A kernel32.InterlockedDecrement
008CA130 7C809766 kernel32.InterlockedIncrement
008CA134 7C80B9D1 kernel32.VirtualQuery
008CA138 7C80A0D4 kernel32.WideCharToMultiByte
008CA13C 7C809BF8 kernel32.MultiByteToWideChar
008CA140 7C80BDB6 kernel32.lstrlenA
008CA144 7C810111 kernel32.lstrcpynA
008CA148 7C801D4F kernel32.LoadLibraryExA
008CA14C 7C80A415 kernel32.GetThreadLocale
008CA150 7C801EEE kernel32.GetStartupInfoA
008CA154 7C80ADA0 kernel32.GetProcAddress
008CA158 7C80B6A1 kernel32.GetModuleHandleA
008CA15C 7C80B4CF kernel32.GetModuleFileNameA
008CA160 7C80D262 kernel32.GetLocaleInfoA
008CA164 7C812F1D kernel32.GetCommandLineA
008CA168 7C80ABDE kernel32.FreeLibrary
008CA16C 7C8137D9 kernel32.FindFirstFileA
008CA170 7C80EDD7 kernel32.FindClose
008CA174 7C81CDDA kernel32.ExitProcess
008CA178 7C810D87 kernel32.WriteFile
008CA17C 7C862E2A kernel32.UnhandledExceptionFilter
008CA180 7C957A40 ntdll.RtlUnwind
008CA184 7C812A09 kernel32.RaiseException
008CA188 7C812F39 kernel32.GetStdHandle
上下滚动窗口就可以很容易的找到IAT的开始和结束的地址
开始地址=008CA118
结束地址=008CA6E8
但是现在直接用ImportREC选取IPlocal.dll,填入RVA=0005A114、大小=5D0,
却提示“不能载入当前进程相关数据信息!”
如果填入RVA=004CA118、大小=5D0,可以得到输入表,却无法完成修复抓取文件。
为什么呢?我发帖问过,fly老大说修改PE后再修复,还没搞懂....
于是利用 FLY 老大的移花接木:再打开一个 Ollydbg,载入 Win98 的 NotePad.EXE,
然后把 8CA118-008CA6E8 的数据复制、粘贴进NotePad.EXE 的 004CA118-004CA6E8,
然后用 ImportREC 选择 NotePad.EXE 进程,填入 RVA=CA118、大小=5D0,得到输入表,
CUT掉无效指针,改OEP=5324C,就可以修复了。
四、修复
再用LOADPE修复一下文件,重定位表RVA和大小,就写上我们上面看到的。
此时用Dll_Load加载,提示can't load this dll!,再用LordPE把“镜像基址”
改成870000,加载成功!为何?
到此脱壳成功,可以再优化一下,我就不废话了,好多教程上都有的。
五、参考教程
1.刹那恍惚《用OD手脱Armadillo v4.40 DLL壳》
2.jameshero《用Ollydbg手脱Armadillo加壳的Dll》
对两位表示感谢。
[ 本帖最后由 yayazhi 于 2008-11-12 13:25 编辑 ] |
|