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

网站开发算法建网站难不难

网站开发算法,建网站难不难,专门做win7系统的网站,免费的app源码网本次的了解主要讲解 PE的基本概念、MS-DOS文件头、PE文件头、区块、输入表、输出表等。 这里我将会结合一个简单的小程序来加深我对PE文件结构的了解。 使用学习工具#xff1a;有StudyPE、LordPE、PEID。 学习PE建议看书。。和自己动手。。。 PE文件#xff1a; 在WIN上有StudyPE、LordPE、PEID。  学习PE建议看书。。和自己动手。。。   PE文件   在WIN上32位的可执行文件是PE文件64位的是PE32文件 ,DLL文件的格式和PE格式差不多唯一的区别是PE和DLL的有一个字段标识这个文件是EXE还是DLL。    如上就是一个PE文件的结构图PE文件使用的是一个平面地址空间所有的数据都融合在一起文件的内容又被分割为不同的区块Section 各个区块按页的边界来对齐。每个块都有自己的属性(是否可读是否可写是否可执行等等)。   基地址       当PE文件被装载器装载了之后内存中的板块被称为模块。映射文件的起始地址被称为模块句柄---内存中的模块代表这进程从这个可执行文件中所需要的代码、数据、资源、输入表、输出表及其他东西所使用的东西放在一个连续的内存块中。在装载中PE文件的一个字段会告诉系统把文件映射到内存需要多少内存不能被映射的数据被放置在文件的尾部。       在WIN32中可以使用HMODULE GetModuleHandle(LPCTSTR lpModuleName)来获得一个模块的名称。当传递一个可执行文件或者DLL作为参数 如果系统成功找到这个文件就会返回该可执行文件或者DLL文件映像加载到的基地址。       在PE文件中有一个字符设置了基地址VC建立的exe文件的基地址是0x00400000h,DLL文件的基地址是0x10000000h。   相对虚拟地址     为了让程序的载入更加的灵活-也为了在PE文件中出现有确定的内存地址出现了相对虚拟地址(Relative Vritual Address, RVA),当你的程序加载后假设你的text块的RVA 0x00001000h,映射到程序中时VA虚拟地址 ImagineBase(基地址)RVA(相对虚拟地址)你的代码区块在内存中就开始与0x00401000h。   文件偏移地址     因为我们的文件是存储在磁盘上的某个数据相对于文件头的偏移量就是这个数据的偏移地址称为文件偏移地址(File Offset)或者物理地址RAW Offset偏移地址的起始值是0。   MS-DOS头部IMAGE_DOS_HEADER    每个PE文件是以一个DOS程序开始的还有MZ header之后的DOS stub(DOS块)。如果这个可执行文件不能被这个系统支持会打印一串提示符 This program cannot be run is MS-DOS mode,DOS头部中主要是WORD e_magic和 LONG e_lfanew这个字段比较重要。这些数据结构可以在winnt.h中找到。 #define IMAGE_DOS_SIGNATURE 0x5A4D #define IMAGE_OS2_SIGNATURE 0x454E #define IMAGE_OS2_SIGNATURE_LE 0x454C #define IMAGE_VXD_SIGNATURE 0x454C #define IMAGE_NT_SIGNATURE 0x00004550#include pshpack2.h //这里就是IMAGE_DOS_HEADER的结构了。typedef struct _IMAGE_DOS_HEADER {WORD e_magic; // DOS可执行文件标记“MZ”WORD e_cblp;WORD e_cp;WORD e_crlc;WORD e_cparhdr;WORD e_minalloc;WORD e_maxalloc;WORD e_ss;WORD e_sp;WORD e_csum;WORD e_ip; //DOS代码入口IPWORD e_cs; //DOS代码的入口CSWORD e_lfarlc;WORD e_ovno;WORD e_res[4];WORD e_oemid;WORD e_oeminfo;WORD e_res2[10];LONG e_lfanew; // 指向PE文件头 “PE”00} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;  LONG e_lfanew是指向PE文件头的一个地址它的文件偏移地址是0x3C--也就是60字节开始然后占据了4个字节指向PE文件头具体看下图 我们可以看到0x000000F8在偏移60字节的地方看到PE文件头在0x000000F8,具体可以自己找一个文件来测试(加深印象)  DOS文件头就到这里了接下来继续介绍PE头也就是IMAGE_NT_HEADER,下面的代码是对于定义32还是64的PE头我们可以看到相应的宏语句 和对应的数据结构定义。 #ifdef _WIN64 //如果采用64的架构typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER; #define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL64_HEADER #define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC #else /* _WIN64 */ //如果不是采用64而是32位的架构typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER; #define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL32_HEADER #define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR32_MAGIC #endif /* _WIN64 */ //上面的typedef都是改变结构体的名称typedef struct _IMAGE_NT_HEADERS64 {//这里是64位的PE头的结构体的定义DWORD Signature;IMAGE_FILE_HEADER FileHeader;IMAGE_OPTIONAL_HEADER64 OptionalHeader;} IMAGE_NT_HEADERS64,*PIMAGE_NT_HEADERS64;typedef struct _IMAGE_NT_HEADERS {//这里是32位的PE头的结构体的定义DWORD Signature;IMAGE_FILE_HEADER FileHeader;IMAGE_OPTIONAL_HEADER32 OptionalHeader;} IMAGE_NT_HEADERS32,*PIMAGE_NT_HEADERS32; 在PE的文件头中第一个DWORD Signature, 被定义为了0x00004550h,也就是PE\0\0这四个字符。这个标志没有什么作用。(DOS中指向的地方)。 主要是IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER这两个结构体中的几个字段重要。 我么接下来观看PE文件头中的IMAGE FILE_HEADER FileHeader这个结构体 typedef struct _IMAGE_FILE_HEADER {WORD Machine; //这里定义的是运行平台,i386 0x014Ch这个值还有其他平台看书吧。。WORD NumberOfSections;       //这个是标识区块的数目紧跟在PE头的后面也就是IMAGE_NT_HEADERS的后面DWORD TimeDateStamp;DWORD PointerToSymbolTable;DWORD NumberOfSymbols;WORD SizeOfOptionalHeader;     //这里表明了IMAGE_NT_HEADERS中的大小(RAW SIZE)32位一般是0x00E0, 64位PE一般是0x00F0WORD Characteristics;       //普通的EXE是0x010fh, DLL文件是0x210Eh} IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER; 接下来我们看一下IMAGE_OPTIONAL_HEADER这个结构体一样下面的是这个结构体在winnt.h中的定义,下面这个是32位的还有64位的但是差不多的可以看winnt.htypedef struct _IMAGE_OPTIONAL_HEADER typedef struct _IMAGE_OPTIONAL_HEADER {WORD Magic;BYTE MajorLinkerVersion;BYTE MinorLinkerVersion;DWORD SizeOfCode;           //这里定义了包含代码区块的大小DWORD SizeOfInitializedData;    //这里定义了已经初始化的变量的区块的大小DWORD SizeOfUninitializedData;   //这里是未初始化的变量的区块的大小DWORD AddressOfEntryPoint;     //这里是程序入口的RVA相对虚拟地址DWORD BaseOfCode;          //这里是程序代码块的起始RVADWORD BaseOfData;          //这里是数据块起始RVADWORD ImageBase;           //这里是程序默认装入的基地址(ImageBase)DWORD SectionAlignment;       //内存中区块的对齐值非常重要DWORD FileAlignment;        //文件中区块的对齐值非常重要WORD MajorOperatingSystemVersion;WORD MinorOperatingSystemVersion;WORD MajorImageVersion;WORD MinorImageVersion;WORD MajorSubsystemVersion;WORD MinorSubsystemVersion;DWORD Win32VersionValue;DWORD SizeOfImage;DWORD SizeOfHeaders;DWORD CheckSum;WORD Subsystem;          //这里定义了文件的子系统图形接口子系统字符子系统具体可以看具体的定义WORD DllCharacteristics;DWORD SizeOfStackReserve;DWORD SizeOfStackCommit;DWORD SizeOfHeapReserve;DWORD SizeOfHeapCommit;DWORD LoaderFlags;DWORD NumberOfRvaAndSizes;   //这里定义了数据目录表的项数一直保持为16IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; //这个是数据目录表指向输入、输出表、资源块等数据很重要} IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32;  这个IMAGE_OPTIONAL_HEADER只需要关注一些关键字段就行了记住。。 接下来我么就看一看这个数据目录表数据目录表简单点说就是一个长度为16的IMAGE_DATA_DIRECTORY结构体数组而已 typedef struct _IMAGE_DATA_DIRECTORY {DWORD VirtualAddress; //数据块的其实RVA很重要DWORD Size;             //数据块的长度} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY; 这是一个16位的数组最有一个数组元素作为保留全部为0其他的从开头一直到倒数第二个数据都是已经规定好了的我们看一下这个数据目录表成员 #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 //Export Table #define IMAGE_DIRECTORY_ENTRY_IMPORT 1        //Import Table 输入表这里比较重要 #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 #define IMAGE_DIRECTORY_ENTRY_TLS 9 #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 #define IMAGE_DIRECTORY_ENTRY_IAT 12          //IAT (import address table), 这里也很重要 #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 还有也可以使用LordPE的PE editor来查看这个目录现在的查看目录表的工具很多。。。。。 PE的第一阶段到这里接下来会继续学习增加熟悉度。。。。。。。。。。-----------好好学习天天向上  转载于:https://www.cnblogs.com/binlmmhc/p/6151113.html
http://www.zqtcl.cn/news/462569/

