PE程序底层结构与恶意代码插入与执行的研究

news2025/5/18 21:54:29

Windows PE程序底层结构分析

PE(Portable Executable)是一种Windows操作系统下可执行文件的标准格式

pe101-64.png
Windows PE程序结构和Linux的elf程序结构类似,首先一个名为simple64.exe程序里有一个头文件和一个段文件,头文件里主要存放的是可执行文件的技术详细信息,段文件里主要存放的是可执行文件的内容
image.png
在头文件里的内容有DOS头信息,PE的头信息,optional头信息,数据目录,节表
image.png
头文件里信息的详细内容
image.png
而段文件里主要存放的是程序代码,导入,数据信息
image.png
为了更好的理解,这里写一个简单的exe程序来进行分析

#include <stdio.h>
int main()
{
   printf("Hello, World!");
   return 0;
}

安装编译工具:

apt-get install g++-mingw-w64-x86-64

编译程序:

x86_64-w64-mingw32-g++ --static test.cpp -o helloword.exe

image.png
将编译好的helloword.exe文件拖入到010 Editor里分析,如果没有010 Editor,也可以用linux里的xxd工具分析
010 Editor下载:

https://www.sweetscape.com/010editor/

图中的4D 5A是一个DOS头数据
image.png
图中紫色的地方提示系统这个程序不是以DOS模式运行的
image.png
50 45就是程序的PE头数据
image.png
在下面有.text .data .rdata .bss段,这些都是程序的节表名称

.text段:存储可执行代码(机器指令),即程序的指令部分
.data段:存储已初始化的全局变量和静态变量
.rdata段:存储只读数据,例如常量字符串等
.bss段:存储未初始化的全局变量和静态变量

image.png
使用pe-bear工具可以查看更详细的PE程序结构

https://github.com/hasherezade/pe-bear/releases/tag/v0.6.7.3

image.png
比如,这里我就可以查看.rdata段存储的字符串hello world,还可以看到程序当前的汇编指令
image.png
点击.text节,选择导入表,可以看到程序使用的一些dll文件名称,dll相当于是一个库,程序使用的函数都是从这个库里导入的
image.png
无论是PE或者ELF文件,里面都有一个entry函数,这个函数很重要,它是程序的入口函数,在分析恶意程序的时候,通常都找不到main函数,这里就需要看entry函数来定位程序主函数
入口函数的作用是指示程序从何处开始执行。它通常包含程序的主要逻辑,初始化代码以及程序的控制流程。在程序运行时,操作系统或运行时环境会找到入口函数,并从该函数开始执行程序的代码
image.png

恶意代码插入与执行

用xdbg导入可执行程序,在最下面,程序有一段都是0的部分,有些文件格式或文件类型在设计时可能会留有预留空间,以便将来添加或扩展文件内容。这些空白区域可能在文件创建时被填充为0,这部分是程序的一块空字节空间,攻击者可以在这个空间里写入恶意代码,通过汇编指令,达到正常运行程序和恶意代码的一个效果,这里用系统的calc.exe程序举例
image.png
image.png
这个区域就是程序的空字节空间,我们先用msf生成一段shellcode代码
启动msf,使用payload/windows/exec模块,如果要生成64位的shellcode就使用payload/windows/x64/exec模块,这里calc.exe程序是32位的,所以要用32位的模块
image.png
可生成cmd执行的命令,设置完成后用generate -f raw -o 命令输出内容到指定文件里,这里我的shellcode是打开一个文本文档
image.png
使用xxd可以看到shellcode的十六进制
image.png
回到xdbg,启动程序到entry point处,无论是PE或者ELF文件,里面都有一个entry函数,这个函数很重要,它是程序的入口函数,入口函数的作用是指示程序从何处开始执行。它通常包含程序的主要逻辑,初始化代码以及程序的控制流程。在程序运行时,操作系统或运行时环境会找到入口函数,并从该函数开始执行程序的代码
image.png
复制这一行,记录下来

003C1CE0 <c | E8 3EFCFFFF                        | call calc.3C1923                                        |

然后去到程序空字节区域,复制记录第一行
image.png

003C20C4    | 0000                               | add byte ptr ds:[eax],al                                |

回到entry函数处,选中entry函数,按下空格编辑汇编指令,jmp到0x003C20C4空字节空间处

jmp 0x003C20C4

image.png
双击函数,会自动跳转到指定的内存地址,现在我们要先push两个寄存器,之后才能写入shellcode

pushad

push ad指令在32位程序下有用,它的作用是将所有通用寄存器push到栈中,比如EAX, ECX, EDX, EBX这些32位寄存器

