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

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

这段时间一直在学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头位置。如上图。

运行成功。

PE文件格式学习之PE头移位的更多相关文章

  1. PE文件结构学习

    PE:Portable Executable File Format(可移植的执行体).Windows平台主流可执行文件格式..exe与.dll文件都是PE格式.32位的叫做PE32,64位的叫做PE ...

  2. PE文件格式偏移参考

    在进行PE文件格式病毒分析的时候,经常要使用到PE文件格式的解析,尤其是对LoadPE形式的病毒的分析,经常要查看PE文件格式的偏移,特地从博客<PE文件格式的偏移参考>中转载收录一份,之 ...

  3. PE文件格式详解,第二讲,NT头文件格式,以及文件头格式

    PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...

  4. PE文件格式详解,第一讲,DOS头文件格式

    PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...

  5. PE文件格式详解,第三讲,可选头文件格式,以及节表

    PE文件格式详解,第三讲,可选头文件格式,以及节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶可选头结构以及作 ...

  6. PE文件学习系列二 DOS头分析

    合肥程序员群:49313181.    合肥实名程序员群 :128131462 (不愿透露姓名和信息者勿加入)Q  Q:408365330     E-Mail:egojit@qq.com PE文件结 ...

  7. 逆向学习-PE文件格式

    从DOS头到节区头是PE头部分,其下的节区合称PE体.文件中使用偏移(offset),内存中使用VA(Virtual Address,虚拟地址)来表示位置.文件加载到内存时,情况就会发生变化(节区的大 ...

  8. Reverse Core 第二部分 - 13章 - PE文件格式

    @date: 2016/11/24 @author: dlive ​ PE (portable executable) ,它是微软在Unix平台的COFF(Common Object File For ...

  9. 深入理解 Win32 PE 文件格式

    深入理解 Win32 PE 文件格式 Matt Pietrek 这篇文章假定你熟悉C++和Win32. 概述 理解可移植可执行文件格式(PE)可以更好地了解操作系统.如果你知道DLL和EXE中都有些什 ...

随机推荐

  1. Java 之 JUC

    1. JUC 简介 在 Java 5.0 提供了 java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类, 用于定义类似于线程的自定义子系统,包括线程池,异 ...

  2. Linux命令(1)——xargs命令

    1.功能: xargs能够将stdin中以空格或换行符进行分隔的数据.形成以空格分隔的參数(arguments),传递给其它命令.由于以空格作为分隔符,所以有一些文件名称或者其它意义的名词内含有空格的 ...

  3. 安全篇:弱密码python检测工具

    安全篇:弱密码python检测工具 https://github.com/penoxcn/PyWeakPwdAudit

  4. (2.1)备份与还原--sql server文件的概念及操作

    概述:sql server是以文件形式存储数据与日志 1.数据文件 sql server数据文件分为2类 (1)主数据库文件 主数据库文件包含数据库的启动信息.系统对象,并指向数据库的其他文件(从数据 ...

  5. 16.遇到就jar mismatch! Fix your dependencies的问题

    这是因为两个项目的jar包(android-support-v4.jar)不一致. 解决方法是把2个jar都删除,然后各自加上最新的jar包 但是换了之后发现R文件编不出来,原因是minsdk的设置问 ...

  6. java 多线程 day15 CyclicBarrier 路障

    import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.ut ...

  7. Kafka笔记整理(二):Kafka Java API使用

    下面的测试代码使用的都是下面的topic: $ kafka-topics.sh --describe hadoop --zookeeper uplooking01:,uplooking02:,uplo ...

  8. centos 解决error: rpmdbNextIterator问题 (转)

    昨天重装RedHat4以后出现了下面这个问题 [root@RedHat4 ~]# rpm -qa |grep vimerror: rpmdbNextIterator: skipping h#      ...

  9. Andriod实现推送的解决方案(转)

    Andriod上实现消息推送的一般解决策略 第一种解决方案:C2DM云端推送功能 在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,该服务 ...

  10. usermod命令、用户密码管理、mkpasswd命令

    3.4 usermod命令--更改用户帐户属性 -a|--append ##把用户追加到某些组中,仅与-G选项一起使用 -G|--groups ##把用户追加到某些组中,仅与-a选项一起使用:把该用户 ...