当前位置: 首页 > news >正文

杭州企业自助建站系统广州专业网站建设哪家好

杭州企业自助建站系统,广州专业网站建设哪家好,网站开发音乐,广州市天河区建设和水务局网站在笔者上一篇文章《内核解析PE结构导出表》介绍了如何解析内存导出表结构#xff0c;本章将继续延申实现解析PE结构的PE头#xff0c;PE节表等数据#xff0c;总体而言内核中解析PE结构与应用层没什么不同#xff0c;在上一篇文章中LyShark封装实现了KernelMapFile()内存映…在笔者上一篇文章《内核解析PE结构导出表》介绍了如何解析内存导出表结构本章将继续延申实现解析PE结构的PE头PE节表等数据总体而言内核中解析PE结构与应用层没什么不同在上一篇文章中LyShark封装实现了KernelMapFile()内存映射函数在之后的章节中这个函数会被多次用到为了减少代码冗余后期文章只列出重要部分读者可以自行去前面的文章中寻找特定的片段。 PE结构Portable Executable Structure是Windows操作系统用于执行可执行文件和动态链接库DLL的标准格式。节表Section Table是PE结构中的一个部分它记录了可执行文件或DLL中每个区域的详细信息例如代码、数据、资源等。 Windows NT 系统中可执行文件使用微软设计的新的文件格式PE文件的基本结构如下图所示 在PE文件中,代码,已初始化的数据,资源和重定位信息等数据被按照属性分类放到不同的Section(节区/或简称为节)中,而每个节区的属性和位置等信息用一个IMAGE_SECTION_HEADER结构来描述,所有的IMAGE_SECTION_HEADER结构组成了一个节表(Section Table),节表数据在PE文件中被放在所有节数据的前面. 上面PE结构图中可知PE文件的开头部分包括了一个标准的DOS可执行文件结构这看上去有些奇怪但是这对于可执行程序的向下兼容性来说却是不可缺少的当然现在已经基本不会出现纯DOS程序了现在来说这个IMAGE_DOS_HEADER结构纯粹是历史遗留问题。 9.1.1 DOS头结构解析 PE文件中的DOS部分由MZ格式的文件头和可执行代码部分组成可执行代码被称为DOS块(DOS stub)MZ格式的文件头由IMAGE_DOS_HEADER结构定义在C语言头文件winnt.h中有对这个DOS结构详细定义,如下所示 typedef struct _IMAGE_DOS_HEADER { WORD e_magic; // DOS的头部WORD e_cblp; // Bytes on last page of fileWORD e_cp; // Pages in fileWORD e_crlc; // RelocationsWORD e_cparhdr; // Size of header in paragraphsWORD e_minalloc; // Minimum extra paragraphs neededWORD e_maxalloc; // Maximum extra paragraphs neededWORD e_ss; // Initial (relative) SS valueWORD e_sp; // Initial SP valueWORD e_csum; // ChecksumWORD e_ip; // Initial IP valueWORD e_cs; // Initial (relative) CS valueWORD e_lfarlc; // File address of relocation tableWORD e_ovno; // Overlay numberWORD e_res[4]; // Reserved wordsWORD e_oemid; // OEM identifier (for e_oeminfo)WORD e_oeminfo; // OEM information; e_oemid specificWORD e_res2[10]; // Reserved wordsLONG e_lfanew; // 指向了PE文件的开头(重要)} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;在DOS文件头中第一个字段e_magic被定义为MZ,标志着DOS文件的开头部分,最后一个字段e_lfanew则指明了PE文件的开头位置现在来说除了第一个字段和最后一个字段有些用处其他字段几乎已经废弃了这里附上读取DOS头的代码。 void DisplayDOSHeadInfo(HANDLE ImageBase) {PIMAGE_DOS_HEADER pDosHead NULL;pDosHead (PIMAGE_DOS_HEADER)ImageBase;printf(DOS头 %x\n, pDosHead-e_magic);printf(文件地址 %x\n, pDosHead-e_lfarlc);printf(PE结构偏移 %x\n, pDosHead-e_lfanew); }9.1.2 PE头结构解析 从DOS文件头的e_lfanew字段向下偏移003CH的位置就是真正的PE文件头的位置该文件头是由IMAGE_NT_HEADERS结构定义的定义结构如下 typedef struct _IMAGE_NT_HEADERS {DWORD Signature; // PE文件标识字符IMAGE_FILE_HEADER FileHeader;IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;如上PE文件头的第一个DWORD是一个标志默认情况下它被定义为00004550h也就是P,E两个字符另外加上两个零而大部分的文件属性由标志后面的IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER32结构来定义我们继续跟进IMAGE_FILE_HEADER这个结构 typedef struct _IMAGE_FILE_HEADER {WORD Machine; // 运行平台WORD NumberOfSections; // 文件的节数目DWORD TimeDateStamp; // 文件创建日期和时间DWORD PointerToSymbolTable; // 指向符号表(用于调试)DWORD NumberOfSymbols; // 符号表中的符号数量WORD SizeOfOptionalHeader; // IMAGE_OPTIONAL_HANDLER32结构的长度WORD Characteristics; // 文件的属性 exe010fh dll210eh } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;继续跟进 IMAGE_OPTIONAL_HEADER32 结构该结构体中的数据就丰富了重要的结构说明经备注好了 typedef struct _IMAGE_OPTIONAL_HEADER {WORD Magic;BYTE MajorLinkerVersion; // 连接器版本BYTE MinorLinkerVersion;DWORD SizeOfCode; // 所有包含代码节的总大小DWORD SizeOfInitializedData; // 所有已初始化数据的节总大小DWORD SizeOfUninitializedData; // 所有未初始化数据的节总大小DWORD AddressOfEntryPoint; // 程序执行入口RVADWORD BaseOfCode; // 代码节的起始RVADWORD BaseOfData; // 数据节的起始RVADWORD ImageBase; // 程序镜像基地址DWORD SectionAlignment; // 内存中节的对其粒度DWORD FileAlignment; // 文件中节的对其粒度WORD MajorOperatingSystemVersion; // 操作系统主版本号WORD MinorOperatingSystemVersion; // 操作系统副版本号WORD MajorImageVersion; // 可运行于操作系统的最小版本号WORD MinorImageVersion;WORD MajorSubsystemVersion; // 可运行于操作系统的最小子版本号WORD MinorSubsystemVersion;DWORD Win32VersionValue;DWORD SizeOfImage; // 内存中整个PE映像尺寸DWORD SizeOfHeaders; // 所有头加节表的大小DWORD CheckSum;WORD Subsystem;WORD DllCharacteristics;DWORD SizeOfStackReserve; // 初始化时堆栈大小DWORD SizeOfStackCommit;DWORD SizeOfHeapReserve;DWORD SizeOfHeapCommit;DWORD LoaderFlags;DWORD NumberOfRvaAndSizes; // 数据目录的结构数量IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;IMAGE_DATA_DIRECTORY数据目录列表它由16个相同的IMAGE_DATA_DIRECTORY结构组成这16个数据目录结构定义很简单仅仅指出了某种数据的位置和长度定义如下 typedef struct _IMAGE_DATA_DIRECTORY {DWORD VirtualAddress; // 数据起始RVADWORD Size; // 数据块的长度 } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;上方的结构就是PE文件的重要结构接下来将通过编程读取出PE文件的开头相关数据读取这些结构也非常简单代码如下所示。 NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(hello lyshark \n);NTSTATUS status STATUS_SUCCESS;HANDLE hFile NULL;HANDLE hSection NULL;PVOID pBaseAddress NULL;UNICODE_STRING FileName { 0 };// 初始化字符串RtlInitUnicodeString(FileName, L\\??\\C:\\Windows\\System32\\ntdll.dll);// 内存映射文件status KernelMapFile(FileName, hFile, hSection, pBaseAddress);if (!NT_SUCCESS(status)){return 0;}// 获取PE头数据集PIMAGE_DOS_HEADER pDosHeader (PIMAGE_DOS_HEADER)pBaseAddress;PIMAGE_NT_HEADERS pNtHeaders (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader pDosHeader-e_lfanew);PIMAGE_FILE_HEADER pFileHeader pNtHeaders-FileHeader;DbgPrint(运行平台: %x\n, pFileHeader-Machine);DbgPrint(节区数目: %x\n, pFileHeader-NumberOfSections);DbgPrint(时间标记: %x\n, pFileHeader-TimeDateStamp);DbgPrint(可选头大小 %x\n, pFileHeader-SizeOfOptionalHeader);DbgPrint(文件特性: %x\n, pFileHeader-Characteristics);DbgPrint(入口点 %p\n, pNtHeaders-OptionalHeader.AddressOfEntryPoint);DbgPrint(镜像基址 %p\n, pNtHeaders-OptionalHeader.ImageBase);DbgPrint(镜像大小 %p\n, pNtHeaders-OptionalHeader.SizeOfImage);DbgPrint(代码基址 %p\n, pNtHeaders-OptionalHeader.BaseOfCode);DbgPrint(区块对齐 %p\n, pNtHeaders-OptionalHeader.SectionAlignment);DbgPrint(文件块对齐 %p\n, pNtHeaders-OptionalHeader.FileAlignment);DbgPrint(子系统 %x\n, pNtHeaders-OptionalHeader.Subsystem);DbgPrint(区段数目 %d\n, pNtHeaders-FileHeader.NumberOfSections);DbgPrint(时间日期标志 %x\n, pNtHeaders-FileHeader.TimeDateStamp);DbgPrint(首部大小 %x\n, pNtHeaders-OptionalHeader.SizeOfHeaders);DbgPrint(特征值 %x\n, pNtHeaders-FileHeader.Characteristics);DbgPrint(校验和 %x\n, pNtHeaders-OptionalHeader.CheckSum);DbgPrint(可选头部大小 %x\n, pNtHeaders-FileHeader.SizeOfOptionalHeader);DbgPrint(RVA 数及大小 %x\n, pNtHeaders-OptionalHeader.NumberOfRvaAndSizes);ZwUnmapViewOfSection(NtCurrentProcess(), pBaseAddress);ZwClose(hSection);ZwClose(hFile);Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }运行如上这段代码即可解析出ntdll.dll模块的核心内容如下图所示 接着来实现解析节表PE文件中的所有节的属性定义都被定义在节表中节表由一系列的IMAGE_SECTION_HEADER结构排列而成每个结构邮过来描述一个节节表总被存放在紧接在PE文件头的地方也即是从PE文件头开始偏移为00f8h的位置处如下是节表头部的定义。 typedef struct _IMAGE_SECTION_HEADER {BYTE Name[IMAGE_SIZEOF_SHORT_NAME];union {DWORD PhysicalAddress;DWORD VirtualSize; // 节区尺寸} Misc;DWORD VirtualAddress; // 节区RVADWORD SizeOfRawData; // 在文件中对齐后的尺寸DWORD PointerToRawData; // 在文件中的偏移DWORD PointerToRelocations; // 在OBJ文件中使用DWORD PointerToLinenumbers;WORD NumberOfRelocations;WORD NumberOfLinenumbers;DWORD Characteristics; // 节区属性字段 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;其中Name是该节的名称VirtualAddress是该节在内存中的虚拟地址SizeOfRawData是该节在文件中的大小PointerToRawData是该节在文件中的偏移地址Characteristics描述了该节的属性例如是否可读、可写、可执行等。 节表通常位于PE结构的文件头后面它包含了多个节表项每个节表项描述了一个节的信息包括 节名称每个节都有一个名称例如代码节的名称为.text数据节的名称为.data等节大小该节的大小以字节为单位节的虚拟地址该节在内存中的虚拟地址节的物理地址该节在文件中的偏移地址节的属性例如该节是否可读、可写、可执行等。 总的来说节表记录了PE文件中每个区域的详细信息这些信息对于可执行文件或DLL的加载和运行都非常重要。 解析节表也很容易实现首先通过pFileHeader-NumberOfSections获取到节数量然后循环解析直到所有节输出完成这段代码实现如下所示。 NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(hello lyshark \n);NTSTATUS status STATUS_SUCCESS;HANDLE hFile NULL;HANDLE hSection NULL;PVOID pBaseAddress NULL;UNICODE_STRING FileName { 0 };// 初始化字符串RtlInitUnicodeString(FileName, L\\??\\C:\\Windows\\System32\\ntdll.dll);// 内存映射文件status KernelMapFile(FileName, hFile, hSection, pBaseAddress);if (!NT_SUCCESS(status)){return 0;}// 获取PE头数据集PIMAGE_DOS_HEADER pDosHeader (PIMAGE_DOS_HEADER)pBaseAddress;PIMAGE_NT_HEADERS pNtHeaders (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader pDosHeader-e_lfanew);PIMAGE_SECTION_HEADER pSection IMAGE_FIRST_SECTION(pNtHeaders);PIMAGE_FILE_HEADER pFileHeader pNtHeaders-FileHeader;DWORD NumberOfSectinsCount 0;// 获取区块数量NumberOfSectinsCount pFileHeader-NumberOfSections;DWORD64 *difA NULL; // 虚拟地址开头DWORD64 *difS NULL; // 相对偏移(用于遍历)difA ExAllocatePool(NonPagedPool, NumberOfSectinsCount*sizeof(DWORD64));difS ExAllocatePool(NonPagedPool, NumberOfSectinsCount*sizeof(DWORD64));DbgPrint(节区名称 相对偏移\t虚拟大小\tRaw数据指针\tRaw数据大小\t节区属性\n);for (DWORD temp 0; tempNumberOfSectinsCount; temp, pSection){DbgPrint(%10s\t 0x%x \t 0x%x \t 0x%x \t 0x%x \t 0x%x \n,pSection-Name, pSection-VirtualAddress, pSection-Misc.VirtualSize,pSection-PointerToRawData, pSection-SizeOfRawData, pSection-Characteristics);difA[temp] pSection-VirtualAddress;difS[temp] pSection-VirtualAddress - pSection-PointerToRawData;}ZwUnmapViewOfSection(NtCurrentProcess(), pBaseAddress);ZwClose(hSection);ZwClose(hFile);Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }运行驱动程序即可输出ntdll.dll模块的节表信息如下图
http://www.w-s-a.com/news/266410/

