PE头结构学习-----PE头移位

来源:互联网 发布:淘宝云客服登录网址 编辑:程序博客网 时间:2024/05/09 19:21

刚开始学pe结构的时候,是为了搞免杀来刷钻的,那时瑞星和江民还有希望,那时卡饭论坛还常驻各个杀毒软件厂商的工程师,想想还有些怀念,初中基本啥也不懂,就上论坛看别人是怎么搞的,有一次看到一个免杀技术叫pe头移位,后来这个技术也用了蛮久。刚好现在上了操作系统这门课,作业就是要研究下pe结构,所以就以pe头移位为目标,看看其中的原理到底是啥。

PE头是一个 IMAGE_NT_HEADERS的结构。其中包含了很多PE文件被载入内存的时候需要用到的重要域。执行体在支持PE文件结构的操作系统中执行守,PE装载器将从DOS MZ Header 中找到PE header 的起始偏移量。因而跳过DOS Stub 直接定位真正的文件头 PE Header。免杀俗称为PE头。    PE头的读取位置:MZ STUB里有许多其他的域对于MS-DOS操作系统来说都有用,但是对于Windows NT来说,这个结构中只有一个有用的域——最后一个域e_lfnew,一个4字节的文件偏移量,PE文件头部就是由它定位的。MZ头的E_lfannew参数,位于偏移0x3C_4h处,读取大小为4个字节,高位读取原则。1、PE标志  Signature(04h)50 45 00 00PE Header是紧跟在MS-DOS头部和实模式程序残余之后的。2、PE头结构  Image_NT_Headers(14h)   紧接PE文件头标志之后是PE文件头结构,由20个字节组成。3、可选PE头  Image_optional_Header(E0h)   文件头下面就是可选择头,这是一个叫做IMAGE_OPTIONAL_HEADER的结构,一般由224个字节组成。虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。可选头部包含了很多关于可执行映像的重要信息。例如,初始的堆栈大小、程序入口点的位置、首选基地址、操作系统版本、段对齐的信息等。A、标准域(1Ch)B、NT附加域(44h)C、目录表(80h)通过以上结构,如果有特征码定位在PE头,我们就可以相应的对其进行判断是否为真实特征码,并做相应的更改以达到免杀。   几处与免杀有关的结构体:*SizeOfOptionalHeader:PE可选头大小。PE加载器用来检验PE文件正确性。 TimeDateStamp:文件建立的时间。可用这个值来区分同一个文件的不同的版本,即使它们的商业版本号相同。这个值的格式并没有明确的规定,但是很显然地大多数的C编译器都把它定为从1970.1.1 00:00:00以来的秒数(time_t)。这个值有时也被用做绑定输入目录表。可用LOADPE工具进行编译。AddressOfEntryPoint:代码的入口RVA地址——入口点,程序从这儿开始执行,常称为程序的原入口点OEP(Original Entry Point)。*ImageBase:载入程序首选的RVA地址——基址。这个地址可被Loader(非PE LOADER这个工具)改变。*CheckSum:校验和,仅用在驱动程序中,在可执行文件中可能为0。它的计算方法Microsoft不公开,在imagehelp.dll中的CheckSumMappedFile()函数可以计算它。NumberOfRvaAndSizes:目录表入口个数,这个值不可靠,可用常数IMAGE_NUMBEROF_DIRECTORY_ENTRIES来代替它,这个值在目前Windows版本中设为16*Image_Data_Directory:目录表,每个目录一般有两个值——VirtualAddress:起始RVA地址          Size:长度该目录表的目的是允许PE加载器可迅速地找到一个映像的特定区段(例如输入函数表),而不必遍历映像的每一个区段并逐一比较它们的名字。以下是几处可能被定位为真实特征码的结构体:1、区段个数2、文件创建时间日期3、输出表RVA值及大小4、目录表个数5、输入表大小6、IAT表大小以下是几处可能被定位为误判特征码的结构体1、输入表RVA值2、IAT表RVA值

PE头结构解析:
这里写图片描述
这里写图片描述

mz头之后在3c处是08010000,这是小端序标法,表明了pe头的开始位置在
00000108处

这里写图片描述

50450000是pe头开始的4个标志字节,后面的4c01是机器码(不关键),然后是0600表明共有6个区段,然后是3A7B2A58->582A7B3A是创建时间的标志,可以修改,编码使用loardpe即可查看,pe标志下一行后面的那个e0是可选头的大小(十进制224)
这里写图片描述

0b01->10b即32位结构体如果是20b就是64结构体,反正这是可选头(224字节)的开始,下拉224就是可选头啦
这里写图片描述

查询输入表的偏移知输入表偏移量为80,16进制加法80+108(pe头)=188,定位到188处看到00205200,确实是输入表的位置
这里写图片描述

表和节区的意义是不一样的,之前一直搞混了,这里这个程序一共有6个节区,10个表,节区信息在可选头的后面,紧跟着。所以马上要进行pe头移位的时候要连带着节区信息一起移位

PE头移位:
选中pe头开始到节区信息结束,这个程序是488个字节,全选复制
这里写图片描述

往下面移动一点,将上面额外的信息填充为00
这里写图片描述

修改mz头那里的pe地址信息
这里写图片描述

保存,成功运行,并没有破坏pe结构!!!!nice~~~
这里写图片描述

原创粉丝点击