一丶可选头结构以及作用

typedef struct_IMAGE_OPTIONAL_HEADER {

WORD Magic;/*机器型号,判断是PE是32位还是64位*/BYTE MajorLinkerVersion;/*连接器版本号高版本*/BYTE MinorLinkerVersion;/*连接器版本号低版本,组合起来就是 5.12 其中5是高版本,C是低版本*/DWORD SizeOfCode;/*代码节的总大小(512为一个磁盘扇区)*/DWORD SizeOfInitializedData;/*初始化数据的节的总大小,也就是.data*/DWORD SizeOfUninitializedData;/*未初始化数据的节的大小,也就是 .data ?*/DWORD AddressOfEntryPoint;/*程序执行入口(OEP) RVA(相对偏移)*/DWORD BaseOfCode;/*代码的节的起始RVA(相对偏移)也就是代码区的偏移,偏移+模块首地址定位代码区*/DWORD BaseOfData;/*数据结的起始偏移(RVA),同上*/DWORD ImageBase;/*程序的建议模块基址(意思就是说作参考用的,模块地址在哪里)*/DWORD SectionAlignment;/*内存中的节对齐*/DWORD FileAlignment;/*文件中的节对齐*/WORD MajorOperatingSystemVersion;/*操作系统版本号高位*/WORD MinorOperatingSystemVersion;/*操作系统版本号低位*/WORD MajorImageVersion;/*PE版本号高位*/WORD MinorImageVersion;/*PE版本号低位*/WORD MajorSubsystemVersion;/*子系统版本号高位*/WORD MinorSubsystemVersion;/*子系统版本号低位*/DWORD Win32VersionValue;/*32位系统版本号值,注意只能修改为4 5 6表示操作系统支持nt4.0 以上,5的话依次类推*/DWORD SizeOfImage;/*整个程序在内存中占用的空间(PE映尺寸)*/DWORD SizeOfHeaders;/*所有头(头的结构体大小)+节表的大小*/DWORD CheckSum;/*校验和,对于驱动程序,可能会使用*/WORD Subsystem;/*文件的子系统 :重要*/WORD DllCharacteristics;/*DLL文件属性,也可以成为特性,可能DLL文件可以当做驱动程序使用*/DWORD SizeOfStackReserve;/*预留的栈的大小*/DWORD SizeOfStackCommit;/*立即申请的栈的大小(分页为单位)*/DWORD SizeOfHeapReserve;/*预留的堆空间大小*/DWORD SizeOfHeapCommit;/*立即申请的堆的空间的大小*/DWORD LoaderFlags;/*与调试有关*/DWORD NumberOfRvaAndSizes;/*下面的成员,数据目录结构的项目数量*/IMAGE_DATA_DIRECTORY DataDirectory[16];/*数据目录,默认16个,16是宏,这里方便直接写成16*/} IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32;

1.PE类型

这个有宏定义了

#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b    /*32位PE*/

#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b    /*64位PE*/

#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107    /*其它,单片机

2丶.OEP,程序执行入口位置.

我们利用昨天写的程序,可以完成一个反调试.

思路:

1.修改OEP偏移,置为0位置处(也就是MZ的位置)

2.在MZ位置后面添加我们自己的代码

3.添加完成之后,继续跳到以前OEP的位置.

首先,看PE文件的值,OEP的偏移位置是00001008偏移,那么OD调试,看下位置在哪里.

我们知道了入口偏移是00401008位置,那么我们就知道了模块首地址是00400000

公式  00401008 - 1008 = 00400000  因为我们知道1008是相对于模块地址来的所以可以求出模块地址,我们跳转过去

可以看出,前边正好是4D5A,那么我们可以修改一下,添加自己的代码,首先4D5A正好是汇编代码

那么我们可以去平栈,然后跳转到我们以前的OEP位置.

修改成下边那样

首先,我们以前讲DOS头的时候说过,如果这个EXE文件运行在32位系统下,那么DOS头中就地一个和最后一个成员有用,那么后面我们随便修改.

上面代码很简单,首先栈平衡,然后跳转到我们以前代码执行位置.

文件中(PE)我们把后面的二进制都修改为我们的代码

入后偏移(RVA)修改为0000000

运行我们的程序,和调试我们的程序

运行程序:

可以正常运行

调试程序:

二丶数据目录

数据目录,主要是存放各种表格的,看下