相关文章:

  • 茂名模板建站定制网站开发 ide
  • 做网站现在用什么语言网站估价
  • wap开头的网站外贸网站建设官网
  • 做网站说什么5.0啥意思wordpress教程视频 下载
  • 业务型网站做seo郑州网站推广优化
  • 400网站建设南昌网站建设方案详细版
  • 网站评论回复如何做中国住建部和城乡建设官网
  • 怎么建设网站南京做南京华美整容网站
  • 有哪些可以做1元夺宝的网站推广网站哪家做的好
  • 网站备案 域名不是自己的成都电子商务网站
  • 网站内容管理系统建设2021年建站赚钱
  • 网站建设交流发言稿找做网站的上什么app
  • 企业如何应用网站的wordpress lensnews
  • 可信的邢台做网站学电商运营需要多少钱
  • 网站中文名称做微商进哪个网站安全
  • 网站前端建设需要学会什么意思wordpress 快递查询 插件
  • 网站建设腾讯云与阿里云做网站上市的公司
  • 视频直播网站app开发网站备案主体是
  • 做的好的微信商城网站建设商务网站
  • 小白用网站建设工具专做奢侈品品牌的网站
  • 安装vs2015网站开发外包公司为什么没人去
  • 网站关键字多少合适唐河微网站开发
  • 临沂网站建站专业公司网站开发 文学
  • 乐清网站建设服务定制企业网站建设
  • 简单公司网站模版百度站长工具抓取诊断
  • 网站建设与管理维护 大学论文铁路建设单位网站
  • 贵州企业展示型网站建设wordpress文章点不开
  • 毕业设计可以做网站吗网页版征信报告查询
  • 企业网站每年的费用钢筋网片每平米重量
  • 做网站是属火的职业吗苏州网站建设信息网络