pushfd

push fd指令作用是将标志寄存器压入堆栈,这个寄存器包含了各种处理器状态和控制标志位,比如条件码、中断允许位等
image.png
然后用010 Editor或者win hex工具打开刚刚msf生成的shellcode文件,复制文件里的十六进制值,回到xdbg的空字节空间,在刚刚添加汇编指令的下一行长按鼠标,框选一段区域,然后按下ctrl+e,将十六进制值粘贴进去
image.png
点击确定后,就能看到shellcode的汇编指令
image.png
为了使程序正常运行,我们还需要jmp回之前entry函数调用的地址,首先需要pop出之前push进去的寄存器指令,使堆栈平衡,在程序最后一行的后一行写入,因为程序最后一行的空指令处代表的是shellcode的结束地址

popfd
popad

image.png
然后写入之前entry原来的指令,让程序正常运行

call 0x003C1923

跳转到entry函数下一行指令处,正常执行程序
image.png

jmp 0x003C1CE5

image.png
最后用jmp指令替换掉shellcode后的退出指令,因为我们要正常打开calc.exe程序
image.png
跳转到popfd处

jmp 0x00F9218B

image.png
选择xdbg任务栏里的创可贴图标,保存修改后的文件
image.png
image.png
运行保存后的文件,程序会运行计算器和文本文档
image.png
这里还是推荐自己写汇编指令,用msf生成的shellcode特征太明显,容易被查杀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1594303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STL】priority_queue的底层原理及其实现

文章目录 priority_queue的介绍库中priority_queue的使用什么叫仿函数&#xff1f; 模拟实现prioprity_queue类 priority_queue的介绍 解释以上内容 priority_queue&#xff08;优先级队列&#xff09;跟stack、queue一样&#xff0c;都是一种容器适配器&#xff0c;根据严格的…

产生死锁的四个必要条件

产生死锁的四个必要条件 互斥使用: 一个资源每次只能被一个线程使用。这意味着如果一个线程已经获取了某个资源&#xff08;比如锁&#xff09;&#xff0c;那么其他线程就必须等待&#xff0c;直到该线程释放资源。 不可抢占: 已经获得资源的线程在释放资源之前&#xff0c;不…

[leetcode] all-nodes-distance-k-in-binary-tree 二叉树中所有距离为 K 的结点

. - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树&#xff08;具有根结点 root&#xff09;&#xff0c; 一个目标结点 target &#xff0c;和一个整数值 k 。 返回到目标结点 target 距离为 k 的所有结点的值的列表。 答案可以以 任何顺序 返回。 示例 1&#xff1a…

一文了解ERC404协议

一、ERC404基础讲解 1、什么是ERC404协议 ERC404协议是一种实验性的、混合的ERC20/ERC721实现的&#xff0c;具有原生流动性和碎片化的协议。即该协议可让NFT像代币一样进行拆分交易。是一个图币的互换协议。具有原生流动性和碎片化的协议。 这意味着通过 ERC404 协议&#xf…

键值数据库Redis——Windows环境下载安装+命令行基本操作+Java操纵Redis

文章目录 前言一、下载与安装&#xff08;Windows环境&#xff09;** 检查数据库连接状态 **** 查看Redis数据库信息 ** 二、Redis五种数据结构与基本操作获取所有的key——keys *清空所有的key——flushall2.1 字符串操作2.2 散列操作2.3 列表操作2.4 集合操作2.5 位图操作 三…

【Java EE】 IoC详解(Bean的存储)

文章目录 &#x1f38d;Controller&#xff08;控制器存储&#xff09;&#x1f338;如何从Spring容器中获取对象&#xff08;ApplicationContext&#xff09;&#x1f338;获取bean对象的其他方式&#xff08;BeanFactory&#xff09;&#x1f338;Bean 命名约定&#x1f338;…

Java调用http接口的几种方式(HttpURLConnection、OKHttp、HttpClient、RestTemplate)

Java作为后端语言是开发接口实现功能供客户端调用接口&#xff0c;这些客户端中最主要是本项目的前端&#xff1b;但有时候也需要Java请求其他的接口&#xff0c;比如需要长连接转短链接&#xff08;请求百度的一个接口可以实现&#xff09;、获取三方OSS签名、微信小程序签名、…

数据结构(六)----串

目录 1.串的定义 2.串的基本操作 3.串的存储结构 (1)串的定义 •顺序存储 •链式存储 (2)求串长 (3)求子串 (4)比较串的大小 (5)定位操作 4.字符串的模式匹配 (1)朴素模式匹配算法 (2)KMP算法 •求模式串中的next数组&#xff08;重点&#xff09; •练习&#…

