1、要判断空间是否足够
要判断节目录下面是否有足够的空间添加一个节目录项,一个节目录项需要40个字节的空间,而且整个节目录必须以40个存储 0的字节结尾,也就是所加一个节目录项只是需要 80个字节的空间。
2、复制一个相同属性的节,然后在复制过来的基础上进行修改必要的属性
3、修改节属性
1、修改节的数量 _IMAGE_FILE_HEADER->NumberOfSections
2、修改PE文件内存拉伸后的大小,_IMAGE_OPTIONAL_HEADER ->SizeOfImage
3、在文件尾添加空间,按照文件对齐来添加
4、修改节的属性 _IMAGE_SECTION_HEADER->Characteristics
5、修改节的名字 _IMAGE_SECTION_HEADER->Name
6、修改节在内存中的大小_IMAGE_SECTION_HEADER->Misc.VirtualSize, 这个尺寸可以直接修改为 和文件中对齐后的长度,也就是在文件中加了多少个字节(包括对齐的0)就写多少个字节
7、修改在内存中偏移的地址VirtualAddress ,是上一个节的VirtualAddress值加上Misc.VirtualSize,然后按文件对齐后的尺寸
3503C+1D4000=20 903C+1000=20 A03C=20A000
8.修改在文件中对齐的大小SizeOfRawData,这个值和第6条一样,内存中对齐前大小就是按照这个些的。
9.修改在文件中的偏移PointerToRawData,实际就是上一个节的在文件中的偏移PointerToRawData+在文件中对齐后的尺寸SizeOfRawData
10.修改最后一个节 Characteristics ,节的属性,60000020 表示代码节属性
极端情况怎么处理
1、节表项目下面没有空间,可以把整个PE头,整体往DOS头下面的数据区移动,然后修改DOS头指向PE头的属性e_lfanew
2、如果第一条的空间也不过, 就扩大最后一个节的尺寸,扩大最后一个节不影响其它节。
扩大节的步骤:
Ex 新增节的大小
增加一个节的源代码
(其它函数代码见前篇文章:代码节空白区添加代码(手动)(含C练习代码))
//主程序 在PE空白区域添加代码,并且从改代码执行,执行完添加的代码后再从原来的入口执行
#include <stdio.h>
#include <stdlib.h>
#include "func.h"
int main(void)
{
//PrintNTHeaders();//打印PE头信息
//TestAddCodeIncodeSec();
TestAddSecIncode();
getchar();
return 1;
}
//func.h 头文件
#pragma once
#include <Windows.h>
#define FILEPATH "D:/ipmsg.exe"
#define FILEPATH_NEW "D:/ipmsg_new.exe"
//函数声明
//**************************************************************************
//ReadPEFile:将文件读取到缓冲区
//参数说明:
//lpszFile 文件路径
//pFileBuffer 缓冲区指针
//返回值说明:
//读取失败返回0 否则返回实际读取的大小
//**************************************************************************
DWORD ReadPEFile(IN LPSTR lpszFile, OUT LPVOID* pFileBuffer);
//CopyFileBufferToImageBuffer:将文件从FileBuffer复制到ImageBuffer
//参数说明:
//pFileBuffer FileBuffer指针
//pImageBuffer ImageBuffer指针
//返回值说明:
//读取失败返回0 否则返回复制的大小
//**********************************************