
PE
PE结构
lnterpreter
这个作者很懒,什么都没留下…
展开
-
PE目录
文章目录什么是可执行文件PE文件的两种状态DOS部分PE头RVA与FOA的转换节表代码空白区添加代码新增节导出表导入表重定位表读写文件PE头打印读取->拉伸->还原空白区域添加代码添加节扩大节合并节动态链接打印导出表移动导出表打印重定位表移动重定位表打印导入表导入表注入...原创 2020-10-20 09:50:36 · 318 阅读 · 0 评论 -
导入表注入
文章目录一 、流程二、演示三、完整代码一 、流程1、File-> FileBuffer2、添加节3、定位导入表4、将导入表移动到新增的节里面5、新增一个导入表6、在导入表后面添加INT表和IAT表7、INT和IAT表指向函数名8、修正导入表9、存盘二、演示1、File-> FileBufferDWORD Size = 0; //用来接收数据大小BOOL isok = FALSE; //用来接收写入磁盘是否成功LPVOID pFileBuffer原创 2020-10-14 16:53:37 · 625 阅读 · 0 评论 -
打印导入表
文章目录一、流程二、演示三、完整代码四、勿在浮沙筑高台一、流程1、File-> FileBuffer2、定位导入表3、循环导入表4、获取导入表名字5、获取INT表RVA6、获取INT表的地址和序号7、循环打印INT表的内容8、获取IAT表RVA9、获取IAT表的地址和序号10、循环打印IAT表的内容二、演示1、File-> FileBuffer2、定位导入表 PIMAGE_DOS_HEADER pDosHeader = NULL;//DOS头 P原创 2020-10-12 18:21:33 · 540 阅读 · 1 评论 -
移动重定位表
文章目录一、流程二、演示三、完整代码四、勿在浮沙筑高台一、流程1、File-> FileBuffer2、添加节3、定位重定位表4、移动重定位表5、修复重定位的地址6、存盘二、演示1、File-> FileBuffer2、添加节3、定位重定位表 DWORD RelocationFoa = NULL;//重定位表FOA if (pOptionalHeader->DataDirectory[5].VirtualAddress == 0)原创 2020-10-12 17:58:43 · 569 阅读 · 5 评论 -
移动导出表
文章目录一、流程二、演示三、完整代码四、勿在浮沙筑高台一、流程1、File-> FileBuffer2、添加节3、定位导出表4、将导出函数名称表、导出函数地址表、导出函数序号表Rva转Foa5、定位导出函数名称表、导出函数地址表、导出函数序号表6、移动导出函数名称表、导出函数地址表、导出函数序号表7、复制导出函数名称表中的名称8、获取函数名称的偏移9、移动函数名称,并修复导出函数名称表10、移动导出表结构体11、修复导出函数名称表、导出函数地址表、导出函数序号表(Foa转Rva原创 2020-10-10 17:11:52 · 332 阅读 · 0 评论 -
打印重定位表
文章目录一、流程二、流程三、完整代码一、流程1、File-> FileBuffer2、获取头信息3、获取结构体数组的信息4、获取导出表的地址RVA和FOA5、获取导出表在文件中的地址6、循环重定位表7、获取数据块的FOA8、判断数据块在那个节中9、获取要修改数据的个数和位置10、循环要修改的数据并判断是否要修改11、指向下一个数据块二、流程1、File-> FileBuffer2、获取头信息3、获取结构体数组的信息 //指向数组 PIMAGE_DATA_DIR原创 2020-10-07 17:04:00 · 495 阅读 · 0 评论 -
打印导出表
文章目录一、流程二、演示三、完整代码一、流程1、创建一个RVA转FOA的函数2、创建一个打印导出表的函数3、File-> FileBuffer4、获取头信息5、获取结构体数组的信息6、获取导出表的地址Rva7、获取导出表的地址Foa8、导出表在文件中的地址9、打印导出表的成员属性10、将导出表Name、AddressOfNames、AddressOfFunctions、AddressOfNameOrdinals的Rva转换成Foa11、 打印导出表文件名12、获取导出函数地址原创 2020-10-05 20:05:37 · 743 阅读 · 6 评论 -
动态链接
文章目录一、创建导出testdll二、新建一个类mydll三、mydll中写要导出的函数四、mydll头文件中写导出的函数五、将生成的testdll.dll和testdll.lib放到工程目录下六、exe程序导入dll一、创建导出testdll二、新建一个类mydll三、mydll中写要导出的函数四、mydll头文件中写导出的函数extern “C” _declspec(dllexport) __stdcall int Plus (int x,int y); 以C 语言导出,内平栈五、原创 2020-10-04 21:41:05 · 276 阅读 · 0 评论 -
合并节
文章目录一、流程二、演示三、完整代码四、勿在浮沙筑高台一、流程1、File-> FileBuffer2、FileBuffer->ImageBuffer3、修改第一个节的属性4、其余节表初始化为05、将NumberOfSections修改为16、将ShellCode代码复制第一个节表后面7、修正E8、E98、修正OEP(入口程序)9、修改VirtualSize和SizeOfRawData10、ImageBuffer->NewBuffer11、NewBuffer->原创 2020-10-04 17:59:05 · 302 阅读 · 0 评论 -
扩大节
文章目录一、流程二、 演示三、完整代码一、流程1、File-> FileBuffer2、FileBuffer->ImageBuffer3、修改SizeOfImage的大小(要扩大多少:Ex)4、将修改后的数据复制到pNewImageBuffer5、将ShellCode代码复制到最后一个节的后面6、修正E8、E97、修正OEP(入口程序)8、判断VirtualSize和SizeOfRawData谁大9、 N = (SizeOfRawData或者VirtualSize 内存对齐后原创 2020-10-04 15:00:00 · 401 阅读 · 1 评论 -
添加节
文章目录一、流程二、演示三、完整代码一、流程1、File-> FileBuffer2、FileBuffer->ImageBuffer3、判断空闲区是否有足够的空间存储ShellCode代码4、将NT头到节表往上提5、新增一个节表6、添加属性7、将修改后的数据复制到一个新的缓冲区中去8、将ShellCode代码复制到空闲区9、修正E8、E910、修正OEP(入口程序)11、ImageBuffer->NewBuffer12、NewBuffer->文件二、演示原创 2020-10-03 11:48:03 · 1751 阅读 · 6 评论 -
空白区域添加代码
文章目录一、流程二、演示三、完整代码一、流程1、File-> FileBuffer2、FileBuffer->ImageBuffer3、判断空闲区是否有足够的空间存储ShellCode代码4、将ShellCode代码复制到空闲区5、修正E8、E96、修正OEP(入口程序)7、ImageBuffer->NewBuffer8、NewBuffer->文件二、演示1、看上篇2、看上篇3、判断空闲区是否有足够的空间存储ShellCode代码#define SHELL原创 2020-09-28 22:18:17 · 543 阅读 · 0 评论 -
读取->拉伸->还原->写入
文章目录一、定义一个函数二、File -> FileBuffer三、FileBuffer -> ImageBuffer四、ImageBuffer -> NewBuffer五、NewBuffer -> 文件六、调用函数七、勿在浮沙筑高台一、定义一个函数Test(){}二、File -> FileBuffer1、定义一些变量2、读取文件,并判断是否读取成功3、读取文件大小4、分配缓冲区5、初始化缓冲区6、将文件数据读取到缓冲区7、关闭文件,并返回缓冲区首地原创 2020-09-24 18:56:43 · 558 阅读 · 0 评论 -
PE头打印
文章目录一、GetLogicalDrives()#include <windows.h>DWOR dwtLogicalDrives = GetLogicalDrives(); //返回一个数字1311011为存在,0为不存在,从右到左 ,A存在,B不存在,C存在,D存在原创 2020-09-22 18:29:10 · 569 阅读 · 2 评论 -
移动导出表和重定位表
文章目录一、移动导出表二、移动重定位表一、移动导出表第一步:在DLL中新增一个节,并返回新增后的FOA第二步:复制AddressOfFunctions长度:4*NumberOfFunctions 第三步:复制AddressOfNameOrdinals长度:NumberOfNames*2 第四步:复制AddressOfNames长度:NumberOfNames*4 第五步:复制所有的函数名长度不确定,复制时直接修复AddressOfNames原创 2020-09-06 13:45:47 · 483 阅读 · 0 评论 -
重定位表
文章目录一、 重定位表二、重定位表结构一、 重定位表当2个模块加载到内存中,都是用同一个地址,这时候就会产生问题,其中的一个会加载到另一个地址,里面的一些函数就不能用了(如全局变量),这个时候就需要修正这些地址表二、导入表三、导入表结构(20个字节)四、导入表名字一、 导入(出)表导入表在扩展PE头_IMAGE_DATA_DIRECTORY DataDirectory[16]中,每个结构体都是8个字节二、导入表IMAGE_DIRECTORY_ENTRY_IMPORTstruct _IMAGE_DATA_DIRECTORY {0x00 DWORD VirtualAddress; //导入表的地址0x04 DWORD Size; //大小};三、导入表结构(20个字原创 2020-09-05 17:43:18 · 560 阅读 · 0 评论 -
导出表
文章目录一、导入(出)表一、导入(出)表导出表在扩展PE头_IMAGE_DATA_DIRECTORY DataDirectory[16]中,每个结构体都是8个字节二、导入表IMAGE_DIRECTORY_ENTRY_EXPORTstruct _IMAGE_DATA_DIRECTORY {0x00 DWORD VirtualAddress; //导出表在哪里0x04 DWORD Size; //导出表大小(包含导出表所有表和子表所有的数据大小)};三、导入表结构(40个字节)st原创 2020-09-05 14:47:08 · 640 阅读 · 0 评论 -
新增节
一、判断是否能加一个节表SizeOfHeaders - DOS头 - NT头 - 已有的节表 〉80个字节(为了保证程序不出错,节表之后留有40个字节的0)二、修改节的数量NumberOfSections(标准PE头)三、修改程序在内存中的大小SizeOfImage(扩展PE头中)四、插入数据五、修改...原创 2020-08-31 21:57:56 · 270 阅读 · 0 评论 -
代码节空白区添加代码
文章目录一、 找个可以写二进制的区域二、寻找本机MessageBoxA(最终要跳到的地址)三、计算四、修改入口地址一、 找个可以写二进制的区域二、寻找本机MessageBoxA(最终要跳到的地址)三、计算1、要运行代码的地址E8 = MessageBoxA - 内存中当前代码的偏移地址 - 577D5050B - 400F98 - 5 = 7794F56E2、返回入口地址E9 = 内存入口的偏移地址 - 内存中当前代码的偏移地址 - 54183D7 - 400F9D -5 = 174原创 2020-08-30 20:53:56 · 811 阅读 · 0 评论 -
节表
文章目录一、节表结构#define IMAGE_SIZEOF_SHORT_NAME 8 typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //ASCII字符串 可自定义 只截取8个 可以8个字节都是名字 union { //Misc 双字 是该节在没有对齐前的真实尺寸,该值可以不准确 DWORD PhysicalAddress;原创 2020-08-29 18:05:09 · 822 阅读 · 0 评论 -
RVA与FOA的转换
文章目录一、全局变量二、RVA到FOA的转换:一、全局变量一个全局变量有初始值,那么它的初始值是存在PE中的一个全局变量没有初始值,只有文件加载在内存中才会给它分配空间二、RVA到FOA的转换:<1> 得到RVA的值:内存地址 - ImageBase<2> 判断RVA是否位于PE头中,如果是:FOA == RVA<3> 判断RVA位于哪个节:RVA >= 节.VirtualAddress RVA <= 节.VirtualAddress +原创 2020-08-28 16:46:54 · 878 阅读 · 0 评论 -
PE头
一、PE头typedef struct _IMAGE_NT_HEADERS { DWORD Signature; //PE标识(4字节) IMAGE_FILE_HEADER FileHeader; //标准PE头(20字节) IMAGE_OPTIONAL_HEADER32 OptionalHeader; //扩展PE头(默认224字节)} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;PE标识:PE标识不能破坏,操作系统在启动.原创 2020-08-28 12:09:57 · 426 阅读 · 0 评论 -
DOS部分
一、IMAGE_DOS_HEADER(64字节)DOS MZ 头文件主要记住两个1、WORD e_magic;2、DWORD e_lfanew;二、DOS块DOS MZ头文件最后一个成员到PE头文件头,中间那一部分,可以随便填充,由连接器填写的原创 2020-08-28 11:48:50 · 224 阅读 · 0 评论 -
PE文件的两种状态
一、ODS部分1、_IMAGE_DOS_HEADER(64个字节)2、DOS stub大小不确定,IMAGE_DOS_HEADER之后到PE文件头标志之前二、PE头文件1、PE文件头标志(4字节)2、标准PE头IMAGE_FILE_HEADER(20字节)3、扩展PE头IMAGE_OPTIONAL_HEADER大小根据标准PE头中的WORD SizeOfOptionalHeader 来确定,32位计算机(十六进制E0,二进制224),64位计算机(十六进制F0,二进制240).原创 2020-08-27 18:36:10 · 537 阅读 · 0 评论 -
什么是可执行文件
文章目录一、什么是可执行文件?二、如何识别PE文件?一、什么是可执行文件?可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。 可执行文件的格式:Windows平台: PE(Portable Executable)文件结构Linux平台: ELF(Executable and Linking Format)文件结构二、如何识别PE文件?1、PE文件的特征(PE指纹) 分别打开.exe .dll .sys 等文件,观察特征前2个字节。原创 2020-08-27 18:08:47 · 11691 阅读 · 0 评论