[网络安全自学篇] 六十二.PE文件逆向之PE文件解析、PE编辑工具使用和PE结构修改(三)

本系列虽然叫“网络安全自学篇”,但因为系统安全、软件安全与网络安全息息相关,做者一样会分享一些系统安全案例及基础工具用法,也是记录本身的成长史,但愿你们喜欢,一块儿进步。前文分享了数字签名,采用Signtool工具对EXE文件进行签名,接着利用Asn1View、PEVie、010Editor等工具进行数据提取和分析。本文将详细介绍PE文件格式,熟悉各类PE编辑查看工具,针对目标EXE程序新增对话框等,这也为后续PE病毒和恶意代码的攻防打下扎实基础。但愿这篇基础文章对您有所帮助~php

使用工具:html

  • PEView、Stud_PE
  • UltraEdit、010Editor
  • Ollydbg、x64dbg
  • exeScope
    待分析程序:
  • hello-2.5.exe

做者做为网络安全的小白,分享一些自学基础教程给你们,主要是关于安全工具和实践操做的在线笔记,但愿您们喜欢。同时,更但愿您能与我一块儿操做和进步,后续将深刻学习网络安全和系统安全知识并分享相关实验。总之,但愿该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!若是文章对您有帮助,将是我创做的最大动力,点赞、评论、私聊都可,一块儿加油喔~git

PS:本文参考了安全网站和参考文献中的文章(详见参考文献),并结合本身的经验和实践进行撰写,也推荐你们阅读参考文献。github

软件安全:https://github.com/eastmountyxz/Software-Security-Course
其余工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
基础工具:https://github.com/eastmountyxz/Security-Software-Basedweb


声明:本人坚定反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络须要咱们共同维护,更推荐你们了解它们背后的原理,更好地进行防御。正则表达式

