请选择 进入手机版 | 继续访问电脑版

潇潇编程综合教学网

 找回密码
 注册
Flash解密FRC(Flash Resource Catcher)注册会员邮箱认证须知!
查看: 2014|回复: 4

[原创] OD 分析全盘EXE感染型木马病毒,小红伞报 TR/Crypt.XPACK.Gen

[复制链接]
潇潇 发表于 2015-5-5 02:39:00 | 显示全部楼层 |阅读模式
        前段时间不小心运行了一个加壳工具,结果除系统盘外几乎所有的EXE文件全被感染了……记得几年前感染过一次,也是除系统盘以外的所有EXE感染,但几年前被感染后的EXE文件只要在虚拟机里运行一次,就会恢复出非感染文件,所以那次感染之后,需用到的程序中EXE文件,先在虚拟机里运行后再复制过来覆盖就可以,实际上那次感染后的至今没修复完,因有些工具不常用了。这次感染的感觉和上次不一样,实际上找修复工具也是空谈了,经常也是杀光光,所以下定决心亲自分析下并打算写个修复工具……
        目标文件,本机已经被感染OD工具目录中的 loaddll_木马.exe ,其它不多说直接入正题。
        在分析这个被感染的文件之前先了解和学习下如何利用 PEB 查找 kener32 地址,学习这个还要了解下 TEB 结构。        首先,我们先来认识下什么是 PEB 和 TEB:
        PEB 是 Process Environment Block 的缩写,也就是进程环境块; TEB 是 Thread Environment Block 的缩写,也就是线程环境块。我们先来看下几个结构体。

PEB结构:
[C++] 纯文本查看 复制代码
//
// Thread Environment Block (TEB)
//
typedef struct _TEB
{
    NT_TIB Tib;                             /* 00h */
    PVOID EnvironmentPointer;               /* 1Ch */
    CLIENT_ID Cid;                          /* 20h */
    PVOID ActiveRpcHandle;                  /* 28h */
    PVOID ThreadLocalStoragePointer;        /* 2Ch */
   struct _PEB *ProcessEnvironmentBlock;   /* 30h */
    ULONG LastErrorValue;                   /* 34h */
    ULONG CountOfOwnedCriticalSections;     /* 38h */
    PVOID CsrClientThread;                  /* 3Ch */
    struct _W32THREAD* Win32ThreadInfo;     /* 40h */
    ULONG User32Reserved[0x1A];             /* 44h */
    ULONG UserReserved[5];                  /* ACh */
    PVOID WOW32Reserved;                    /* C0h */
    LCID CurrentLocale;                     /* C4h */
    ULONG FpSoftwareStatusRegister;         /* C8h */
    PVOID SystemReserved1[0x36];            /* CCh */
    LONG ExceptionCode;                     /* 1A4h */
    struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer; /* 1A8h */
    UCHAR SpareBytes1[0x28];                /* 1ACh */
    GDI_TEB_BATCH GdiTebBatch;              /* 1D4h */
    CLIENT_ID RealClientId;                 /* 6B4h */
    PVOID GdiCachedProcessHandle;           /* 6BCh */
    ULONG GdiClientPID;                     /* 6C0h */
    ULONG GdiClientTID;                     /* 6C4h */
    PVOID GdiThreadLocalInfo;               /* 6C8h */
    ULONG Win32ClientInfo[62];              /* 6CCh */
    PVOID glDispatchTable[0xE9];            /* 7C4h */
    ULONG glReserved1[0x1D];                /* B68h */
    PVOID glReserved2;                      /* BDCh */
    PVOID glSectionInfo;                    /* BE0h */
    PVOID glSection;                        /* BE4h */
    PVOID glTable;                          /* BE8h */
    PVOID glCurrentRC;                      /* BECh */
    PVOID glContext;                        /* BF0h */
    NTSTATUS LastStatusValue;               /* BF4h */
    UNICODE_STRING StaticUnicodeString;     /* BF8h */
    WCHAR StaticUnicodeBuffer[0x105];       /* C00h */
    PVOID DeallocationStack;                /* E0Ch */
    PVOID TlsSlots[0x40];                   /* E10h */
    LIST_ENTRY TlsLinks;                    /* F10h */
    PVOID Vdm;                              /* F18h */
    PVOID ReservedForNtRpc;                 /* F1Ch */
    PVOID DbgSsReserved[0x2];               /* F20h */
    ULONG HardErrorDisabled;                /* F28h */
    PVOID Instrumentation[14];              /* F2Ch */
    PVOID SubProcessTag;                    /* F64h */
    PVOID EtwTraceData;                     /* F68h */
    PVOID WinSockData;                      /* F6Ch */
    ULONG GdiBatchCount;                    /* F70h */
    BOOLEAN InDbgPrint;                     /* F74h */
    BOOLEAN FreeStackOnTermination;         /* F75h */
    BOOLEAN HasFiberData;                   /* F76h */
    UCHAR IdealProcessor;                   /* F77h */
    ULONG GuaranteedStackBytes;             /* F78h */
    PVOID ReservedForPerf;                  /* F7Ch */
    PVOID ReservedForOle;                   /* F80h */
    ULONG WaitingOnLoaderLock;              /* F84h */
    ULONG SparePointer1;                    /* F88h */
    ULONG SoftPatchPtr1;                    /* F8Ch */
    ULONG SoftPatchPtr2;                    /* F90h */
    PVOID *TlsExpansionSlots;               /* F94h */
    ULONG ImpersionationLocale;             /* F98h */
    ULONG IsImpersonating;                  /* F9Ch */
    PVOID NlsCache;                         /* FA0h */
    PVOID pShimData;                        /* FA4h */
    ULONG HeapVirualAffinity;               /* FA8h */
    PVOID CurrentTransactionHandle;         /* FACh */
    PTEB_ACTIVE_FRAME ActiveFrame;          /* FB0h */
    PVOID FlsData;                          /* FB4h */
    UCHAR SafeThunkCall;                    /* FB8h */
    UCHAR BooleanSpare[3];                  /* FB9h */
} TEB, *PTEB;

