avatar
文章
80
标签
0
分类
0

Hexo

Hexo

PE 3 NT Optional Header 1
发表于2025-02-07
NT Optional Header 字段详解在 PE(Portable Executable)格式中,IMAGE_OPTIONAL_HEADER 扮演着非常重要的角色,它提供了操作系统加载程序时所需的关键信息。 Magic 字段123WORD Magic; IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b 含义: Magic 字段用于标识可执行文件是32位还是64位。 对于32位 PE 文件,其值为 0x10b(IMAGE_NT_OPTIONAL_HDR32_MAGIC)。 对于64位 PE 文件,其值为 0x20b(IMAGE_NT_OPTIONAL_HDR64_MAGIC)。 作用: 加载器通过检测该字段来判断如何解析后续的可选头结构,从而选择正确的数据结构和加载方式。 链接器版本123//链接器的版本 参考使用的VS的版本BYTE MajorLinkerVersion;BYTE MinorLinkerVersion; 含义: 这两个 ...
PE 2 NT头
发表于2025-02-05
在Windows操作系统中,可执行文件通常采用PE(Portable Executable)格式。PE格式不仅支持32位和64位系统,而且在文件结构上具有层次分明、信息丰富的特点。其中,NT头(IMAGE_NT_HEADERS) 是整个PE文件的核心部分,它起到了连接DOS兼容部分和实际执行数据之间的桥梁作用。 NT头的整体结构NT头一般包括以下几个部分: Signature(签名) 描述:一个DWORD类型的值,通常为"PE\0\0",用于标识文件为合法的PE格式。 作用:通过检测这个魔数,操作系统和工具可以确认文件格式并继续解析后续内容。 IMAGE_FILE_HEADER(文件头) 这一部分包含了描述文件基本属性的重要信息,例如: Machine(机器类型):一个WORD值,用于说明目标CPU平台(如x86、x64等)。 NumberOfSections(节区数量):一个WORD值,指出文件中节(section)的个数,每个节代表一个独立的数据区,如代码、数据、资源等。 TimeDateStamp(时间戳):一个DWORD值,记录文件生成的时间,可以用来 ...
PE 1 DOS头、NT头和节表
发表于2025-01-31
PE 文件格式简介 PE(Portable Executable)格式:这是 Windows 系统下常用的可执行文件格式。相比于 Linux 系统下的 ELF 格式,PE 格式在 Windows 平台上具有广泛应用。 结构概览 IMAGE_DOS_HEADER:文件最开始的 DOS 头(兼容16位),其中包含了一个跳转指令以及一个指向 NT 头的偏移量(e_lfanew)。 DOS Stub:一个 DOS 程序,当在 DOS 环境下执行时显示提示信息(通常提示“此程序只能在 Windows NT/2000/XP 等系统上运行”)。 IMAGE_NT_HEADERS :紧接 DOS Stub 后面的 NT 头,其中包含: Signature:魔数(通常是 “PE\0\0”)。 IMAGE_FILE_HEADER:描述文件信息,如目标机器类型、节数量等。 IMAGE_OPTIONAL_HEADER:描述程序加载信息(例如入口点、程序内存布局等),以及数据目录数组,用于指向如导入表、导出表、资源表等重要数据结构。 IMAGE_SECTION_HEADER:紧 ...
PE3-31 导入表注入
发表于2025-01-03
导入表注入在动态链接库一章中提到 DllMain,这里再回顾一次: 当 DLL 被加载进 4GB 空间时,会调用一次 DllMain(入口方法)。 当程序执行完毕,将 DLL 从 4GB 空间卸载时,也会调用一次 DllMain。 注入的本质是想方设法将自己的 DLL 投放到其他进程的 4GB 空间中。而在前面讲解的导入表一章中提到: 只有隐式调用(静态使用)时,DLL 的名字和相关函数才会出现在调用者 PE 文件的导入表中。 显式调用(动态使用)时,被调用的 DLL 名和相关函数不会出现在调用者的导入表中。 换句话说: 写入导入表中的 DLL 必定是被隐式调用的(静态使用)。 如果将毫不相关的 DLL 写入某个 PE 文件的完整导入表中,那么打开这个 PE 文件时,该 DLL 会被直接加载(操作系统的规则)。 导入表注入的原理与过程原理当 .exe 文件被加载时,系统会根据其导入表信息加载需要的 DLL。导入表注入的原理就是修改 .exe 的导入表,将自己的 DLL 添加进去。这样,运行 .exe 时,系统会加载该 DLL 并执行其 DllMain 中的代码,从而实现注入 ...
PE3-30 绑定导入表
发表于2025-01-03
绑定导入表绑定导入的基本概念在程序加载前,IAT(Import Address Table)和INT(Import Name Table)中的内容通常相同,表示程序引用的 DLL 中函数的名称或序号。加载完成后,IAT 中的内容会被替换为函数的实际地址。 绑定导入的意义 如果 DLL 文件更新,绑定导入表的时间戳和 DLL 文件的时间戳将不同,此时需要修正函数序号、函数名称和函数地址表。 加载前直接写绝对地址:在 IAT 表中保存绝对地址,可以加快程序启动速度,因为省去了修复 IAT 表的步骤。 优点 加快程序启动速度:在启动程序时需要申请4gb内存空间、贴exe、贴dll、将IAT表修复为地址等等,如果直接用绝对地址,则省去了修复IAT表的操作; 缺点 DLL 重定位时,如果 DLL 没有占据其自身的 ImageBase 地址,需要修复绝对地址。 DLL 修改时,IAT 表中的函数地址可能不正确,需要重新修复。 Windows 提供的一些程序(如记事本)使用了这种绑定导入方式。 判断绑定导入的方法在导入表的结构中有一个属性:TimeDateStamp,其值可以反映是否 ...
PE3-27 IAT表&&导入表
发表于2025-01-02
IAT:Import Address Table 导入地址表间接寻址调用 调用 DLL 函数时,汇编代码通过 间接寻址 实现,不直接 call 函数地址,而是通过一个中间地址跳转。 示例:调用 MessageBox系统函数(属于 DLL)时,汇编代码为: 1call dword ptr [004322d4] 004322d4 中存储地址 X,程序通过跳转到 X 执行函数。 004322d4 属于 .exe 的内存区域,而 X 可以指向 DLL 的内存区域(如 77d5050b)。 为什么需要间接寻址? DLL 在加载时可能因重定位占用不同的内存地址。 因此,调用 DLL 函数不能写死地址,而需要动态更新。 程序先将 .exe 中某个位置(如 004322d4)写入代码,然后由操作系统在运行时填充实际的函数地址。 文件状态与加载状态的区别 未运行(文件状态): 004322d4 指向的地址仅存储一个字符串,例如 MessageBox.USER32.dll。 需要根据 RVA(相对虚拟地址)转换为 FOA(文件偏移地址),再减去 ImageBase 才能找到位置。 运行中 ...
PE3-26 移动导出表-重定位表
发表于2025-01-01
为什么需要移动各种表? 表的重要性: 这些表由编译器生成,存储了程序运行过程中不可或缺的信息。 初始化的作用: 系统在程序启动时,会依据这些表完成初始化,例如将使用的 DLL 中函数的地址加载到 IAT 表中。 保护程序的需求: 为了保护程序,可以对 .exe 的二进制代码进行加密。但问题在于,各种表和用户代码及数据混合在一起。加密后,系统在初始化时会因无法正确解析表信息而出错。 总结:掌握表的移动技巧,是程序加密与反破解的基础。 移动导出表通常步骤:新增一个节(Section),并将表移动到新节。移动后需要重新计算 ROV。 具体操作步骤: 新增节: 在 DLL 中创建一个新的节,记录新增后的 FOA。 **复制 AddressOfFunctions**: 长度:4 × NumberOfFunctions。 **复制 AddressOfNameOrdinals**: 长度:2 × NumberOfNames。 **复制 AddressOfNames**: 长度:4 × NumberOfNames。 复制函数名字符串: 长度不固定,在复制时直接修复 AddressOfNames。 复 ...
PE3-25 重定位表
发表于2024-12-30
动态链接库的重定位表分析重定位表的作用重定位表用于在程序加载到内存时,修正程序的内存地址。通常,当程序在加载时,它的基地址可能与编译时的预定基地址不同,特别是对于动态链接库(DLL)来说,可能会出现多个程序或库文件冲突的情况。因此,必须修正程序中的地址引用,确保它们指向正确的位置。并不是所有的exe程序都有重定位表,但是DLL却是必须需要重定位信息。 为了提高搜索的速度,模块间地址也是要对齐的。模块地址对齐为10000H,也就是64K(64*1024)。 为什么DLL文件需要重定位表大多数EXE文件不会使用重定位表,因为它们通常按固定基址(如0x400000)加载,不会和其他程序冲突。但DLL文件由于可能被多个程序同时加载,且加载地址可能不同,因此必须有重定位表来修正各个地方的内存地址,避免内存冲突。 为什么要用重定位表 在程序加载到内存时,程序中的地址(如全局变量的地址或函数的地址)是相对于编译时的预定基地址(ImageBase)计算的。也就是说,如果程序能够按照预定的ImageBase来加载的话,那么就不需要重定位表。假设编译时程序的基地址设为0x400000,那么所有的内存地址 ...
PE3-24 导出表
发表于2024-12-29
动态链接库(DLL)的导出表分析导出表(Export Table)是PE(Portable Executable)格式中一个非常重要的部分,主要用于记录DLL文件中的导出信息,系统通过它可以找到DLL中的函数、资源等,完成动态链接的过程。 在Windows操作系统中,动态链接库(DLL)文件并不是像静态链接库那样直接嵌入到程序中,而是通过导出表提供的入口点与调用程序进行动态连接。系统会根据导出表中的信息,知道如何加载函数和资源。 扩展名为.exe 的PE 文件中一般不存在导出表,而大部分的.dll 文件中都包含导出表。但这并不是绝对的。例如纯粹用作资源的.dll 文件就不需要导出函数,另外有些特殊功能的.exe 文件也会存在导出函数。 导出表(Export Table)中的主要成分是一个表格,内含函数名称、输出序数等。序数是指定DLL 中某个函数的16位数字,在所指向的DLL 文件中是独一无二的。在此我们不提倡仅仅通过序数来索引函数的方法,这样会给DLL 文件的维护带来问题。例如当DLL 文件一旦升级或修改就可能导致调用改DLL 的程序无法加载到需要的函数。 导出表的结构导出表通常是一 ...
PE3-23 静态链接库-动态链接库
发表于2024-12-23
静态链接库与动态链接库静态链接库(.lib)静态链接库(.lib)是编译时将库的代码直接链接到应用程序中的库。使用时,库的函数和符号在编译期间被解析并复制到最终的可执行文件中。 静态库使用方法: 隐式方式1: 将 .h 和 .lib 文件复制到项目目录中。 在需要使用的源文件中包含 #include "xxx.h"。 使用 #pragma comment(lib, "xxx.lib") 引用静态库。 隐式方式2: 将 .h 和 .lib 文件复制到项目目录中。 在源文件中包含 #include "xxx.h"。 在项目属性的连接器设置中,选择“输入”->“附加依赖项”,并将 .lib 文件添加到此处。 编译时的行为: 编译时,静态库的代码被直接打包进最终的可执行文件中,因此每次修改库文件或更新库时,都需要重新编译可执行文件。 这种方式的缺点是程序体积较大,且不易于更新。 平时包含一个头文件,就可以用里面的函数,且没有加#pragma comment(lib,"xxx.lib"),这 ...
1234…8
avatar
Miyabi
文章
80
标签
0
分类
0
Follow Me
公告
This is my Blog
最新文章
Python 11 Python基础综合案例-动态柱状图2025-09-01
Python 10 Python基础综合案例-地图可视化2025-08-21
Python 9 Python基础综合案例-折线图可视化2025-08-13
Python 8 Python异常、模块与包2025-07-31
Python 7 Python文件操作2025-07-17
归档
  • 九月 20251
  • 八月 20252
  • 七月 20252
  • 六月 20252
  • 五月 20252
  • 四月 20252
  • 三月 20253
  • 二月 20258
网站资讯
文章数目 :
80
本站访客数 :
本站总访问量 :
最后更新时间 :
©2020 - 2025 By Miyabi
框架 Hexo|主题 Butterfly