飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2876|回复: 0

Armadillo v4.40加壳的Dll脱壳

[复制链接]
  • TA的每日心情

    2017-7-19 15:45
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-11-12 13:23:43 | 显示全部楼层 |阅读模式
    脱壳作者】 yayazhi
    【作者邮箱】 kuailenanhai-1@163.com
    【使用工具】 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 编辑 ]
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表