PE
文章平均质量分 91
PE
ぃ扶摇ぅ
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
PE文件(十三)系统调用与函数地址动态寻找
当需要分析一个程序时,这个程序一定是可以调试的,操作系统也不例外。在调试过程中下断点是很重要的当我们对一个应用程序下断点时,应用程序是挂起的。但当我们对操作系统的内核程序下断点时,被挂起的不是内核程序而是整个操作系统。当操作系统被挂起时,网卡显卡等功能无法使用,进而无法在挂起的操作系统的机器上进行任何操作,也就无法调试内核程序了。为了能够调试内核程序,Windows提供了一个调试子系统,它是一个独立于操作系统的的子系统,负责与调试器进行数据的交互进而实现调试内核程序。原创 2025-04-05 23:12:06 · 1161 阅读 · 0 评论 -
PE文件(八)导出表
重定位表的引入程序加载过程在win32下,每一个PE文件(其可能由多个子PE文件组成)在运行时,操作系统会给分配一个独立的4GB虚拟内存,内存地址从0x00000000到0xFFFFFFFF。其中低2G为用户程序空间,高2G为操作系统内核空间。并且操作系统会将该文件中数据拉伸成内存中数据,从ImageBase开始,分配SizeOfImage大小空间当一个主PE文件由很多个子PE文件组成,当我们运行主PE文件时,所有的PE文件共享操作系统分配的一个4GB虚拟空间。原创 2024-07-13 22:55:30 · 1645 阅读 · 0 评论 -
PE文件(四)FileBuffer-ImageBuffer
4.复制所有的节:通过第一个节对应节表中的PointerToRawData的值确定该节在FileBuffer的起始地址,然后通过SizeOfRawData的值确定该节在FileBuffer中需要复制的数据的大小,再通过VirtualAddress再加上ImageBase得到此节在ImageBuffer中的起始地址,最后将FileBuffer对应的数据在ImageBuffer中的起始地址位置开始复制,完成第一个节的复制。此时ImageBuffer中的文件的数据满足文件运行的条件,但文件仍然不能真正的运行。原创 2024-05-07 18:25:24 · 1150 阅读 · 0 评论 -
PE文件(十五)绑定导入表
我们在分析Windows自带的一些程序时,常常发现有的程序,如notepad,他的IAT表在文件加载内存前已经完成绑定,存储了函数的地址。这样做可以使得程序是无需修改IAT表而直接启动,这时程序启动速度变快。但这种方式只适用于dll按照预先设定ImageBase装载而不重分配的情况当dll没有按照预先设定的ImageBase进行装载,IAT表在文件加载内存前进行绑定就会出现问题了。原创 2025-04-14 18:18:10 · 971 阅读 · 0 评论 -
PE文件(九)重定位表
默认情况下.DLL的ImageBase为0x10000000,所以如果一个程序要用的DLL没有合理的修改分配装载起始地址,就可能出现多个DLL的ImageBase都是同一个地址,造成装载冲突。如果只移动函数名称表的话,对剩下的数据加密后,当需要根据函数名去调用导出函数时,由于字符串被加密,只能根据函数名称表查到名称字符串所在地址,但是无法匹配字符串。6.修改导出表中的成员值,指向三个子表在新节中的位置,由于各个子表在导出表的地址数据是RVA,因此需要将FOA转成RVA。原创 2024-07-15 21:01:41 · 1274 阅读 · 0 评论 -
PE文件(一)PE结构概述
同一份文件在内存中和在硬盘中的内容是一样的,但是他们文件内存起始位置是不一样的,它们分节之间的空白区域大小是一样的,这似乎与我们之前所作的文件硬盘与内存分布图有所不同,这是由于对齐的机制。我们之前在找DOS头时,DOS头以0x000000e0结尾, 指向了左侧地址e0的地方,从图中可知,e0的地方有5045,在最右侧有PE文字,这也正好说明了此处是pe文件真正开始的地方,即NP头开始,但这个e0并不是一直固定的。每一个节,都有一个对应的节表(图中块表)用于记录节的相关信息,如每一个节的概要性信息。原创 2024-04-18 21:59:31 · 2779 阅读 · 0 评论 -
PE文件(二)PE头字段说明
PE头字段 = DOS头 + PE标记 + 标准PE头 + 可选PE头我们今天分析一下PE头字段中所有重要成员的含义。原创 2024-04-24 21:45:06 · 1915 阅读 · 2 评论 -
PE文件(三)节表
Name数组的长度最大为8字节,如果定义节的名称为.text,由于.text对应的ASCII码分别为0x2E, 0x74, 0x65, 0x78,0x74,所以Name数组中的数据为2E 74 65 78 74 00 00 00,一共8字节。所有的节表一起记录了该.exe文件中所有的节的信息,每一个节都有对应的节表来存储信息,所有的节对应的节表组合在一起就构成了PE文件的节表结构。内存中的地址:节表在4GB内存中的地址要加上imagebase的值,才是节表真正在内存中的起始地址。原创 2024-04-26 21:20:10 · 1571 阅读 · 0 评论 -
PE文件(十一)资源表
所谓的资源也就是我们之前学的MFC中的对话框,按钮,编辑框之类的东西。不仅MFC有资源,我们平时熟悉的控制台程序也有资源当我们平时写一些程序或者木马时,我们通常对其定义一个随机的名称或者路径,然后再向外界进行释放(资源的 二进制数据写入文件)。而这些随机的名称或路径被写入PE文件的资源中。原创 2025-03-29 16:47:52 · 1372 阅读 · 0 评论 -
PE文件(十)移动导出表和重定位表
此时就可以修改IAT表了。当一个PE文件(如.dll/.exe等)需要使用别的模块的函数,也叫做依赖某模块,就需要一个清单来记录使用的模块(一般为.dll文件,为方便理解,以后我们将模块都认为是.dll文件)及使用的函数的相关信息(如使用了哪些DLL、使用了这个DLL里的哪些函数、叫什么名、去哪找等),这个清单就叫做导入表。元素表现形式不同的原因:一个.DLL中的函数可以以函数名称导出,也可以以序号(NONAME)导出,所以当一个PE文件使用别的.DLL中的函数时要考虑这个函数的名字和序号两种情况。原创 2024-07-25 17:47:24 · 1537 阅读 · 0 评论 -
PE文件(十二)TLS与延迟导入表
TLS:线程局部存储,用来保存变量和回调函数的数据。TLS中存储的的变量和回调函数都在程序入口点之前执行完了,也就是说当程序在被调试时,在程序入口点断点之前,TLS中的变量和回调函数就已经执行完了,因此TLS可以用作反调试之类的操作。对于一个有多线程的程序而言,全局变量和静态变量被多线程共享,因此多线程可以同时访问共享变量,但这可能会造成一些逻辑问题。因为我们可以通过TLS技术存储这些变量。原创 2025-03-31 18:47:02 · 556 阅读 · 0 评论 -
PE文件(五)数据目录
添加shellcode有以下几种的方式:1.直接在任意节的空白区添加代码2.新增节添加代码3.扩大最后一个节添加代码4.合并节并添加代码今天我们学习如何扩大节,合并节扩大节在上一节的学习中,我们可以通过上移NT头和节表覆盖DOS Stub以获取足够的空白区来增加新的节表以及后续新增节,但是当整体上移覆盖DOS Stub之后,多出来的空白区域还不够新增节表时,我们就可以使用扩大最后一个节的方法来添加我们的shellcode扩大节主要用于当我们在。原创 2024-06-10 19:29:16 · 1440 阅读 · 0 评论 -
PE文件(七)导入表
解析此图:该PE文件以.def的方式自定义序号导出函数,定义了序号13、14、16、17、19的导出函数,那么Base的值应为13,那么序号为13的函数相对相对下标就是0,序号14的导出函数相对下标就是1,序号为15的导出函数虽然没有,但是会把位置空出来,定义地址值为NULL,即0x00000000,序号16的导出函数相对下标就是3…导出函数名称表RVA我们在硬盘数据找该表地址时要先转成FOA,这个地址指向的表记录了导出函数的名称字符串RVA首地址,而不是导出函数名称。//导出函数名称表RVA *原创 2024-07-10 17:42:39 · 1999 阅读 · 0 评论 -
PE文件(十四)shellcode框架
shellcode指在任何环境下,都可以运行的代码。实际上就是把我们编写的代码转换为硬编码然后注入进程使用。在渗透方面,shellcode常用于工具生成,但在二进制漏洞方面,我们经常需要手写shellcode,因此学会手写shellcode是很重要的。原创 2025-04-06 21:55:55 · 1117 阅读 · 0 评论 -
PE文件(六)静态与动态链接库
本章内容为导入表和导出表的前置内容。原创 2024-07-08 21:51:16 · 1441 阅读 · 0 评论
分享