滴水6.4号 在高空运行 ImageBase

目标:

在高空运行本程序,内存写入其他程序,修改线程上下文,让其他程序运行

程序还没写完

先写到复制到内存拉伸,还没修复导入表

程序设置固定基址 0x2000000 

把需要读取的程序申请内存在0x400000

重定位表不用修复,但是导入表要按照 系统一样,将IAT表修改成函数的地址

还没写!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include"函数列表.h"
void* readAFile(LPCTSTR lpFileName, LPVOID lpBaseAddress)
{
	//打开文件
	FILE* fp = NULL;
	fp = fopen("E:\\c++\\pe\\进程\\加载进程-隐藏模块\\Debug\\A.exe", "r+b");
	if (fp == NULL)
	{
		printf("打开文件失败\n");
		return NULL;
	}
	fseek(fp, 0, SEEK_END);
	int size = ftell(fp);
	fseek(fp, 0, SEEK_SET);
	void* filebuffer = malloc(size);
	memset(filebuffer, 0, size);
	if (filebuffer == NULL)
	{
		printf("申请内存失败\n");
		return NULL;;
	}
	fread(filebuffer, size, 1, fp);//读取文件到内存
	fclose(fp);												 //关闭文件流
	return filebuffer;
}     
 void* FileToAImageBase(void* filebuffer){
//读取文件的信息
	PIMAGE_DOS_HEADER pDosHeader             = (PIMAGE_DOS_HEADER)filebuffer;                                                      //dos头
	PIMAGE_NT_HEADERS pNtHeader		         = (PIMAGE_NT_HEADERS)((DWORD)pDosHeader + pDosHeader->e_lfanew);                      //nt头
	PIMAGE_FILE_HEADER pFileHeader           = (PIMAGE_FILE_HEADER)&pNtHeader->FileHeader;                                         //文件头
	PIMAGE_OPTIONAL_HEADER32 pOptionalHeader = (PIMAGE_OPTIONAL_HEADER32)&pNtHeader->OptionalHeader;                               //可选头
	PIMAGE_SECTION_HEADER pSectionHeader     = (PIMAGE_SECTION_HEADER)((DWORD)pOptionalHeader + pFileHeader->SizeOfOptionalHeader);//节头
	DWORD NumberOfSections                   = pFileHeader->NumberOfSections;														//节的数量                                                   //节的数量
	//读取每个节的起始位置
	DWORD* SectioinVirtualAddress =(DWORD*) malloc(NumberOfSections * sizeof(DWORD));
	if (SectioinVirtualAddress == NULL)
	{
		printf("申请内存失败\n");
		return NULL;;
	}
	memset(SectioinVirtualAddress, 0, NumberOfSections * sizeof(DWORD));
	
	//读取每个节在内存中的大小
	DWORD* SectioinSize   = (DWORD*)malloc(NumberOfSections * sizeof(DWORD));
	if (SectioinSize == NULL)
	{
		printf("申请内存失败\n");
		return NULL;;
	}
	memset(SectioinSize, 0, NumberOfSections * sizeof(DWORD));
	//读取每个节在文件中对齐后的大小
	DWORD* SectioinSizeOfRawData = (DWORD*)malloc(NumberOfSections * sizeof(DWORD));
	if (SectioinSizeOfRawData == NULL)
	{
		printf("申请内存失败\n");
		return NULL;
	}
	memset(SectioinSizeOfRawData, 0, NumberOfSections * sizeof(DWORD));
	//读取每个节在文件中的起始位置	
	DWORD* SectioinPointerToRawData = (DWORD*)malloc(NumberOfSections * sizeof(DWORD));	
	if (SectioinPointerToRawData == NULL)
	{
		printf("申请内存失败\n");
		return NULL;;
	}			
	memset(SectioinPointerToRawData, 0, NumberOfSections * sizeof(DWORD));	

	for (int i = 0; i < NumberOfSections; i++)
	{
		SectioinVirtualAddress[i]           = pSectionHeader[i].VirtualAddress;//内存中的起始位置
		SectioinSize[i]                     = pSectionHeader[i].Misc.VirtualSize;//内存中没有对齐的大小
		SectioinSizeOfRawData[i]            = pSectionHeader[i].SizeOfRawData;//文件中对齐后的大小
		SectioinPointerToRawData[i]         = pSectionHeader[i].PointerToRawData;//文件中的起始位置
		printf("第 %d 个节区内存起始位置 %x\n " , i, SectioinVirtualAddress[i]);
		printf("第 %d 个节区内存未对齐大小 %x\n ", i, SectioinSize[i]);
		printf("第 %d 个节区文件起始位置 %x\n " , i, SectioinPointerToRawData[i]);
		printf("第 %d 个节区文件对齐后大小 %x\n ", i, SectioinSizeOfRawData[i]);
		printf("------------------------------\n");
	}
	//定位到IAT表
	DWORD IATRVA = pOptionalHeader->DataDirectory[1].VirtualAddress;
	//拉伸文件到另一个内存区域
	void* lpBaseAddress = VirtualAlloc((LPVOID)0x00400000, pOptionalHeader->SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	if (lpBaseAddress == NULL)
	{
		printf("申请内存失败\n");
		return NULL;
	}
	//先复制头部信息
	memcpy(lpBaseAddress, filebuffer, pOptionalHeader->SizeOfHeaders);//PE文件头部在文件中的按照文件对齐后的总大小
	//将文件中的数据拷贝到内存中
	for (int i = 0; i < NumberOfSections; i++)
	{
		memcpy((void*)((DWORD)lpBaseAddress + SectioinVirtualAddress[i]), (void*)((DWORD)filebuffer + SectioinPointerToRawData[i]), SectioinSizeOfRawData[i]);//(内存中的起始位置,文件中的起始位置,文件中的大小)
	}
	
}

如果对你有帮助,请点个赞!!!

以鼓励我继续更新,谢谢啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值