avatar
文章
80
标签
0
分类
0

Hexo

Hexo

PE3-20 扩大节-合并节-数据目录
发表于2024-11-24
扩大节-合并节-数据目录扩大节注意:只能扩大最后一个节。 操作步骤: 拉伸到内存 将节加载到内存后处理。 分配新的空间 增加Ex的空间,修改 SizeOfImage: 1SizeOfImage = SizeOfImage + Ex 修改最后一个节的大小 更新最后一个节的 SizeOfRawData和 VirtualSize: 12N = (max(SizeOfRawData, VirtualSize) 内存对齐后的值) + ExSizeOfRawData = VirtualSize = N 更新SizeOfImage 修改 PE 头中的 SizeOfImage值,增加新增空间的大小: 1SizeOfImage = SizeOfImage + Ex 合并节合并节的意义在于节省节表空间。合并操作需要先扩大节后再进行。 操作步骤: 拉伸到内存 将要合并的节加载到内存,便于处理。 计算合并后的大小 合并后的大小取决于所有节的大小: 12Max = max(VirtualSize, SizeOfRawData) 内存对齐后的大小合并节大小 = Virtual ...
PE3-19 新增节-添加代码
发表于2024-11-22
新增节-添加代码新增节需要满足的条件:确保新增节后,节表区域仍有剩余空间以容纳一个节表。计算公式如下: 1SizeOfHeader - DOS文件头 - 可选PE头 - 节表数量 * 0x28 > 80 **解释:**新增节后需留出一个节表的空间(遵循Windows规则)。若不遵守规则,可能导致程序异常。 修改的内容与步骤: 添加新的节表 在现有节表末尾新增一个节,可以直接复制已有节表数据进行初始化。 填充新增节后的空间 在新增节后,填充一个节大小的 0x00,确保数据完整。 修改PE头中的节表数量 找到PE头中的NumberOfSections字段,增加1,更新节表数量。 更新SizeOfImage字段 修改PE头中的SizeOfImage字段,增加内存对齐后的新增节大小。 在文件末尾新增节数据 在原有数据末尾,添加一个内存对齐后的新增节数据区域。 修正新增节的属性 确保新增节的属性字段设置正确(如只读、可执行等)。根据需要调整其Characteristics字段。 填充新增节数据 在新增节区域内写入有效数据,避免数据为空导致程序运行失败。 当节 ...
PE3-18 在任意代码空白区添加代码
发表于2024-10-26
计算NewBuffer的大小可以通过最后一个节表的信息知道最后一个节表的偏移地址+ImageBase+节的大小,就是NewBuffer的大小 Work参考代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 ...
PE3-17 代码节空白区添加代码
发表于2024-10-24
硬编码:E8 和 E9 指令E8 和 E9 是 call 和 jmp 指令的操作码,后面跟的并不是直接的小端序地址。关键是如何计算跳转的地址。 call 例子: 12call 0x77E5425FE8 5F 42 E5 77 (这是错的) jmp 例子: 12jmp 0x2345678E9 2B 2B 00 00 从这个例子可以看出,E8 和 E9 后面的地址不是直接的小端序转换。要理解如何生成这些字节,我们需要用一个公式来计算。 跳转地址的计算方式真正要跳转的地址 = E8 或 E9 指令的下一条指令的地址 + X 其中: X = 真正要跳转的地址 - E8 或 E9 指令的下一条指令的地址 具体例子12345678func();00A825E1 E8 62 ED FF FF call func (0A81348h) return 0;00A825E6 33 C0 xor eax,eax 00A825E8 5F pop edi ...
PE3_16 FileBuffer->ImageBuffer
发表于2024-10-20
前面提到过,文件从硬盘加载到内存运行时会经过“拉伸”操作,那么在经过简单拉伸之后,程序是否就可以运行呢?答案是否定的。在完成基本拉伸操作后,程序还不能立即运行,还需要进行一些额外的处理。不过此时已经非常接近能够运行了。 Misc.VirtualSize 和 SizeOfRawData 的大小对比在内存中的节有一个 Misc.VirtualSize 属性,表示在内存中拉伸后的实际大小;而 SizeOfRawData 则表示文件在磁盘上的大小。 这两者的大小通常不同,因为内存中可能包含一些未初始化的数据,而这些数据不会在文件中实际保存,但在加载到内存时会被计算并为其预留空间。因此,通常情况下,Misc.VirtualSize 会大于 SizeOfRawData。 总结: Misc.VirtualSize 是加载到内存中时的实际大小,且它是加载之前未对齐的大小。 SizeOfRawData 是磁盘文件中已对齐的数据大小。 拷贝文件内容到内存时,应该以两者中较小的数值为准。 如何算出内存中节存储的某个地址在文件中对应的地址举个例子,假设在某个节中有一个内存地址是 0x501234。 首 ...
PE3_13 节表
发表于2024-10-18
联合体1234union TestUnion { char x; int y;}; 特点: 共享空间:联合体的所有成员共享同一内存空间。 内存大小:联合体的大小由最大成员的大小决定。例如,以上例子中,联合体的大小为4字节(int类型)。 有效性:联合体中最多只有一个成员是有效的,但仍然可以访问所有成员。 123456789union TestUnion { char x; int y;};union { char x; int y;} TestUnion; 节表(Section Table)节表是Windows PE/COFF格式可执行文件中的一个重要数据结构,记录了各个代码段、数据段、资源段、重定向表等在文件中的位置和大小信息。操作系统通过节表进行各个段的映射和初始化。 在执行PE文件时,Windows不会立即将整个文件读入内存,而是由PE装载器建立虚拟地址与PE文件之间的映射关系。只有当执行到某个内存页中的指令或访问页中的数据时,才会将该页面从磁盘加载到内存。这种机制极 ...
PE3_12 PE头字段说明
发表于2024-10-16
文件对齐与内存对齐程序最初存储在硬盘上,运行时需要加载到内存中。在加载过程中,文件的不同部分会进行重新排列和对齐,以便能够正确运行。视频中硬盘的对齐单位为0x200h,而内存中的对齐单位为0x1000h。这种对齐的差异导致文件在加载到内存中时需要进行“拉伸”处理,使文件能够符合内存的对齐要求,从而正确执行。 内核重载与虚拟地址程序一般从0x40000的虚拟地址开始执行,这个地址留给系统,增加了程序的安全性。虚拟地址由操作系统映射到实际的物理地址。 然后关于为什么程序一般从0x40000开始呢,视频里说是因为留出空间,如果访问这个内存就会报错,因为这是系统的空间,增加代码的安全性。 内核在加载程序时,会将程序的虚拟地址映射到实际的物理地址。常见的程序起始虚拟地址为0x40000,保留了前面的地址空间用于系统,这样当指针错误时不会访问系统关键区域。 部分PE结构解析:DOS头 WORD e_magic: 固定值为“MZ”,标识这是一个可执行文件。 DWORD e_lfanew: PE头相对于文件起始位置的偏移,用于定位PE头的位置。 标准PE头 WORD Machine: 表示运行该程 ...
PE3_11 PE头_解析手动
发表于2024-10-12
内存对齐在硬盘和内存中的程序数据可能会有所不同,原因是内存对齐。对齐的作用在于加快内存访问的速度。 文件在内存中的分节存储 程序文件在内存中被分为不同的段(sections)存储。 不同段之间通常有填充字节(例如0),但有些段可以被多个程序共享,以节省内存资源。 可以看到段与段之间有很多0填充,比如说数据段,但是有些段可以共用,比如多开程序,共享一个数据区域,节省内存 程序运行时的变化 从硬盘加载到内存时,程序会根据文件格式进行相应的布局变化。硬盘中的文件格式与内存中的程序结构并不完全相同,内存对齐会造成某些数据的拉伸和填充。 需要记住的关键结构 DOS头 MZ标志位(程序以“MZ”开头) PE标识偏移(指向PE头的偏移) 标准PE头 PE标识位:PE\x00\x00 目标处理器类型(CPU类型) 区段数(Section数量) 选项头大小(Optional Header Size) 特征值(文件属性标志) 可选PE头 标志位 所有代码区块总大小 所有初始化数据区段总大小 所有未初始化区块总大小 程序入口点(OEP, Original Entry Point) 代 ...
ASM32 11 计算机
发表于2024-10-05
代码实现新建空白工程 在工程处新建菜单 打开Res文件夹 在文件名处输入MENU1后保存 选择确定 完成后资源处会增加菜单 点击打开菜单编辑器然后输入标题选择插入然后确定 插入成功后发现新建的菜单资源已成功写入 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990.386.model flat,stdcalloption casemap:noneinclude windows.incinclude user32.incinclude kernel32.incinclude gdi32.incincludelib user32.libincludelib kernel32.libincludelib gdi32.libIDR_MENU EQU 10000.constASM_MENU_NA ...
ASM32 9-10 反汇编代码和函数
发表于2024-09-26
反汇编代码根据CPU指令表找到对应的汇编代码 32位反汇编的默认操作数大小为32,若前面加了66前缀可以减小为16,即把eax改为ax;而如果加67可以前缀可以增大大小,但若本来就为eax则没有作用,反而可能使编译出错 示例 1234567896A 00 push 0E8 7C 00 00 00 call 81A3 00 30 40 00 mov dword ptr[00403000],eaxE8 B4 00 00 00 call b96A 00 push 068 EF 11 40 00 push 0x004011ef6A 00 push 06A 65 push 65FF 35 00 30 40 00 push dword ptr [00403000] 6A 00 — push 0 6A 是 push 指令的操作码,用于将一个字节大小的立即数压入堆栈。 00 是立即数,表示将 0 压入堆栈。 E8 7C 00 00 00 — call 81 E8 是 call 指令的操作码,用于调用一个相对的函数地址,地址是相对当前指令指针(EIP)的偏移。 ...
1…345…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