前文学习:
[网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例
[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登陆加密入门笔记
[网络安全自学篇] 三.Burp Suite工具安装配置、Proxy基础用法及暴库示例
[网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
[网络安全自学篇] 五.IDA Pro反汇编工具初识及逆向工程解密实战
[网络安全自学篇] 六.OllyDbg动态分析工具基础用法及Crakeme逆向
[网络安全自学篇] 七.快手视频下载之Chrome浏览器Network分析及Python爬虫探讨
[网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster工具
[网络安全自学篇] 九.社会工程学之基础概念、IP获取、IP物理定位、文件属性
[网络安全自学篇] 十.论文之基于机器学习算法的主机恶意代码
[网络安全自学篇] 十一.虚拟机VMware+Kali安装入门及Sqlmap基本用法
[网络安全自学篇] 十二.Wireshark安装入门及抓取网站用户名密码(一)
[网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
[网络安全自学篇] 十四.Python攻防之基础常识、正则表达式、Web编程和套接字通讯(一)
[网络安全自学篇] 十五.Python攻防之多线程、C段扫描和数据库编程(二)
[网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站暴库防御
[网络安全自学篇] 十七.Python攻防之构建Web目录扫描器及ip代理池(四)
[网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
[网络安全自学篇] 十九.Powershell基础入门及常见用法(一)
[网络安全自学篇] 二十.Powershell基础入门及常见用法(二)
[网络安全自学篇] 二十一.GeekPwn极客大赛之安全攻防技术总结及ShowTime
[网络安全自学篇] 二十二.Web渗透之网站信息、域名信息、端口信息、敏感信息及指纹信息收集
[网络安全自学篇] 二十三.基于机器学习的恶意请求识别及安全领域中的机器学习
[网络安全自学篇] 二十四.基于机器学习的恶意代码识别及人工智能中的恶意代码检测
[网络安全自学篇] 二十五.Web安全学习路线及木马、病毒和防护初探
[网络安全自学篇] 二十六.Shodan搜索引擎详解及Python命令行调用
[网络安全自学篇] 二十七.Sqlmap基础用法、CTF实战及请求参数设置(一)
[网络安全自学篇] 二十八.文件上传漏洞和Caidao入门及防护原理(一)
[网络安全自学篇] 二十九.文件上传漏洞和IIS6.0解析漏洞及防护原理(二)
[网络安全自学篇] 三十.文件上传漏洞、编辑器漏洞和IIS高版本漏洞及防护(三)
[网络安全自学篇] 三十一.文件上传漏洞之Upload-labs靶场及CTF题目01-10(四)
[网络安全自学篇] 三十二.文件上传漏洞之Upload-labs靶场及CTF题目11-20(五)
[网络安全自学篇] 三十三.文件上传漏洞之绕狗一句话原理和绕过安全狗(六)
[网络安全自学篇] 三十四.Windows系统漏洞之5次Shift漏洞启动计算机
[网络安全自学篇] 三十五.恶意代码攻击溯源及恶意样本分析
[网络安全自学篇] 三十六.WinRAR漏洞复现(CVE-2018-20250)及恶意软件自启动劫持
[网络安全自学篇] 三十七.Web渗透提升班之hack the box在线靶场注册及入门知识(一)
[网络安全自学篇] 三十八.hack the box渗透之BurpSuite和Hydra密码爆破及Python加密Post请求(二)
[网络安全自学篇] 三十九.hack the box渗透之DirBuster扫描路径及Sqlmap高级注入用法(三)
[网络安全自学篇] 四十.phpMyAdmin 4.8.1后台文件包含漏洞复现及详解(CVE-2018-12613)
[网络安全自学篇] 四十一.中间人攻击和ARP欺骗原理详解及漏洞还原
[网络安全自学篇] 四十二.DNS欺骗和钓鱼网站原理详解及漏洞还原
[网络安全自学篇] 四十三.木马原理详解、远程服务器IPC$漏洞及木马植入实验
[网络安全自学篇] 四十四.Windows远程桌面服务漏洞(CVE-2019-0708)复现及详解
[网络安全自学篇] 四十五.病毒详解及批处理病毒制做(自启动、修改密码、定时关机、蓝屏、进程关闭)
[网络安全自学篇] 四十六.微软证书漏洞CVE-2020-0601 (上)Windows验证机制及可执行文件签名复现
[网络安全自学篇] 四十七.微软证书漏洞CVE-2020-0601 (下)Windows证书签名及HTTPS网站劫持
[网络安全自学篇] 四十八.Cracer第八期——(1)安全术语、Web渗透流程、Windows基础、注册表及黑客经常使用DOS命令
[网络安全自学篇] 四十九.Procmon软件基本用法及文件进程、注册表查看
[网络安全自学篇] 五十.虚拟机基础之安装XP系统、文件共享、网络快照设置及Wireshark抓取BBS密码
[网络安全自学篇] 五十一.恶意样本分析及HGZ木马控制目标服务器
[网络安全自学篇] 五十二.Windows漏洞利用之栈溢出原理和栈保护GS机制
[网络安全自学篇] 五十三.Windows漏洞利用之Metasploit实现栈溢出攻击及反弹shell
[网络安全自学篇] 五十四.Windows漏洞利用之基于SEH异常处理机制的栈溢出攻击及shell提取
[网络安全自学篇] 五十五.Windows漏洞利用之构建ROP链绕过DEP并获取Shell
[网络安全自学篇] 五十六.i春秋老师分享小白渗透之路及Web渗透技术总结
[网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)
[网络安全自学篇] 五十八.Windows漏洞利用之再看CVE-2019-0708及Metasploit反弹shell
[网络安全自学篇] 五十九.Windows漏洞利用之MS08-067远程代码执行漏洞复现及shell深度提权
[网络安全自学篇] 六十.Cracer第八期——(2)五万字总结Linux基础知识和经常使用渗透命令
[网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析及Signcode、PEView、010Editor、Asn1View等工具用法(二)算法


前文欣赏:
[渗透&攻防] 一.从数据库原理学习网络攻防及防止SQL注入
[渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法
[渗透&攻防] 三.数据库之差别备份及Caidao利器
[渗透&攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包shell



一.PE文件基础

什么是PE文件?
PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操做系统上的程序文件(多是间接被执行,如DLL)。数据库

EXE文件格式:编程

  • DOS:MZ格式
  • WIndows 3.0/3.1:NE(New Executable)、16位Windows可执行文件格式

为何要重点学习这种文件格式呢?

  • PE文件是可移植、可执行、跨Win32平台的文件格式
  • 全部Win32执行体(exe、dll、kernel mode drivers)
  • 知道PE文件本质后,能更好进行恶意样本分析、APT攻击分析、勒索病毒分析
  • 了解软件加密和加壳的思想,可以PJ相关的PE文件
  • 它是您熟悉Windows操做系统的第一步,包括EXE程序怎么映射到内存,DLL怎么导入等
  • 软件逆向工程的基本思想与PE文件格式息息相关
  • 若是您想成为一名黑客、系统安全工程师,那么精通PE文件是很是必要的

可执行程序是具备不一样的形态的,好比用户眼中的QQ以下图所示。

在这里插入图片描述

在这里插入图片描述

本质上,QQ以下图所示。

在这里插入图片描述


PE文件格式整体结构
接着让咱们来欣赏下PE文件格式整体结构图,包括:MZ头部、DOS stub、PE文件头、可选文件头、节表、节等。

在这里插入图片描述

本文的第二部分咱们将对PE文件格式进行详细解析。好比,MZ头文件是定位PE文件头开始位置,用于PE文件合法性检测。DOS下运行该程序时,会提示用户“This Program cannot be run in DOS mode”。

在这里插入图片描述

PE文件格式与恶意软件的关系

  • 何为文件感染或控制权获取?
    使目标PE文件具有或启动病毒功能(或目标程序)
    不破坏目标PE文件原有功能和外在形态(如图标)等
  • 病毒代码如何与目标PE文件融为一体呢?
    代码植入
    控制权获取
    图标更改
    Hook

PE文件解析经常使用工具包括:

  • PEView:可按照PE文件格式对目标文件的各字段进行详细解析。
  • Stud_PE:可按照PE文件格式对目标文件的各字段进行详细解析。
  • Ollydbg:可跟踪目标程序的执行过程,属于用户态调试工具。
  • UltraEdit \ 010Editor:可对目标文件进行16进制查看和修改。


二.PE文件格式解析

该部分实验内容:

  • 使用010Editor观察PE文件例子程序hello-2.5.exe的16进制数据
  • 使用Ollydbg对该程序进行初步调试,了解该程序功能结构,在内存中观察该程序的完整结构
  • 使用010Editor修改该程序,使得该程序仅弹出第二个对话框

1.010Editor解析PE文件

PE文件结构以下图所示,我推荐你们使用010Editor工具及其模板来进行PE文件分析。
MZ头部+DOS stub+PE文件头+可选文件头+节表+节

在这里插入图片描述


(1) 使用010Editor工具打开PE文件,并运行模板。
该PE文件可分为若干结构,以下图所示。

在这里插入图片描述


(2) MZ文件头(000h-03fh)。
下图为hello-2.5.exe的MZ文件头,该部分固定大小为40H个字节。偏移3cH处字段Offset to New EXE Header,指示“NT映象头的偏移地址”,其中000000B0是NT映象头的文件偏移地址,定位PE文件头开始位置,用于PE文件合法性检验。

在这里插入图片描述

000000B0指向PE文件头开始位置。

在这里插入图片描述


(3) DOS插桩程序(040h-0afh)
DOS Stub部分大小不固定,位于MZ文件头和NT映象头之间,可由MZ文件头中的Offset to New EXE Header字段肯定。下图为hello-2.5.exe中的该部份内容。

在这里插入图片描述


(4) PE文件头(0b0h-1a7h)
该部分包括PE标识、映像文件头、可选文件头。

  • Signature:字串“PE\0\0”,4个字节(0b0H~0b4H)
  • 映象文件头File Header:14H个字节(0b5H~0c7H)
    偏移2H处,字段Number of Section 给出节的个数(2个字节):0003
    偏移10H处,字段Size of Optional Header 给出可选映象头的大小(2个字节):00E0
  • 可选映象头Optional Header:0c8H~1a7H

在这里插入图片描述

对应解析以下图所示,包括PE标识、X86架构、3个节、文件生成时间、COFF便宜、可选头大小、文件信息标记等。

在这里插入图片描述

010Editor使用模板定位PE文件各节点信息。

在这里插入图片描述

PE文件可选文件头224字节,其对应的字段信息以下所示:

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;

(5) 节表(1a8h-21fh)

  • 表项大小固定,28H个字节;表项个数由映象文件头的字段Number of Section 给出。
  • 每一个表项的起始位置起(8个字节),字段Name给出对应节的名称。
  • 每一个表项的偏移14H处(4个字节),字段Offset to Raw Data给出对应节的起始文件偏移。

在这里插入图片描述

该结构包括3个节,对应上图的3个struct IMAGE_SECTION_HEADER,即“.test”、“.rdata”、“.data”节,其偏移地址对应下图紫色区域,分别是400、600、800的位置。

在这里插入图片描述


(6) 3个节

  • 400H-5ffH:代码节
  • 600H-7ffH:引入函数节
  • 800H-9ffH:数据节

在这里插入图片描述

注意,代码节“.text”前46H为数据,后面全是0位填充值,为了实现文件的200H对齐,因此代码节是400H到5ffH。

在这里插入图片描述


(7) 引入函数节
⽤来从其余DLL中引⼊函数,引入了kernel32.dll和user32.dll,这个节通常名为“.rdata”。引入函数是被某模块调用的但又不在调用者模块中的函数,用来从其余(系统或第三方写的)DLL中引入函数,例如kernel32.dll、gdi32.dll等。

在这里插入图片描述

010Editor打开以下图所示:

在这里插入图片描述

详细标注信息以下图所示:(图引自HYQ同窗,再此感谢)

在这里插入图片描述


(8) 数据节
数据节实际大小58h,对齐后大小200h,地址为800h-9ffh,包括对话框弹出的具体内容。

在这里插入图片描述



2.Ollydbg动态调试程序

使用Ollydbg对该程序进行初步调试,了解该程序功能结构,在内存中观察该程序的完整结构。注意,内存对齐单位和文件对齐单位的不一样,内容和文件中IAT表内容的不一样。

第一步,打开OD加载PE文件。
OD是一款PE文件动态调试器,此时程序断点自动中止在程序入口点00401000H位置。

在这里插入图片描述

在010Editor中,咱们能够看到,该PE程序基地址是400000h,程序入口地址是1000h,两个相加为加载至内存中的地址,即401000h。

在这里插入图片描述


第二步,动态调试程序。
当咱们双击地址位置,则能够下断点且变红,好比0040100Fh。

在这里插入图片描述

接着查看对应调试快捷键,F7是单步步入,F8是单步步过。

在这里插入图片描述

咱们直接按F8单步步过,此时的位置会CALL一个MessageBoxA函数。

在这里插入图片描述

直接单步步过,此时会弹出第一个对话框,点击“肯定”按钮。

在这里插入图片描述


第三步,动态调试程序之数据跟随。
接着咱们看左下角部分的内存数据,在该区域按下“Ctrl+G”在数据窗口中跟随,输入基地址400000。

在这里插入图片描述

此时能够看到加载到内存中的数据,能够看到该数据与010Editor打开的PE文件数据一致的。

在这里插入图片描述

接着继续按F8单步步过弹出第二个窗口。

在这里插入图片描述

右上角是它寄存器的值,包括各个寄存器中的数据,咱们实验中主要使用的寄存器包括EAX、ECX、EDX、EBX等。

在这里插入图片描述

接着步过0040102E,它是退出进程ExitProcess的位置,此时进程已经终止,以下图所示。

在这里插入图片描述

实验讲到这里,使用OD动态调试的PE文件的基础流程就讲解完毕,后续随着实验深刻,咱们还会使用该工具。



3.仅弹出第二个窗口

使用010Editor修改该程序,使得该程序仅弹出第二个对话框。思路为:修改程序的入口点地址。

第一步,肯定程序入口点地址。
前面咱们用010Editor(或PEView)肯定了可选文件头中Adress od Entry Point这一项,里面的值是1000h,这个是RVA相对便宜地址,偏移在D8处大小为4字节。装载到内存后,程序入口点应该是401000h。

在这里插入图片描述


第二步,肯定第二个对话框的偏移地址。
而后看到OD里,为第二个call作传入参数的push语句从401016开始,故咱们将1000改成1016便可弹出第二个窗口。

在这里插入图片描述


第三步,利用PE编辑工具修改程序入口地址。
注意,能够在PE模板中修改该值,将AddressOfEntryPoint修改成1016h

在这里插入图片描述


第四步,双击运行仅弹出第二个对话框。

在这里插入图片描述



三.熟悉并分析PE文件的引出表

实验内容:

  • 熟悉各种PE文件格式查看和编辑工具,如PEView、Stud_PE等
  • 结合hello-2.5.exe熟悉PE文件头部、引入表的结构,熟悉函数导入的基本原理
  • 找到系统System32目录下的user32.dll文件,用010Editor打开并分析该文件引出表,找出函数MessageBoxA的地址,并验证该地址是否正确

在文件中的引入表结构:IMAGE_IMPORT_DESCRIPTOR

在这里插入图片描述

在内存中的引入表结构:IMAGE_IMPORT_DESCRIPTOR

在这里插入图片描述



1.PEView和Stud_PE查看文件

(1) 使用PEView查看文件属性
PEview.exe工具是一款能够进行PE文件解析的强大PE文件解析工具,经过PEview软件能够分析PE文件的详细格式。以下图所示,左边是相应结构,右边是对应的数据。PEView虽然能读写PE文件的数字化模板,但做者更推荐使用010Editor编辑。

ImageBase: PE文件在内存中的优先装载地址。
RVA地址:Relative Virtual Address,相对虚拟地址,它是相对内存中ImageBase的偏移位置。

在这里插入图片描述

好比PE文件头(IMAGE_NT_HEADERS)中,AddressOfEntryPoint为1000h,基地址为400000h。

在这里插入图片描述

下面是导入表信息:

在这里插入图片描述

第一条指令在内存中的地址计算方法以下图所示:

在这里插入图片描述



(2) 使用stud_PE查看文件属性
该软件用于显示头部、DOs、区段、函数等信息,包括导入表、导出表等。

在这里插入图片描述

在这里插入图片描述

显示对应的3个节信息。

在这里插入图片描述

显示该EXE程序加载的两个DLL文件及函数。

在这里插入图片描述



2.寻找函数MessageBoxA的地址

user32.dll是Windows用户界面相关应用程序接口,用于包括Windows处理、基本用户界面等特性。这里采用PEview+STUD_PE方法分析,找到系统System32目录下的user32.dll文件,用010Editor打开并分析该文件引出表,找出函数MessageBoxA的地址,并验证该地址是否正确。

第一步,使用PEView打开user32.dll,查找MessageBoxA的RVA。
找到系统System32目录下的user32.dll文件并打开,在AddressOfNames数组(Name Pointer Table)中找到MessageBoxA字符串,其数组序号为01DD

在这里插入图片描述

在Ordinal Table找到序号(Value)01DD项,Data为01DC;而因为Ordinal Table中Data从0开始,故在Address Table中找到第01DC+1,即01DD项。

在这里插入图片描述

Address Table中01DD项的Data为407EA,也即MessageBoxA的RVA(相对虚拟地址)。

在这里插入图片描述


第二步,获得RVA为38D9后,用Stud_PE打开user32.dll,使用Raw与RVA转换功能,得其VA为77D507EA

在这里插入图片描述


第三步,用OD打开hello-2.5.exe,查看MessageBoxA,两个值并不一致。
用OD调试程序的时候发现其VA地址实际上是74DA0F40,与计算出的77D507EA位置有所误差,而后查找资料发现这应该是操做系统处于安全缘由改变了真实地址。

在这里插入图片描述

以后我在虚拟机的XP环境下进行了相同的实验,其值为77D507EA,彻底一致。注意,user32.dll来自XP操做系统。

在这里插入图片描述

最终得出结论:XP以后的操做系统对真实地址作了相关的保护。



四.PE文件新增对话框

实验内容是手工修改hello-2.5.exe程序,使得其能够弹出第三个对话框(提示框标题为“武汉大学信安病毒实验”,内容为:你的姓名+日期)。基本思路为:

  • 修改.text段:添加MessageBoxA的函数调用
  • 修改.data段:添加MessageBoxA的参数信息
  • 修改.text和.data的节表信息

第一步,使用OD打开目标PE文件。
以下图所示,包括第一个对话框、第二个对话框和退出进程。

在这里插入图片描述


第二步,修改数据区“.data”。

  • Title:RVA是0040 3059
  • Text:RVA是0040 306A

注意,从下图所示的位置开始修改,地址为0040 3059,须要留一个00字符,表示截断符。一样,title和text之间也要用00隔开。

在这里插入图片描述

右键选择“二进制”->“编辑”,其快捷键为Ctrl+E。

在这里插入图片描述

输入标题“武汉大学信安病毒实验”。

在这里插入图片描述

此时标题已经成功写入,接着空一个00,从下图所示位置接着写入正文内容,地址为0040 306A。

在这里插入图片描述

接着写入内容,以下图所示。

在这里插入图片描述

增长内容以下图所示:

在这里插入图片描述

注意,如今咱们只是写入内存,而没有写入PE文件中。



第三步,选中新增内容,右键点击“复制到可执行文件”。

在这里插入图片描述

此时显示以下图所示,成功复制到PE文件中。

在这里插入图片描述


第四步,修改代码段。
咱们须要在代码段第二个对话框以后插入新的数据,从而弹出第三个对话框。须要将下图阴影部分总体后移。

在这里插入图片描述

首先,在0040101B位置进行数据跟随。

在这里插入图片描述

数据跟随显示以下图所示,代码段中每一个弹框是22字节,从“68 40”开始,共计两个弹框。

在这里插入图片描述

接着咱们将退出函数的全部字节复制出来,为了总体后移。
6A 00 E8 01 00 00 00 CC FF 25 00 20 40 00 FF 25 0C 20 40 00 FF 25 08 20 40

在这里插入图片描述

接着空22字节用于填写第三个对话框信息,将复制的二进制数据粘贴出来(Ctrl+E),以下图所示。

在这里插入图片描述

将第一个对话框22字节代码复制至第三个对话框,以下图所示:

在这里插入图片描述



第五步,修改.text段。
第二个栈的参数是它的Title,须要将偏移地址设置为对应的位置。

在这里插入图片描述

右键“数据窗口中跟随”->“当即数”。

在这里插入图片描述

第三个窗口标题的地址修改成“00403059”。

在这里插入图片描述

Ctrl+E修改成59。

在这里插入图片描述

修改第三个窗口Text地址为“0040306A”。

在这里插入图片描述



第六步,修改CALL对应的地址。
注意,三个对话框CALL对应的E8值须要以00401056(user32.MessageBoxA)为基址。

  • 第一个对话框E8:00401056-00401016=40
  • 第二个对话框E8:00401056-0040102C=2A
  • 第三个对话框E8:00401056-00401042=14

在这里插入图片描述

修改以下图所示:

在这里插入图片描述


第七步,保存文件。
选择“复制到可执行文件”->“全部修改”按钮。

在这里插入图片描述

点击“所有复制”。
在这里插入图片描述

最终保存修改的PE文件。

在这里插入图片描述

运行PE文件,成功弹出第三个框。

在这里插入图片描述

新增的内容以下图所示:

在这里插入图片描述

注意:

  • 检查在OD中所作的所有修改,是否保存到可执行文件中。
  • .text和.data节表中,表示节实际大小的字段“Virtual Size”应该作出修改,但不修改文件依然能正常运行。


五.总结

文章写到这里,就介绍完毕,本文主要讲解PE文件解析、PE编辑工具使用和PE结构修改,属于系统安全和PE逆向相关知识,但愿对您有所帮助。内容包括:

  • PE文件基础
  • PE文件格式解析
    – 010Editor解析PE文件
    – Ollydbg动态调试程序
    – 仅弹出第二个窗口
  • 熟悉并分析PE文件的引出表
    – PEView和Stud_PE查看文件
    – 寻找函数MessageBoxA的地址
  • PE文件新增对话框

后续将学习PE文件图标修改、对话框分析、EXE解析、加壳解密等。但愿这系列文章对您有所帮助,同时真的感受本身技术好菜,要学的知识好多。这是第61篇原创的安全系列文章,从网络安全到系统安全,从木马病毒到后门劫持,从恶意代码到溯源分析,从渗透工具到二进制工具,还有Python安全、顶会论文、黑客比赛和漏洞分享。未知攻焉知防,人生漫漫其路远兮,做为初学者,本身真是爬着前行,感谢不少人的帮助,继续爬着,继续加油!

欢迎你们讨论,是否以为这系列文章帮助到您!若是存在不足之处,还请海涵。任何建议均可以评论告知读者,共勉~

武汉加油!湖北加油!中国加油!!!

(By:Eastmount 2020-03-25 晚上9点写于贵阳 http://blog.csdn.net/eastmount )


参考文献:
[1] 武大《软件安全》课程
[2] 师姐PPT、师弟师妹PPT及视频
[3] PE文件格式分析 - Erio
[4] PE文件学习系列一为何是PE - Egojit
[5] 第二章PE文件结构解析 - 百度文库