新增节-添加代码

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  否则返回复制的大小								
//**********************************************
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值