TEB结构:
[C++] 纯文本查看 复制代码
typedef struct _PEB
{
    UCHAR InheritedAddressSpace; // 00h
    UCHAR ReadImageFileExecOptions; // 01h
    UCHAR BeingDebugged; // 02h
    UCHAR Spare; // 03h
    PVOID Mutant; // 04h
    PVOID ImageBaseAddress; // 08h
    PPEB_LDR_DATA Ldr; // 0Ch
    PRTL_USER_PROCESS_PARAMETERS ProcessParameters; // 10h
    PVOID SubSystemData; // 14h
    PVOID ProcessHeap; // 18h
    PVOID FastPebLock; // 1Ch
    PPEBLOCKROUTINE FastPebLockRoutine; // 20h
    PPEBLOCKROUTINE FastPebUnlockRoutine; // 24h
    ULONG EnvironmentUpdateCount; // 28h
    PVOID* KernelCallbackTable; // 2Ch
    PVOID EventLogSection; // 30h
    PVOID EventLog; // 34h
    PPEB_FREE_BLOCK FreeList; // 38h
    ULONG TlsExpansionCounter; // 3Ch
    PVOID TlsBitmap; // 40h
    ULONG TlsBitmapBits[0x2]; // 44h
    PVOID ReadOnlySharedMemoryBase; // 4Ch
    PVOID ReadOnlySharedMemoryHeap; // 50h
    PVOID* ReadOnlyStaticServerData; // 54h
    PVOID AnsiCodePageData; // 58h
    PVOID OemCodePageData; // 5Ch
    PVOID UnicodeCaseTableData; // 60h
    ULONG NumberOfProcessors; // 64h
    ULONG NtGlobalFlag; // 68h
    UCHAR Spare2[0x4]; // 6Ch
    LARGE_INTEGER CriticalSectionTimeout; // 70h
    ULONG HeapSegmentReserve; // 78h
    ULONG HeapSegmentCommit; // 7Ch
    ULONG HeapDeCommitTotalFreeThreshold; // 80h
    ULONG HeapDeCommitFreeBlockThreshold; // 84h
    ULONG NumberOfHeaps; // 88h
    ULONG MaximumNumberOfHeaps; // 8Ch
    PVOID** ProcessHeaps; // 90h
    PVOID GdiSharedHandleTable; // 94h
    PVOID ProcessStarterHelper; // 98h
    PVOID GdiDCAttributeList; // 9Ch
    PVOID LoaderLock; // A0h
    ULONG OSMajorVersion; // A4h
    ULONG OSMinorVersion; // A8h
    ULONG OSBuildNumber; // ACh
    ULONG OSPlatformId; // B0h
    ULONG ImageSubSystem; // B4h
    ULONG ImageSubSystemMajorVersion; // B8h
    ULONG ImageSubSystemMinorVersion; // C0h
    ULONG GdiHandleBuffer[0x22]; // C4h
    PVOID ProcessWindowStation; // ???
} PEB, *PPEB;

