首页
社区
课程
招聘
[讨论]IceSword如何枚举进程中的模块
发表于: 2008-5-21 11:30 9718

[讨论]IceSword如何枚举进程中的模块

2008-5-21 11:30
9718
近段时间在研究模块的隐藏,写了点代码,实现了模块隐藏功能,经测试发现对瑞星,OD,expolerprocess等都有很好的隐藏效果,但是对icesword却无效,希望大家讨论一下icesword是如何枚举进程中的模块信息的。
代码大致如下:

typedef struct _LDR_MODULE {
        LIST_ENTRY InLoadOrderModuleList;
        LIST_ENTRY InMemoryOrderModuleList;
        LIST_ENTRY InInitializationOrderModuleList;
        PVOID BaseAddress;
        PVOID EntryPoint;
        ULONG SizeOfImage;
        UNICODE_STRING FullDllName;
        UNICODE_STRING BaseDllName;
        ULONG Flags;
        SHORT LoadCount;
        SHORT TlsIndex;
        LIST_ENTRY HashTableEntry;
        ULONG TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;

typedef struct _PEB_LDR_DATA
{
        ULONG               Length;
        BOOLEAN             Initialized;
        BYTE                                reserved[3];
        PVOID               SsHandle;
        LIST_ENTRY          InLoadOrderModuleList;
        LIST_ENTRY          InMemoryOrderModuleList;
        LIST_ENTRY          InInitializationOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;

typedef struct _NT_PEB
{
        BOOLEAN InheritedAddressSpace;
        BOOLEAN ReadImageFileExecOptions;
        BOOLEAN BeingDebugged;
        BOOLEAN Spare;
        HANDLE Mutant;
        PVOID ImageBaseAddress;
        PPEB_LDR_DATA LoaderData;
        PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
        PVOID SubSystemData;
        PVOID ProcessHeap;
        PVOID FastPebLock;
        PPEBLOCKROUTINE FastPebLockRoutine;
        PPEBLOCKROUTINE FastPebUnlockRoutine;
        ULONG EnvironmentUpdateCount;
        PVOID *KernelCallbackTable;
        PVOID EventLogSection;
        PVOID EventLog;
        PPEB_FREE_BLOCK FreeList;
        ULONG TlsExpansionCounter;
        PVOID TlsBitmap;
        ULONG TlsBitmapBits[0x2];
        PVOID ReadOnlySharedMemoryBase;
        PVOID ReadOnlySharedMemoryHeap;
        PVOID *ReadOnlyStaticServerData;
        PVOID AnsiCodePageData;
        PVOID OemCodePageData;
        PVOID UnicodeCaseTableData;
        ULONG NumberOfProcessors;
        ULONG NtGlobalFlag;
        BYTE Spare2[0x4];
        LARGE_INTEGER CriticalSectionTimeout;
        ULONG HeapSegmentReserve;
        ULONG HeapSegmentCommit;
        ULONG HeapDeCommitTotalFreeThreshold;
        ULONG HeapDeCommitFreeBlockThreshold;
        ULONG NumberOfHeaps;
        ULONG MaximumNumberOfHeaps;
        PVOID **ProcessHeaps;
        PVOID GdiSharedHandleTable;
        PVOID ProcessStarterHelper;
        PVOID GdiDCAttributeList;
        PVOID LoaderLock;
        ULONG OSMajorVersion;
        ULONG OSMinorVersion;
        ULONG OSBuildNumber;
        ULONG OSPlatformId;
        ULONG ImageSubSystem;
        ULONG ImageSubSystemMajorVersion;
        ULONG ImageSubSystemMinorVersion;
        ULONG GdiHandleBuffer[0x22];
        ULONG PostProcessInitRoutine;
        ULONG TlsExpansionBitmap;
        BYTE TlsExpansionBitmapBits[0x80];
        ULONG SessionId;
}NT_PEB, *pNT_PEB;

typedef struct _NT_TEB
{
        NT_TIB Tib;                         /* 00h */
        PVOID EnvironmentPointer;           /* 1Ch */
        CLIENT_ID Cid;                      /* 20h */
        PVOID ActiveRpcInfo;                /* 28h */
        PVOID ThreadLocalStoragePointer;    /* 2Ch */
        pNT_PEB Peb;                       /* 30h */
        ULONG LastErrorValue;               /* 34h */
        ULONG CountOfOwnedCriticalSections; /* 38h */
        PVOID CsrClientThread;              /* 3Ch */
        void* Win32ThreadInfo;                                /* 40h */
        ULONG Win32ClientInfo[0x1F];        /* 44h */
        PVOID WOW32Reserved;                /* C0h */
        LCID CurrentLocale;                 /* C4h */
        ULONG FpSoftwareStatusRegister;     /* C8h */
        PVOID SystemReserved1[0x36];        /* CCh */
        PVOID Spare1;                       /* 1A4h */
        LONG ExceptionCode;                 /* 1A8h */
        UCHAR SpareBytes1[0x28];            /* 1ACh */
        PVOID SystemReserved2[0xA];         /* 1D4h */
        GDI_TEB_BATCH GdiTebBatch;          /* 1FCh */
        ULONG gdiRgn;                       /* 6DCh */
        ULONG gdiPen;                       /* 6E0h */
        ULONG gdiBrush;                     /* 6E4h */
        CLIENT_ID RealClientId;             /* 6E8h */
        PVOID GdiCachedProcessHandle;       /* 6F0h */
        ULONG GdiClientPID;                 /* 6F4h */
        ULONG GdiClientTID;                 /* 6F8h */
        PVOID GdiThreadLocaleInfo;          /* 6FCh */
        PVOID UserReserved[5];              /* 700h */
        PVOID glDispatchTable[0x118];       /* 714h */
        ULONG glReserved1[0x1A];            /* B74h */
        PVOID glReserved2;                  /* BDCh */
        PVOID glSectionInfo;                /* BE0h */
        PVOID glSection;                    /* BE4h */
        PVOID glTable;                      /* BE8h */
        PVOID glCurrentRC;                  /* BECh */
        PVOID glContext;                    /* BF0h */
        LONG 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[0x10];        /* F2Ch */
        PVOID WinSockData;                  /* F6Ch */
        ULONG GdiBatchCount;                /* F70h */
        USHORT Spare2;                      /* F74h */
        BOOLEAN IsFiber;                    /* F76h */
        UCHAR Spare3;                       /* F77h */
        ULONG Spare4;                       /* F78h */
        ULONG Spare5;                       /* F7Ch */
        PVOID ReservedForOle;               /* F80h */
        ULONG WaitingOnLoaderLock;          /* F84h */
        ULONG Unknown[11];                  /* F88h */
        PVOID FlsSlots;                     /* FB4h */
        PVOID WineDebugInfo;                /* Needed for WINE DLL's  */
}NT_TEB, *pNT_TEB;
NT_TEB*        GetCurrentThreadTEB()
{
        NT_TEB* pTeb=NULL;

        _asm
        {
                mov                eax,fs:[0x18]
                mov                pTeb,eax
        }
        return pTeb;
}

BOOL BaseFunc::HideModuleByHandle(HMODULE hModule)
{
        NT_TEB* pTeb = GetCurrentThreadTEB();
        NT_PEB* pPeb = pTeb->Peb;
        PPEB_LDR_DATA pLdrData = pPeb->LoaderData;
        PLDR_MODULE        ListHead = (PLDR_MODULE)(&(pLdrData->InLoadOrderModuleList));
        PLDR_MODULE pFirstLdrModule = (PLDR_MODULE)pLdrData->InLoadOrderModuleList.Flink;
        PLDR_MODULE pLdrModule = pFirstLdrModule;
        PLDR_MODULE pLastModule,pNextModule;
       
        //LoadOrderModuleList
        while(pLdrModule != ListHead)
        {
                //判断是否是我们要屏蔽的模块
                if(pLdrModule->BaseAddress == hModule)
                {
                        pLdrModule->InLoadOrderModuleList.Flink->Blink = pLdrModule->InLoadOrderModuleList.Blink;
                        pLdrModule->InLoadOrderModuleList.Blink->Flink = pLdrModule->InLoadOrderModuleList.Flink;

                        pLdrModule->InMemoryOrderModuleList.Flink->Blink = pLdrModule->InMemoryOrderModuleList.Blink;
                        pLdrModule->InMemoryOrderModuleList.Blink->Flink = pLdrModule->InMemoryOrderModuleList.Flink;

                        pLdrModule->InInitializationOrderModuleList.Flink->Blink = pLdrModule->InInitializationOrderModuleList.Blink;
                        pLdrModule->InInitializationOrderModuleList.Blink->Flink = pLdrModule->InInitializationOrderModuleList.Flink;
                }

                pLdrModule = (PLDR_MODULE)pLdrModule->InLoadOrderModuleList.Flink;

        }

        return TRUE;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没人顶呀!!我来顶下
2008-5-21 12:06
0
雪    币: 356
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
显然IceSword的模块信息不是来自于进程的PEB结构。但是在进程相关的系统结构EPROCESS中又找不到其他的和模块列表相关的东西。(或者是有,但我没能够找出来。)
做过一个试验,验证了icesword不是通过暴力搜索内存来查找模块的。
试验内容如下:
1、模块加载
2、通过GetModuleInformation获得模块信息,然后把从模块基址开始的SizeOfImage的内容都拷贝到一块申请的空间。
3、FreeLibray卸载模块,IceSword找不到模块
4、在刚才的模块加载基址处重新申请空间,把先前模块的所有内容再次拷贝进去,IceSword仍然找不到模块。
2008-5-21 12:31
0
雪    币: 70
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
没研究过IS,maybe是从TypeList里取的?
2008-5-21 12:52
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
5
IceSword使用的是NtQueryVirtualMemory
3楼的情况,则根本不是加载模块,只是把文件内容拷贝到内存而已,要是IceSword不能排除这种情况,那岂不是所有被进程读进内存的文件,都会显示出来了?那显然反而是不对的。
2008-5-21 13:38
0
雪    币: 356
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
5楼的很有道理。我准备看一下NtQueryVirtualMemory的实现,看他究竟怎么确认模块的。
2008-5-21 13:56
0
雪    币: 356
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
使用NtQueryVirtualMemory能够查出隐藏后的内存区域的信息,但是如何获取DLL名字、路径等信息呢?在PEB的LDR链表中已经被删除了啊。
2008-5-21 14:32
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
8
pjf给is加vmp吧
2008-5-21 16:31
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
9
帮ls加一个哦也
2008-5-21 16:37
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
10
取名子可以用ZwQueryVirtualMemory(hProc,hModule,MemorySectionName,Buffer,nSize,&ReturnLength)

他2000用的上面的方法
xp他是用了驱动方式的
2008-5-21 16:47
0
雪    币: 356
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
试过了               
st = ZwQueryVirtualMemory(GetCurrentProcess(),hModule,2,&us,0x1000,&rl);
这样的确可以取到名字。但是直觉IS似乎不应该是这样做的。
2008-5-21 17:09
0
雪    币: 356
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
10楼的,能说说在XP下使用驱动的方式是如何获取的吗?
2008-5-21 17:10
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
13
不懂驱动,驱动里面的实现我没看过,哦也
2008-5-21 17:56
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
用户态模块dll这个问题我也在作研究
现在从对象管理入手呢

内核模块也有所关注
摘掉LDR_DATA_TABLE_ENTRY链对IS的效果并不好
不知大家是否有更好的建议
2008-5-22 09:21
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看了3楼的实验,我有一个想法。
将DLL加载完了以后,拷到另一块内存,做一下重定位,然后用那块内存地址作DLL的Handle行不行呢?
这个样谁都查不出来啊
2008-6-22 09:28
0
游客
登录 | 注册 方可回帖
返回
//