DOS头是在16位程序下使用的.所以不用全部关心.只需要关心第一个跟最后一个成员记住即可.
在平时的分析当中,经常会碰到PE结构的文件,虽然 010 Editor 等工具会提供一个模板,把各个部分都详细的标记出来,但是在调试的时候,经常会需要在 VS 等程序框中进行调试,所以,就需要对PE结构有一定的了解,才能够快速定位到自己想要的地方。
PE文件的全称是Portable Executable ,意为可移植的可执行文件,常见的有EXE,DLL,SYS,COM,OCX,PE文件是微软Windows操作系统上的程序文件。
本文视你对PE文件的熟悉程度,初学者,大概会花掉你两个小时左右的时间完全理解。 最近在网上看到有大神做了个161bytes的hello world,正巧毕业前忧郁闲着,就花几个小时的时间把这个程序结构厘清了一遍,算是重新更深入地学习一次PE文件,写下本文和大家交流。 预备工具:一个xp系统,win7下它跑不动。Winhex,记得弄个破解版。其它的一些你习惯的PE查看工具(我试了几个都不能很好解析这个PE,其实PE解析工具就是在模仿windows解析PE文件,如果程序员本身都对PE文件没有一个深入的理解,写出来的工具模仿windows加载器不够像,就不足够应付畸形的却能够正常运行的PE) 下面先附上十六进制。 4D5A0000504500004C010100E97700000000007869616F00280002000B0148656C6C6F20576F726C642100000C0000005553455233320000000040000400000004000000300000009D000000040000000C000000300000000C00000000000000020000000000000000000000000000000000000000000000020000000000000000000000380000006A006813004000681E0040006A00FF159D004000C3DD010080 Copy到winhex里,粘贴选择ASCII Hex,保存即可。 正式进入正题: 缩小PE,一个惯用手段就是把各种PE结构重叠到一起,这样的PE看起来很晦涩,一个数据项往往扮演着多个数据结构的角色。
PE结构是Windows系统下最常用的可执行文件格式,理解PE文件格式不仅可以理解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,DOS头是PE文件开头的一个固定长度的结构体,这个结构体的大小为64字节(0x40)。DOS头包含了很多有用的信息,该信息可以让Windows操作系统使用正确的方式加载可执行文件。从DOS文件头IMAGE_DOS_HEADER的e_lfanew字段向下偏移003CH的位置,就是真正的PE文件头的位置,该文件头是由IMAGE_NT_HEADERS结构定义的,IMAGE_NT_HEADERS是PE文件格式的一部分,它包含了PE头和可选头的信息,用于描述PE文件的结构和属性。
它们之间的关系:虚拟地址(VA) = 基地址(Image Base)+相对虚拟地址(RVA)
这篇文章转载自小甲鱼的PE文件详解系列原文传送门 之前简单提了一下节表和数据目录表,那么他们有什么区别? 其实这些东西都是人为规定的,一个数据在文件中或者在内存中的位置基本是固定的,通过数据目录表进行索引和通过节表进行索引都是可以找到的,也可以这么说,同一个数据在节表和数据目录表中都有一份索引值,那么这两个表有什么区别?一般将具有相同属性的值放到同一个节区中,这也就是说同一个节区的值只是保护属性相同,但是他们的用途不一定是一样的,但是在同一数据目录表中的数据的作用是相同的,比如输入函数表中只会保存输入函数的相关信息,输出函数表中只会保存输出函数的信息,而输入输出函数在PE文件中可能都位于.text这个节中。
该文介绍了PE文件格式以及其结构,包括DOS头部、NT头部、节区、Section Table和重定位表等。
本文主要讲解了PE文件头,包括DOS头、NT头、节头以及数据目录的结构和功能。通过了解这些结构,可以更好地掌握PE文件的基本组成部分和文件组织方式。
EXE和DLL文件之间的区别完全是语义上的,他们使用完全相同的PE格式。唯一的区别就是用一个字段标识出这个文件是EXE还是DLL。还有许多DLL的扩展,如OCX控件和控制面板程序(.CPL文件)等都是DLL,它们有一样的实体。
对于确定的处理器,它能执行的指令是确定的,这就是CPU的指令集。CPU的指令集是机器码,于是人们为了容易编程,发明了使用助记符的汇编语言。后来,又出现 了高级语言。高级语言只是用人更容易理解的语法来描述了 这些指令的组织规则,而最终翻译成机器指令则是由编译器来完成的。
节表(Section Table)是Windows PE/COFF格式的可执行文件中一个非常重要的数据结构,它记录了各个代码段、数据段、资源段、重定向表等在文件中的位置和大小信息,是操作系统加载文件时根据节表来进行各个段的映射和初始化的重要依据。节表中的每个记录则被称为IMAGE_SECTION_HEADER,它记录了一个段的各种属性信息和在文件中的位置和大小等信息,一个文件可以由多个IMAGE_SECTION_HEADER构成。
在笔者上一篇文章《驱动开发:内核解析PE结构导出表》介绍了如何解析内存导出表结构,本章将继续延申实现解析PE结构的PE头,PE节表等数据,总体而言内核中解析PE结构与应用层没什么不同,在上一篇文章中LyShark封装实现了KernelMapFile()内存映射函数,在之后的章节中这个函数会被多次用到,为了减少代码冗余,后期文章只列出重要部分,读者可以自行去前面的文章中寻找特定的片段。
之前自己学习了PE文件的格式,后来自己写了个PE文件的解析器,这段时间工作上刚好要用到它,老板需要能查看某个exe中加载的dll的一个工具,我在使用之前自己写的这个东西的时候,发现很多东西都忘记了,所以,我在这回顾下当时的思路,并记录下来,方便以后直接使用。也算是回顾下之前学习的内容,将学的东西学以致用 工具总体分为这样几个部分: 1. 文件头的信息 2. pe文件节表的信息 3. pe文件数据目录表的信息 4. 简单的从RVA到Frva的计算 工具主要采用MFC的框架作为界面,pe文件的解析部分完全由自己编写,主要使用了Windows中定义的一些结构体。刚开始开启界面时,所有功能按钮和显示界面都为空,当我们正确加载一个pe文件后这些按钮就都可以使用。
答案: 不是.是由很多PE文件组成.DLL也是PE文件.如果我们PE文件运行.那么就需要依赖DLL.系统DLL就是Kerner32.dll user32.dll等等.这些都是PE文件.
那是一个沙尘暴都能上热搜的清晨,我揉了揉眼睛从床上爬起来,顶着一路的艰难险阻来到了实验室,开机,hello 酷狗,登录PC微信,蓝屏。全剧终。
PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等,在PE文件中我们最需要关注,PE结构,导入表,导出表,重定位表,下面将具体介绍PE的关键结构,并使用C语言编程获取到这些结构数据.
本文转自小甲鱼的PE文件相关教程,原文传送门 咱接着往下讲解IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用! 接着我们来谈谈 IMAGE_OPTIONAL_HEADER 结构,正如名字的意思,这是一个可选映像头,是一个可选的结构。 但是呢,实际上上节课我们讲解的 IMAGE_FILE_HEADER 结构远远不足以来定义 PE 文件的属性。 因此,这些属性在 IMAGE_OPTIONAL_HEADER 结构中进行定义。 因此这两个结构联合起来,才是一个完整的 “PE文件结构” 。
PeFile模块是Python中一个强大的便携式第三方PE格式分析工具,用于解析和处理Windows可执行文件。该模块提供了一系列的API接口,使得用户可以通过Python脚本来读取和分析PE文件的结构,包括文件头、节表、导入表、导出表、资源表、重定位表等等。此外,PEfile模块还可以帮助用户进行一些恶意代码分析,比如提取样本中的字符串、获取函数列表、重构导入表、反混淆等等。PEfile模块是Python中处理PE文件的重要工具之一,广泛应用于二进制分析、安全研究和软件逆向工程等领域。
第一次写病毒分析的文章,之前表哥丢给我一个样本断断续续分析了好几天才搞明白,如有任何错误,还请各位多加指点
在BIOS后,操作系统前,通过中断服务程序(向量表 INT 13H),占据物理位置(常驻内存高端),替换、截获系统中断从而伺机传染发作。
在PE结构中最重要的就是区块表和数据目录表,上节已经说明了如何解析区块表,下面就是数据目录表,在数据目录表中一般只关心导入表,导出表和资源这几个部分,但是资源实在是太复杂了,而且在一般的病毒木马中也不会存在资源,所以在这个工具中只是简单的解析了一下导出表和导出表。这节主要说明导入表,下节来说导出表。
结果200多位小伙伴参赛,只有十几位成功破解拿到了flag,真的有这么难吗?来看看你能扛到第几关?
本文转自小甲鱼的PE文件详解系列原文传送门 到此为止,小甲鱼和大家已经学了许多关于 DOS header 和 PE header 的知识。接下来就该轮到SectionTable (区块表,也成节表)。 越学越多的结构,大家可能觉得PE挺乱挺杂的哈,所以这里插播下一下必要知识的详细注释,大伙可以按需要看。 PE文件中所有节的属性都被定义在节表中,节表由一系列的IMAGE_SECTION_HEADER结构排列而成,每个结构用来描述一个节,结构的排列顺序和它们描述的节在文件中的排列顺序是一致的。 全部有效结构的最后以一个空的IMAGE_SECTION_HEADER结构作为结束,所以节表中总的IMAGE_SECTION_HEADER结构数量等于节的数量加一。 节表总是被存放在紧接在PE文件头的地方。 另外,节表中 IMAGE_SECTION_HEADER 结构的总数总是由PE文件头 IMAGE_NT_HEADERS 结构中的 FileHeader.NumberOfSections 字段来指定的。
关于可信代码数字签名如何计算PE文件哈希值的细节,参阅本文档后面的“Calculating the PE Image Hash”。
EAT(Export Address Table)用于修改动态链接库(DLL)中导出函数的调用。与IAT Hook不同,EAT Hook是在DLL自身中进行钩子操作,而不是修改应用程序的导入表。它的原理是通过修改DLL的导出函数地址,将原本要导出的函数指向另一个自定义的函数。这样,在应用程序调用DLL的导出函数时,实际上会执行自定义的函数。
在笔者的上一篇文章《驱动开发:内核特征码扫描PE代码段》中LyShark带大家通过封装好的LySharkToolsUtilKernelBase函数实现了动态获取内核模块基址,并通过ntimage.h头文件中提供的系列函数解析了指定内核模块的PE节表参数,本章将继续延申这个话题,实现对PE文件导出表的解析任务,导出表无法动态获取,解析导出表则必须读入内核模块到内存才可继续解析,所以我们需要分两步走,首先读入内核磁盘文件到内存,然后再通过ntimage.h中的系列函数解析即可。
定期数据库备份是防止意外数据丢失事件的关键步骤。设计有效的备份和恢复策略通常需要通过恢复速度,数据完整性和备份覆盖来权衡性能影响,实施成本和数据存储成本。最佳解决方案取决于您的恢复点和时间目标以及数据库规模和体系结构。在本教程中,我们将演示如何使用LVM快照对正在运行的MySQL数据库执行实时(或“hot”)物理备份。然后,我们将数据压缩并存储在腾讯云存储中。
在Windows PE中,资源是指可执行文件中存放的一些固定不变的数据集合,例如图标、对话框、字符串、位图、版本信息等。PE文件中每个资源都会被分配对应的唯一资源ID,以便在运行时能够方便地查找和调用它们。PE文件中的资源都被组织成一个树形结构,其中最顶层为根节点(Root),下一级为资源类型(Type),再下一级为资源名称(Name),最终是实际的资源内容。
Ring 3层的 IAT HOOK 和 EAT HOOK 其原理是通过替换IAT表中函数的原始地址从而实现Hook的,与普通的 InlineHook 不太一样 IAT Hook 需要充分理解PE文件的结构才能完成 Hook,接下来将具体分析 IAT Hook 的实现原理,并编写一个DLL注入文件,实现 IAT Hook 。
导出表(Export Table)是Windows可执行文件中的一个结构,记录了可执行文件中某些函数或变量的名称和地址,这些名称和地址可以供其他程序调用或使用。当PE文件执行时Windows装载器将文件装入内存并将导入表中登记的DLL文件一并装入,再根据DLL文件中函数的导出信息对可执行文件的导入表(IAT)进行修正。
PeView 结构解析器,是一款使用C/C++开发实现的命令行交互式 WindowsPE 程序结构解析器,目前可解析32位可执行程序的绝大部分通用参数,并内置各种结构查询转换阅览工具,目前已基本可在工作中使用。
本文转载自小甲鱼PE文件讲解系列原文传送门 这次主要说明导出表,导出表一般记录着文件中函数的地址等相关信息,供其他程序调用,常见的.exe文件中一般不存在导出表,导出表更多的是存在于dll文件中。一般在dll中保存函数名称以及它的地址,当某个程序需要调用dll中的函数时,如果这个dll在内存中,则直接找到对应函数在内存中的位置,并映射到对应的虚拟地址空间中,如果在内存中没有对应的dll,则会先通过PE加载器加载到内存,然后再进行映射
我们知道PE有两种状态.第一种.在文件中的状态. 所以才有 VA 转 FOA等等的互相转换. 扯多了. 在文件状态. IAT表(firstThunk)跟 INT表一样.都是指向一个很大的表.这个表里面是4个字节进行存储.存储的是Rva. 这些RVA分别指向 导入序号以及以0结尾的字符串.
重定位的意思就是修正偏移的意思. 如一个地址位 0x401234 ,Imagebase = 0x400000 . 那么RVA就是 1234. 如果Imagebase 变了成了0x300000, 那么修正之后就是 ImageBase + RVA = 0X300000+1234 = 0x301234.
linux的shellcode就不用说了,直接通过一个int 0x80系统调用,指定想调用的函数的系统调用号(syscall),传入调用函数的参数,即可,懂的都懂。
领取专属 10元无门槛券
手把手带您无忧上云