第四百六十回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容&#xff0c;本章回中将介绍如何获取时间戳.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

适配器模式:连接不兼容接口的桥梁

在软件开发中&#xff0c;适配器模式是一种结构型设计模式&#xff0c;它允许不兼容的接口之间进行交互&#xff0c;从而使它们能够一起工作。这个模式经常用于系统升级或集成第三方库的时候&#xff0c;当现有的代码无法直接使用新系统或库提供的接口时&#xff0c;适配器可以…

基于Java+Vue的中国咖啡文化宣传网站(源码+文档+包运行)

一.系统概述 本课题是根据咖啡文化宣传需要以及网络的优势建立的一个中国咖啡文化宣传网站&#xff0c;来实现中国咖啡文化宣传以及咖啡商品售卖的功能。 本中国咖啡文化宣传网站应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于SSMVue框架开发。在网站的整个开发…

【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框

往期回顾 【QT入门】Qt自定义控件与样式设计之qss的加载方式-CSDN博客 【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件-CSDN博客 【QT入门】Qt自定义控件与样式设计之鼠标相对、绝对位置、窗口位置、控件位置-CSDN博客 【QT入门】Qt自定义控件与样式设计之自定义QLin…

找不到mfc110u.dll怎么办,总结5种有效的解决方法

在日常操作计算机的过程中&#xff0c;我们时常会遭遇各类突发状况&#xff0c;其中一种颇为常见的问题便是当试图运行某个特定软件时&#xff0c;系统突然弹出一则令人困扰的错误提示&#xff1a;“由于找不到mfc110u.dll&#xff0c;无法继续执行代码”。这个问题通常是由于缺…

Vol.44 一个分享网站的网站,每个月8.7万访问量

哈咯&#xff0c;各位朋友好啊&#xff0c;我是欧维&#xff0c;今天要给大家分享的网址是Fuun.fun&#xff0c;奇趣网站收藏家&#xff1b; 它的网址是&#xff1a;FUUN.FUN 这是一个我经常逛的网站&#xff0c;为什么我经常逛呢&#xff1f;因为可以从中发现一些有意思的网站…

Vol.46 一个在线小游戏网站,每个月50万访问量

大家好&#xff0c;我是欧维Ove&#xff0c;今天要给大家分享的网站是&#xff1a;小霸王&#xff0c;这是一个可以在线玩小霸王游戏的网站&#xff0c;网址是&#xff1a;小霸王&#xff0c;其樂無窮。紅白機&#xff0c;FC線上遊戲&#xff0c;街機遊戲&#xff0c;街機線上&…

一种驱动器的功能安全架构介绍

下图提供了驱动器实现安全功能的架构 具有如下特点&#xff1a; 1.通用基于总线或者非总线的架构。可以实现ethercat的FSOE&#xff0c;profinet的profisafe&#xff0c;或者伺服本体安全DIO现实安全功能。 2.基于1oo2D架构&#xff0c;安全等级可以达到sil3。 3.高可用性。单…

第17天:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

第十七天 本课意义 1.CMS识别到后期漏洞利用和代码审计 2.开发框架识别到后期漏洞利用和代码审计 3.开发组件识别到后期漏洞利用和代码审计 一、CMS指纹识别-不出网程序识别 1.概念 CMS指纹识别一般能识别到的都是以PHP语言开发的网页为主&#xff0c;其他语言开发的网页识…

攻防世界---Web_php_include

1.题目链接 2.补充知识&#xff1a; 3.构造&#xff1a;执行成功 /?pagedata://text/plain,<?php phpinfo()?> 4.构造下面url&#xff0c;得到目录路径 /?pagedata://text/plain,<?php echo $_SERVER[DOCUMENT_ROOT]?> 5构造下面url&#xff0c;读取该路径的…

Alibaba --- 如何写好 Prompt ?

如何写好 Prompt 提示工程&#xff08;Prompt Engineering&#xff09;是一项通过优化提示词&#xff08;Prompt&#xff09;和生成策略&#xff0c;从而获得更好的模型返回结果的工程技术。总体而言&#xff0c;其实现逻辑如下&#xff1a; &#xff08;注&#xff1a;示例图…

【C++杂货铺】模板进阶

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 泛型编程 &#x1f4c1; 函数模板 &#x1f4c2; 概念 &#x1f4c2; 格式 &#x1f4c2; class 和 typename &#x1f4c2; 原理 &#x1f4c2; 函数模板实例化 &#x1f4c2; 匹配原则 &#x1f4c1; 类模板 &#x1…