PEB_LDR_DATA结构:
[C++] 纯文本查看 复制代码
typedef struct _PEB_LDR_DATA
{
 ULONG Length; // +0x00
 BOOLEAN Initialized; // +0x04
 PVOID SsHandle; // +0x08
 LIST_ENTRY InLoadOrderModuleList; // +0x0c
 LIST_ENTRY InMemoryOrderModuleList; // +0x14
 LIST_ENTRY InInitializationOrderModuleList;// +0x1c
} PEB_LDR_DATA,*PPEB_LDR_DATA; // +0x24

LIST_ENTRY结构:
[C++] 纯文本查看 复制代码
typedef struct _LIST_ENTRY {
   struct _LIST_ENTRY *Flink;
   struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;


根据上面的了解,获取kernel32.dll的基地址原理为:在NT内核系统中fs寄存器指向TEB结构,TEB+0x30处指向PEB结构,PEB+0x0c处指向PEB_LDR_DATA结构,PEB_LDR_DATA+0x1c处存放一些动态链接库地址,第一个指向ntdl.dll,第二个就是kernel32.dll的基地址了。在反汇编中如下:

[Asm] 纯文本查看 复制代码
MOV EAX,DWORD PTR FS:[0x30]           ; FS指向TEB结构体内存地址,0x30处是PEB(Process Environment Block)的结构地址
MOV EAX,DWORD PTR DS:[EAX+0xC]           ; EAX=[7FFDE00C]=00081E90-->PEB_LDR_DATA 的基址
MOV EAX,DWORD PTR DS:[EAX+0x1C]          ; EAX=[00081EAC]=00081F28 --> InInitializationOrderModuleList 进程当前已加载模块的链表
MOV EAX,DWORD PTR DS:[EAX]               ; EAX=[00081F28]=00081FD0 --> Flink地址
MOV EAX,DWORD PTR DS:[EAX+0x8]           ; 变量赋值:EAX=[00081FD8]=7C800000 --> kernel32.dll的基址


知识点:以后在反汇编代码中看到类似 MOV EAX,DWORD PTR FS:[0x30] 的汇编代码一定 TEB 和 PEB 有关的,记住后就方便分析了。

其次,我们现在来分析被感染的loaddll_木马.exe,OD截入目标文件,如图所示:


游客,如果您要查看本帖隐藏内容请回复


小结:
1、上面的代码中,先找到kernel32.dll中的函数GetModuleHandleA的地址;
2、再利用 GetModuleHandleA 找到 CreateFileA 、WriteFile 、CloseHandle 和 WinExec 等函数地址。调用CreateFileA 、WriteFile 、CloseHandle 等函数在C盘根目录下生成木马文件 7a3e0f74.exe,如图所示:




最后用 WinExec 函数来运行所生成的木马文件 7a3e0f74.exe ,如图所示:


因这木马病毒文件在运行后文件会自动删除,并执行一些恶意破坏系统的文件,所以上面代码中就不执行004602A3处的代码了。
3、被感染的文件主要作用就是生成一个名为7a3e0f74.exe的木马文件并运行,所以关键部分还是在所生成的文件里,还得分析,另外被感染的文件大小也有所变化。
4、完成上面的工作后,文件跳回到未感染文件的入口,如图所示:





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|潇潇编程综合教学网 ( 滇ICP备09007156号-2 )

滇公网安备 53050202000040号

GMT+8, 2018-1-18 04:01 , Processed in 0.199336 second(s), 26 queries .

Powered by Discuz!

© 2001-2013 Comsenz Inc.

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