• PE文件格式学习之PE头移位


    以前刚开始学网络安全,是从免杀开始的。记得那时候杀毒软件还很弱。金山江民瑞星还存在。

    那会什么原理也不懂,就一直瞎鼓捣。(后来转入渗透行列了)

    这段时间一直在学PE格式,突然想起来以前很古老的PE文件头移位。

    网上搜了搜,看大家虽然做了视频,但是竟然没人讲原理。借着刚好在学PE格式的知识,就做个PE文件头移位的笔记。(不喜勿喷,刚学PE头文件格式,难免出错请提点,谢谢)

    当然现在这种很古老的免杀方式对于杀软来说根本是不堪一击了。纯属做笔记。

    PE文件的基本结构如图示:

    IMAGE_DOS_HEADER 定义

    IMAGE_DOS_HEADER STRUCT 
    
    +00h WORD e_magic  // Magic DOS signature MZ(4Dh 5Ah)   DOS可执行文件标记 
    
    +02h  WORD e_cblp   // Bytes on last page of file  
    
    +04h WORD e_cp   // Pages in file
    
    +06h WORD e_crlc   // Relocations
    
    +08h WORD e_cparhdr   // Size of header in paragraphs
    
    +0ah WORD e_minalloc   // Minimun extra paragraphs needs
    
    +0ch WORD e_maxalloc  // Maximun extra paragraphs needs
    
    +0eh WORD e_ss   // intial(relative)SS value   DOS代码的初始化堆栈SS 
    
    +10h WORD e_sp   // intial SP value   DOS代码的初始化堆栈指针SP 
    
    +12h WORD e_csum   // Checksum 
    
    +14h WORD e_ip   //  intial IP value   DOS代码的初始化指令入口[指针IP] 
    
    +16h WORD e_cs   // intial(relative)CS value   DOS代码的初始堆栈入口 CS
    
    +18h WORD e_lfarlc   // File Address of relocation table 
    
    +1ah WORD e_ovno  //  Overlay number 
    
    +1ch WORD e_res[4]  // Reserved words 
    
    +24h WORD e_oemid   //  OEM identifier(for e_oeminfo) 
    
    +26h WORD e_oeminfo  //  OEM information;e_oemid specific  
    
    +29h WORD e_res2[10]  //  Reserved words 
    
    +3ch LONG  e_lfanew  // Offset to start of PE header   指向PE文件头 
    
    IMAGE_DOS_HEADER ENDS
    

    以:nc(瑞士军刀为例)

    用C32ASM载入nc.exe 

    (图1网上转载)

    偏移地址从0字节开始,就是DOS头的EXE MZ标志。也就是5A4D。有了这个标识,DOS就能识别出该程序是不是有效的执行体。(由于INTEL CPU属于LITTLE-ENDIAN类,字符存储时位低在前,高位在后)

    +3ch LONG  e_lfanew  // Offset to start of PE header   指向PE文件头 ,LONG占4个字节

    所以,我们得到了PE文件头偏移地址为00d8。


    IMAGE_FILE_HEADER 结构
    IMAGE_FILE_HEADER STRUCT
    +04h    WORD          Machine;   // 运行平台
    +06h      WORD          NumberOfSections; // 文件的区块数目
    +08h    DWORD         TimeDateStamp;  // 文件创建日期和时间
    +0Ch      DWORD         PointerToSymbolTable; // 指向符号表(主要用于调试)
    +10h     DWORD         NumberOfSymbols;  // 符号表中符号个数(同上)
    +14h      WORD          SizeOfOptionalHeader;  // IMAGE_OPTIONAL_HEADER32 结构大小
    +16h      WORD          Characteristics;  // 文件属性
    IMAGE_FILE_HEADER ENDS

    在这里,我们只需要注意即可。

    +14h      WORD          SizeOfOptionalHeader;  // IMAGE_OPTIONAL_HEADER32 结构大小

    从PE头开始,偏移14H也就是20个字节,得到结构大小。

    结构大小为E0,我们将16换成10进制。就知道该结构有多少个字节。

    将数据复制,往上移动8个字节。

    因为PE头移动位置,需要重新计算PE头大小。

    因为PE头已经移动过位置了,所以需要重新修改PE头大小以及DOS头指向PE头位置。如上图。

    运行成功。

  • 相关阅读:
    【php-04控制流程】
    【php-03函数】
    【php-02-变量】
    【php-01-标记符】
    【CSS 基础面试题】
    【CSS3特效之转化(transform)和过渡(transition)】
    【jsonp】
    【PHP 面试知识梳理】
    OM模块功能&API详解
    EBS 多SHEET页EXCEL动态报表开发过程
  • 原文地址:https://www.cnblogs.com/killbit/p/5994670.html
Copyright © 2020-2023  润新知