一. 代码节空白区域添加代码
1. 根据SizeOfRawData – VirtualAddress的值来判断剩余空间是否足以添加代码
2. 根据SizeOfRawData + PointerToRawData来到空余部分
3. 将汇编指令转为硬编码:此处添加的代码是MessageBox,可以通过OD(走下角命令 bp MessageBoxA)来查看MessageBox的地址。
6a 00 6a 00 6a 00 6a 00 e8 00 00 00 00 e9 00 00 00 00
push 6a
call e8
jmp e9
目标地址 = 下一行地址(运行时的地址) + 硬编码(命令后的地址)
call :761a1060 – (01caad + 400000) = 75D8 45B3
000193BE + 400000 = 4193be 目标地址 (EIP地址 + ImageBase)
41cab2 下一行地址
jmp :FFFF C90C硬编码
4. 改EIP
此时不用加上ImageBase
二. 任意节空白区添加代码
注意:在DOS后面是不可以直接作为程序入口添加硬编码的。
其他内容基本同上。
三. 增加节
需要修改的数据
1. 添加一个新的节(可以copy一份)
2. 在新增节后面 填充一个节大小的000
3. 修改PE头中节的数量
4. 修改sizeOfImage的大小
5. 再原有数据的最后,新增一个节的数据(内存对齐的整数倍).
6. 修正新增节表的属性
如果在最后一个节表以及40字节的空白区域之后不足以有四十个字节的空间(等长的0结构)添加一个节表,那么可以考虑将标准PE头到节表移动到DOS头结束的位置,即40H。注意复制粘贴的时候需要选中相同的行数。之后将节表末尾的数据清零即可。
四. 扩大节
如果SizeOfHeaders的空间不足以添加一个节表,那么就可以选择扩大最后一个节。
1. 修改SizeOfImage :SizeOfImage += Ex
2. 将最后一个节的SizeOfRawData和VirtualSize改成N
SizeOfRawData = VirtualSize = N
N = (SizeOfRawData或者VirtualSize 内存对齐后的值) + Ex
五. 合并节
合并节可以节省几个节表的空间,从而可以在剩余的位置添加新节表。
1. VirtualAddress和PointerToRawData两个起点位置不用修改。
2. SizeOfRawData = VirtualSize = SizeOfImage – VirtualAddress 或 (最后一个节的VirtualAddress + SizeOfRawData、VirtualSize中较大的那一个)。
3. 将第一个节的属性改为包含所有节的属性
4. 修改节的数量为1 :NumOfSection = 1
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!