typedef struct_IMAGE_DATA_DIRECTORY {

DWORD VirtualAddress;        虚拟地址(表格位置)

DWORD Size;              大小

} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;

关于表格,这里有很多宏定义.

#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 //Export Directory

#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 //Import Directory

#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 //Resource Directory

#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 //Exception Directory

#define IMAGE_DIRECTORY_ENTRY_SECURITY 4 //Security Directory

#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 //Base Relocation Table

#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 //Debug Directory

//IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7//(X86 usage)

#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 //Architecture Specific Data

#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 //RVA of GP

#define IMAGE_DIRECTORY_ENTRY_TLS 9 //TLS Directory

#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 //Load Configuration Directory

#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 //Bound Import Directory in headers

#define IMAGE_DIRECTORY_ENTRY_IAT 12 //Import Address Table

#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 //Delay Load Import Descriptors

#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 //COM Runtime descriptor

它是按照位来计算的.

三丶节表

在NT头下面,紧跟着的是节表

节表是什么意思? 可以理解为分区,就是几个区

那么意思就是保存了区

那么我们猜想一下,都需要什么成员

地址

地址大小

文件中的地址

文件大小

等等....

看下节表的信息吧

typedef struct_IMAGE_SECTION_HEADER {

BYTE Name[IMAGE_SIZEOF_SHORT_NAME];/*节区的名字*/union {

DWORD PhysicalAddress;

DWORD VirtualSize;/*节区的尺寸*/} Misc;

DWORD VirtualAddress;/*虚拟地址 节区的RVA地址(偏移)*/DWORD SizeOfRawData;/*在文件中对齐的尺寸*/DWORD PointerToRawData;/*在文件中的偏移*/DWORD PointerToRelocations;/*在OBJ文件中使用*/DWORD PointerToLinenumbers;/*行号表位置,调试使用*/WORD NumberOfRelocations;/*在OBJ文件中使用*/WORD NumberOfLinenumbers;/*行号表的数量*/DWORD Characteristics;/*节的属性*/} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;

重要成员

1.节的尺寸

2.虚拟地址,RVA(偏移)

3.文件中的大小

4.文件中的偏移

5.节的属性

其中节的属性有很多,(表达这个分区是一个什么样的分区,代码区,常量区等等)

看下宏定义(按位来的,可以看下第二讲的最后关于文件属性的讲解,其中讲解了这个怎么按位来)

#define IMAGE_SCN_CNT_CODE 0x00000020 //Section contains code.

#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 //Section contains initialized data.

#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 //Section contains uninitialized data.

#define IMAGE_SCN_LNK_OTHER 0x00000100 //Reserved.

#define IMAGE_SCN_LNK_INFO 0x00000200 //Section contains comments or some other type of information.

//IMAGE_SCN_TYPE_OVER 0x00000400//Reserved.

#define IMAGE_SCN_LNK_REMOVE 0x00000800 //Section contents will not become part of image.

#define IMAGE_SCN_LNK_COMDAT 0x00001000 //Section contents comdat.

//0x00002000//Reserved.//IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000

#define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000 //Reset speculative exceptions handling bits in the TLB entries for this section.

#define IMAGE_SCN_GPREL 0x00008000 //Section content can be accessed relative to GP

#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 //Section contains extended relocations.

#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 //Section can be discarded.

#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 //Section is not cachable.

#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 //Section is not pageable.

#define IMAGE_SCN_MEM_SHARED 0x10000000 //Section is shareable.

#define IMAGE_SCN_MEM_EXECUTE 0x20000000 //Section is executable.

#define IMAGE_SCN_MEM_READ 0x40000000 //Section is readable.

#define IMAGE_SCN_MEM_WRITE 0x80000000 //Section is writeable.