相关文章:

  • 微信网站应用开发营销推广的方案
  • 广州做网站商城的公司制作一个app的完整流程
  • 湖南城乡建设厅网站163注册企业邮箱
  • 做网站怎么调整图片间距织梦做的网站如何去掉index
  • 凡科网免费建站步骤及视频网页设计基础教程第二版课后答案
  • 建设一个旅游网站毕业设计企业网站要更新文章吗
  • 做网站需要简介中山网站设计公司
  • 网站怎么做导航栏微信公众号官网登录
  • 1_ 掌握网站开发的基本流程 要求:熟悉网站开发与设计的基本流程.电子商城网站开发
  • 百度网站怎么建设河北省工程造价信息网官网
  • 阿里云网站模板网页设计的合适尺寸是多少
  • 做小程序和做网站哪个好让别人做网站推广需要多少钱
  • 做外贸的几个网站查询网域名解析
  • 酒泉如何做百度的网站seo研究中心好客站
  • 网站设计建设平台户县做网站
  • 一元云购网站开发wordpress博客空间
  • 深圳高端网站建设公司排名如何搭建局域网服务器
  • 照片管理网站模板高端网站开发哪家好
  • 黄冈网站制作wordpress为什么不能显示域名
  • 做网站设计怎么进企业电子商务网站建设与管理教材
  • 设计广告公司网站建设网站开发技术选择
  • 个人网站教程个人网站有必要备案吗
  • 网站建设推广好做吗黄浦企业网站制作
  • 怎样做28网站代理中山网站建设方案外包
  • vs2010做网站前台搭建小网站
  • 做视频必须知道的一些网站wordpress 标签鼠标滑过_弹出的title 代码美化
  • 怎么做室内设计公司网站电商运营培训视频课程
  • 昆明网站策划天津市建筑信息平台
  • 三亚放心游app官方网站wordpress 个人主题
  • 做简单的网站备案平台新增网站