从PEB中取出MODULENAME

原创 2007年09月22日 16:56:00
 

HTML Tags and JavaScript tutorial



从PEB中取出MODULENAME





 
PEB
(进程环境块)是进程中几个数据结构中唯一在用户地址空间的一个结构。它保存着很多信息,但是我们比较感兴趣的是在此进程中加载的模块信息。在以前都是使用
TOOLHELP32
中的函数取得,其实这些过程最终也是从这个结构中取出响应得信息的。
 
每个进程的
PEB
结构地址保存在
FS:[0x30]
处,而
MODULE
的信息是在一堆双向链表和其它数据结构中间。要顺利地取出
MODULENAME
信息,必须涉及到下面的这些结构:
 




typedef struct _UNICODE_STRING {

USHORT Length;

USHORT MaximumLength;

PWSTR Buffer;

} UNICODE_STRING, *PUNICODE_STRING;

 

typedef struct _RTL_DRIVE_LETTER_CURDIR {

USHORT Flags;

USHORT Length;

ULONG TimeStamp;

UNICODE_STRING DosPath;

} RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR;

 

typedef struct _PEB_LDR_DATA {

ULONG Length;

BOOLEAN Initialized;

PVOID SsHandle;

LIST_ENTRY InLoadOrderModuleList;

LIST_ENTRY InMemoryOrderModuleList;

LIST_ENTRY InInitializationOrderModuleList;

} PEB_LDR_DATA, *PPEB_LDR_DATA;

 

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 _RTL_USER_PROCESS_PARAMETERS {

ULONG MaximumLength;

ULONG Length;

ULONG Flags;

ULONG DebugFlags;

PVOID ConsoleHandle;

ULONG ConsoleFlags;

HANDLE StdInputHandle;

HANDLE StdOutputHandle;

HANDLE StdErrorHandle;

UNICODE_STRING CurrentDirectoryPath;

HANDLE CurrentDirectoryHandle;

UNICODE_STRING DllPath;

UNICODE_STRING ImagePathName;

UNICODE_STRING CommandLine;

PVOID Environment;

ULONG StartingPositionLeft;

ULONG StartingPositionTop;

ULONG Width;

ULONG Height;

ULONG CharWidth;

ULONG CharHeight;

ULONG ConsoleTextAttributes;

ULONG WindowFlags;

ULONG ShowWindowFlags;

UNICODE_STRING WindowTitle;

UNICODE_STRING DesktopName;

UNICODE_STRING ShellInfo;

UNICODE_STRING RuntimeData;

RTL_DRIVE_LETTER_CURDIR DLCurrentDirectory[0x20];

} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;

 

typedef struct _PEB_FREE_BLOCK {

struct _PEB_FREE_BLOCK *Next;

ULONG Size;

} PEB_FREE_BLOCK, *PPEB_FREE_BLOCK;

 

typedef void (*PPEBLOCKROUTINE)(PVOID PebLock);

 

typedef struct _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;

} PEB, *PPEB;



 
在这些结构丛中,我将进程加载的模块的信息图描述如下:
 
 
下面是根据这个示意图,写个一个程序,程序将输出值放到一个对话框中的
LIST
控件中。
 




….

{

PPEB pPEB;

char Str[200];

HWND hLog;

PPEB_LDR_DATA pLdr;

PLIST_ENTRY pListEntry;

PLDR_MODULE pModule;

char DllName[300];

 

_asm{

push eax

mov eax,fs:[30h]

mov pPEB, eax

pop eax

}

 

hLog = GetDlgItem(hDlg, IDC_LIST1);

 

pLdr = pPEB->LoaderData;

 

if (pLdr->InMemoryOrderModuleList.Flink)

{

pListEntry = pLdr->InMemoryOrderModuleList.Flink;

 

while(pListEntry != &pLdr->InMemoryOrderModuleList)

{

pModule = (PLDR_MODULE)(pListEntry - 1);

 

WideCharToMultiByte(CP_ACP, 0, pModule->FullDllName.Buffer, pModule->FullDllName.Length, DllName, 300, NULL, FALSE);

SendMessage(hLog, LB_ADDSTRING, 0, (LPARAM)DllName);

 

sprintf(Str, "BaseAddress: 0x%08X sizeofImage: 0x%08X", pModule->BaseAddress, pModule->SizeOfImage);

SendMessage(hLog, LB_ADDSTRING, 0, (LPARAM)Str);

 

pListEntry = pListEntry->Flink;

}

 

}



 
好了,大功告成,
PEB
里面
LIST_ENTRY
结构用的比较好。值得细细品味
J
 


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

追踪PEB流程

  • 2017-07-29 02:10
  • 19KB
  • 下载

PEB2466英文版资料

  • 2013-04-27 01:32
  • 3.25MB
  • 下载

PEB结构的获取

PEB结构----枚举用户模块列表。 PEB

小车灯光AD PEB板

  • 2013-10-26 15:53
  • 572KB
  • 下载

ModuleLister-PEB

  • 2013-04-04 13:50
  • 13KB
  • 下载

PEB结构块解析

peb结构块解析: 项目需要获取程序运行的一些状态,目前只能获取寄存器信息,故采用fs寄存器获取peb信息,本文主要探索peb中可以获得的进程信息。 windbg信息如下:win xp 下,和wi...

ubifs烧写遇到《UBI error: ubi_io_read: error -1 while reading 64 bytes from PEB》

终于移植好了2.6.39的内核,烧写ubi文件系统后,第一次打印到/init初始化了,虽然oops了,但还是感觉离最后的成功越来越近了。 可是,偶然断电重启发现,debug口打印却和第一次不一样了,在...

TEB和PEB的知识复习

fs:[0x18]指向的是TEB自身, fs[0x30]就是PEB所在的位置.

枚举PEB获取进程模块列表

枚举进程模块的方法有很多种,常见的有枚举PEB和内存搜索法,今天,先来看看实现起来最简单的枚举PEB实现获取进程模块列表。 首先,惯例是各种繁琐的结构体定义。需要包含 ntifs.h 和 WinD...

PEB结构----枚举用户模块列表

本文在主主要以上述两篇文章为基础,对PEB的结构进行了详细的分析,重点是在揭示PEB结构中的list—entry的应用,并且以C语言Code进行实证。 本文主要分为四个部分,第一部分说明PEB地...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)