major头文件_第三讲,可选头文件格式,以及节表相关推荐

  1. java 输入输出头文件_引入的标准头文件与标准输出以及FOR循环

    感觉C学了一遍又一遍,大学学过,工作的时候也学过,奈何一直在弄JAVA,没有怎么用过C,学了就忘,忘了就....算了-- 现在搞音视频开发,又必须弄到这一块了.因此,写点东西回加强记忆.是的,基础本来 ...

  2. cuda加速的头文件_如何从C ++头文件调用CUDA文件?

    I know the method of calling the .cu files from .c files. But now I want to call the .cu files from ...

  3. php头文件是什么,c++万能头文件是什么?

    c++万能头文件是:"#include".头文件是一种包含功能函数.数据接口声明的载体文件:其主要用于保存程序的声明,而定义文件用于保存程序的实现. 在C语言家族程序中,头文件被大 ...

  4. c语言gets函数头文件string.h,string函数头文件

    string.h头文件中有什么函数 string.h头文件中的函数: #include //STL 通用算法 #include //STL 位集容器 #include //复数类 #include / ...

  5. linux major头文件_《Linux设备驱动程序》(四)——字符设备驱动(上)

    之前我们说过,Linux设备主要分为三类:字符设备.块设备和网络接口. 字符设备相对于另外两个设备更加容易理解,同时,这类设备也适合大多数简单的硬件设备,因此,接下来我们学习一下字符设备驱动. 字符驱 ...

  6. major头文件_关于C++中使用头文件gdal_priv.h

    首先声明,我对GDAL的使用一点也不熟,最近需要用它做一些图像的处理,出现问题,如下:我简单的建立了一个工程包含了头文件gdal_priv.h编译通过,连接产生以下错误,请各位高手帮忙指... 首先声 ...

  7. 机试记不住头文件_计算机考研机试攻略

    目录 写在前面的话 2 关于N诺 4 如何使用本书? 5 第一章 从零开始 8 1.1机试分析 8 1.2 IDE的选择与评测结果 10 1.3 DreamJudge的使用 11 1.4输入输出技巧 ...

  8. 单片机sleep函数的头文件_单片机学习day8—单片机IO扩展

    74HC165芯片-并转串 74HC165中文资料.pdf 267.6K · 百度网盘 8位移位寄存器(并行输入,互补串行输出) 时钟输入端 CLK,CLK INK (上升沿有效) A-H 并行数据输 ...

  9. c++ string 头文件_“延期不延学” 第25期 | C++篇 | C/C++常用函数

    在c/c++的课程和课设中,函数的应用都是至关重要的,这里就为大家收集整理了c/c++常用的一些函数,希望大家多加应用以熟练. 1.字符处理函数 本类别函数用于对单个字符进行处理,包括字符的类别测试和 ...

最新文章

  1. boost::geometry::cross_product用法的测试程序
  2. mysql主从配置 windows_windows实现mysql主从配置
  3. VC++CopyFile函数的用法
  4. 2021年最新执子之手唯美表白HTML网站源码
  5. 吴恩达深度学习 —— 2.15 python中的广播
  6. c语言线性拉伸0到255,数字图像处理作业题.doc
  7. windows10使用mklink命令给C盘软件搬家
  8. MySQL数据库增删改查的SQL语句
  9. 在线供应链服务平台方案:构建企业供应链平台业务、功能、技术管理架构
  10. COLORMAP_JET的颜色规律
  11. eclipse连接雷电模拟器,夜神模拟器,逍遥安卓模拟器,天天模拟器,海马玩模拟器,网易MUMU模拟器
  12. 深度学习论文-DAnetExFuseDFN
  13. 功能强大的截图软件——Snipaste
  14. vue3 ref函数用法
  15. SpringBoot+Vue实现前后端分离的学校快递站点管理系统
  16. java 抽取 word,pdf 的四种武器
  17. 亚马逊云服务器防火墙,亚马逊云科技中国区上线Web应用程序防火墙Amazon WAF
  18. 安全修复之Web——【中危】启用了不安全的TLS1.0、TLS1.1协议
  19. CASS或BMF软件命令栏不见了如何调出
  20. oracle 比对数据库表和数据表数据(PL\SQL)

热门文章

  1. java中tcp传图片_Java学习之TCP上传图片
  2. C++之继承探究(十一):多重继承、菱形继承、虚继承、二义性问题及其解决方案
  3. docker 远程连接 文件看不到_Java 开发提升十倍生产力:IDEA 远程一键部署 Spring Boot 到 Docker...
  4. 智伴机器人广西团队_{智伴AI机器人}陈涛广西南宁防城港城市合伙人-人工智能下一个风口精准蓝...
  5. java 多线程 临界区_【Java并发性和多线程】竞态条件与临界区
  6. go中的goroutine协程
  7. go语言struct各种定义和用法
  8. mipi的dsi全称_MIPI扫盲——DSI介绍(二)
  9. python猴子吃桃子的问题_非人哉:明星带货却生意惨淡,猴哥心太大,这一帮猴子猴孙不省心...
  10. php字符串如何比较大小写,PHP字符串函数strcmp(二进制安全比较字符串,区分大小写)...