利用PE文件对齐,进行数据隐藏和提取

该程序主要是利用PE文件对齐,进行数据隐藏和提取,如果对您有帮助请点一个赞,那方面写的不好的请直接评论批评,我一定会尽最大努力改正

PE隐藏

#include<stdio.h>
#include<Windows.h>
#include <stdlib.h>
int main()
{
	HANDLE hfile = CreateFileA(
		"C:\\Users\\486\\Desktop\\WP\\magic.exe",//文件路径 
		GENERIC_ALL,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		0);
	DWORD fileSize = GetFileSize(hfile, NULL);
	char* fileBuff;
	fileBuff = (char*)malloc((size_t)fileSize);
	BOOL flag = FALSE;
	flag = ReadFile(hfile, fileBuff, fileSize, NULL, NULL);
	if (flag)
		printf("文件读取成功\n");
	else
		printf("文件读取失败\n");
	PIMAGE_DOS_HEADER pDosHeaders = (PIMAGE_DOS_HEADER)fileBuff;//PE DOS头
	PIMAGE_NT_HEADERS NTHead = (PIMAGE_NT_HEADERS)((DWORD)fileBuff + pDosHeaders->e_lfanew);//PE NT头
	PIMAGE_FILE_HEADER PEHead = &NTHead->FileHeader;//PE头 
	PIMAGE_OPTIONAL_HEADER PEOptionalHeader = &NTHead->OptionalHeader;//PE可选头 
	PIMAGE_SECTION_HEADER PEZone = IMAGE_FIRST_SECTION(NTHead);//PE 节表头 
	for (int i = 0; i < PEHead->NumberOfSections; i++) {
		char name[9];
		memcpy_s(name, 9, PEZone->Name, 8);
		printf("区段名称:%s\t", name);
		printf("可以隐藏的数据大小:%d字节\n", PEZone->SizeOfRawData - PEZone->Misc.VirtualSize);
		PEZone++;
	}
	int num;
	printf("请输入你要隐藏在第几个节:");
	scanf("%d", &num);
	PEZone = IMAGE_FIRST_SECTION(NTHead);
	for (int i = 0; i < num; i++) {
		if (i == num - 1) {
			char name[9];
			memcpy_s(name, 9, PEZone->Name, 8);
			printf("区段名称:%s\t", name);
			printf("可以隐藏的数据大小:%d字节\n", PEZone->SizeOfRawData - PEZone->Misc.VirtualSize);
		}
		else
			PEZone++;
	}
	char a = getchar();
	char data[1000] = { 0 };
	printf("请输入您要隐藏的数据:");
	gets(data);
	if(strlen(data) > PEZone->SizeOfRawData - PEZone->Misc.VirtualSize){
		printf("隐藏的数据太长\n");
		return 0;
	}
	DWORD yincang_data = SetFilePointer(hfile, PEZone->PointerToRawData + PEZone->SizeOfRawData - (PEZone->SizeOfRawData - PEZone->Misc.VirtualSize),NULL,0);
	DWORD yinD = 0;
	BOOL yin = WriteFile(hfile,data,sizeof(PEZone->Misc.VirtualSize),&yinD,NULL);
	if(yin)
		perror("数据隐藏成功");
	else
		perror("数据隐藏失败"); 
	DWORD yi;
	if(PEHead->SizeOfOptionalHeader == 0xE0)
		yi = 0x8;
	else
		yi = 0x18;
	DWORD pianyi = SetFilePointer(hfile,(pDosHeaders->e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * (num - 1) + yi),NULL,0);
	DWORD VirtualSize = (DWORD)(PEZone->Misc.VirtualSize + (DWORD)strlen(data));
	DWORD dwWrited = 0;
	BOOL Write = WriteFile(hfile,&VirtualSize,sizeof(PEZone->Misc.VirtualSize),&dwWrited,NULL);
	return 0;
}

PE提取

#include<stdio.h>
#include<Windows.h>
#include <stdlib.h>
int main()
{
	HANDLE hfile = CreateFileA(
		"C:\\Users\\486\\Desktop\\WP\\magic.exe",//文件路径 
		GENERIC_ALL,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		0);
	DWORD fileSize = GetFileSize(hfile, NULL);
	char* fileBuff;
	fileBuff = (char*)malloc((size_t)fileSize);
	BOOL flag = FALSE;
	flag = ReadFile(hfile, fileBuff, fileSize, NULL, NULL);
	PIMAGE_DOS_HEADER pDosHeaders = (PIMAGE_DOS_HEADER)fileBuff;//PE DOS头
	PIMAGE_NT_HEADERS NTHead = (PIMAGE_NT_HEADERS)((DWORD)fileBuff + pDosHeaders->e_lfanew);//PE NT头
	PIMAGE_FILE_HEADER PEHead = &NTHead->FileHeader;//PE头 
	PIMAGE_OPTIONAL_HEADER PEOptionalHeader = &NTHead->OptionalHeader;//PE可选头 
	PIMAGE_SECTION_HEADER PEZone = IMAGE_FIRST_SECTION(NTHead);//PE 节表头 
	for (int i = 0; i < PEHead->NumberOfSections; i++) {
		char name[9];
		memcpy_s(name, 9, PEZone->Name, 8);
		printf("区段名称:%s\n", name);
		PEZone++;
	}
	int num,len;
	printf("请输入你要提取在第几个节和提取的长度:");
	scanf("%d%d", &num,&len);
	PEZone = IMAGE_FIRST_SECTION(NTHead);
	for (int i = 0; i < num; i++) {
		if (i == num - 1) {
			char name[9];
			memcpy_s(name, 9, PEZone->Name, 8);
			printf("区段名称:%s\t提取长度:%d\n", name,len);
		}
		else
			PEZone++;
	}
	HANDLE Tfile = CreateFileA(
			"C:\\Users\\486\\Desktop\\WP\\123.txt",//文件路径 
			GENERIC_ALL,
			FILE_SHARE_READ,
			NULL,
			OPEN_ALWAYS,
			FILE_ATTRIBUTE_NORMAL,
			0);
	char* TfileBuff;
	TfileBuff = (char*)malloc(sizeof(char)*len);
	BOOL Tflag = FALSE;
	DWORD tiqu_data = SetFilePointer(hfile, PEZone->PointerToRawData + PEZone->SizeOfRawData - (PEZone->SizeOfRawData - PEZone->Misc.VirtualSize) - len,NULL,0);
	Tflag = ReadFile(hfile, TfileBuff,len, NULL, NULL);
	if (Tflag)
		printf("文件读取成功\n");
	else
		printf("文件读取失败\n");
	DWORD dwWrited = 0;
	BOOL Write = WriteFile(Tfile,TfileBuff,len,&dwWrited,NULL);
	if(Write)
		perror("文件写入成功");
	else
		perror("文件写入失败");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值