PE练习代码@硬盘上的PE文件->FileBuffer->ImageBuffer->NewBuffer->存盘

该博客介绍了如何将硬盘上的PE文件转换为内存中的FileBuffer,接着将其扩展为4GB大小的ImageBuffer,然后通过NewBuffer操作还原回FileBuffer形式,并最终重新保存为PE文件。
摘要由CSDN通过智能技术生成

实现功能: 硬盘上的PE文件-》FileBuffer(原封不动的复制到内存)-》ImageBuffer(拉伸为4G空间存储模式)=>NewBuffer(又还原成FileBUffer)=>存盘(保存为PE文件)

//主程序 硬盘上的PE文件-》FileBuffer(原封不动的复制到内存)-》ImageBuffer(拉伸为4G空间存储模式)=>NewBuffer(又还原成FileBUffer)=>存盘(保存为PE文件)
#include <stdio.h>
#include <stdlib.h>
#include "func.h"

int main(void)
{
   
	PrintNTHeaders();//打印PE头信息

	LPVOID pFileBuffer = NULL;
	LPVOID pImageBuffer = NULL;
	LPVOID pNewBuffer = NULL;
	size_t size;
	if (!ReadPEFile(FILEPATH, &pFileBuffer))
	{
   
		printf("文件读取失败\n");
		return;
	}

	printf("newbuffer开始的位置:%p \n", pNewBuffer);
	CopyFileBufferToImageBuffer(pFileBuffer, &pImageBuffer);
	size=CopyImageBufferToNewBuffer(pImageBuffer, &pNewBuffer);
	printf("newbuffer里的pImageBuffer当前位置:%p \n", pNewBuffer);

    MemeryTOFile(pNewBuffer, size, "D:/逆向学习/soure/b.exe");



	getchar();
	return 1;

}
//func.h  头文件
#pragma once
#include <Windows.h>
#define FILEPATH "D:/逆向学习/soure/HelloWorld.exe"
//函数声明								

//**************************************************************************								
//ReadPEFile:将文件读取到缓冲区								
//参数说明:								
//lpszFile 文件路径								
//pFileBuffer 缓冲区指针								
//返回值说明:								
//读取失败返回0  否则返回实际读取的大小								
//**************************************************************************								
DWORD ReadPEFile(IN LPSTR lpszFile, OUT LPVOID* pFileBuffer);

//CopyFileBufferToImageBuffer:将文件从FileBuffer复制到ImageBuffer								
//参数说明:								
//pFileBuffer  FileBuffer指针								
//pImageBuffer ImageBuffer指针								
//返回值说明:								
//读取失败返回0  否则返回复制的大小								
//**************************************************************************								
DWORD CopyFileBufferToImageBuffer(IN LPVOID pFileBuffer, OUT LPVOID* pImageBuffer);

//**************************************************************************								
//CopyImageBufferToNewBuffer:将ImageBuffer中的数据复制到新的缓冲区								
//参数说明:								
//pImageBuffer ImageBuffer指针								
//pNewBuffer NewBuffer指针								
//返回值说明:								
//读取失败返回0  否则返回复制的大小								
//**************************************************************************								
DWORD CopyImageBufferToNewBuffer(IN LPVOID pImageBuffer, OUT LPVOID* pNewBuffer);

//MemeryTOFile:将内存中的数据复制到文件								
//参数说明:								
//pMemBuffer 内存中数据的指针								
//size 要复制的大小								
//lpszFile 要存储的文件路径								
//返回值说明:								
//读取失败返回0  否则返回复制的大小								
//**************************************************************************								
BOOL MemeryTOFile(IN LPVOID pMemBuffer, IN size_t size, OUT LPSTR lpszFile);


//打印PE文件信息
VOID PrintNTHeaders();
//func.c 函数的实现

#include "func.h"
#include <stdio.h>


DWORD ReadPEFile(LPSTR lpszFile, OUT LPVOID* pFileBuffer)
{
   
	FILE* pFile = NULL;
	DWORD fileSize = 0;
	//LPVOID pFileBuffer = NULL;

	//打开文件	
	pFile = fopen(lpszFile, "rb");
	if (!pFile)
	{
   
		printf(" 无法打开 EXE 文件! ");
		return NULL;
	}
	
在微信小程序中,选择文件并上传至云存储通常涉及以下几个步骤: **小程序端(前端)代码示例**(使用WXML、WXSS和JS编写): ```wxml <!-- index.wxml --> <view> <button bindtap="chooseFile">选择文件</button> <view wx:if="{{fileList.length > 0}}"> <text>{{fileList[0].name}}</text> <button bindtap="uploadFile">上传文件</button> </view> </view> <!-- index.js --> Page({ data: { fileList: [], }, chooseFile: function() { wx.chooseFile({ success: res => { this.setData({ fileList: res.tempFiles, }); } }); }, uploadFile: async function() { const file = this.fileList[0]; await cloud.uploadFile({ filePath: file.path, // 文件路径 fileName: file.name, // 新的文件名(如果需要) 雲存儲地址: 'your-cloud-storage-url', // 替换为实际的云存储URL header: { 'content-type': 'application/octet-stream', }, }).then(res => { console.log('上传成功', res); this.uploadToCloudFunction(file.url); // 调用云函数处理上传文件 }); }, uploadToCloudFunction:云.request({ url: 'https://your-function-url', // 云函数的URL method: 'POST', data: { url: file.url, // 上传文件的链接 }, }), }); ``` **云函数(Node.js + node-xlsx)代码示例**: ```javascript // cloud_function.js (假设已安装了express和axios依赖) const express = require('express'); const axios = require('axios'); const xlsx = require('node-xlsx'); const app = express(); app.post('/processExcel', async (req, res) => { try { const uploadedUrl = req.body.url; // 微信云存储的文件URL const response = await axios.get(uploadedUrl, { responseType: 'stream' }); const fileBuffer = []; response.data.on('data', chunk => fileBuffer.push(chunk)); response.data.on('end', () => { const workbook = xlsx.parse(Buffer.concat(fileBuffer)); // 进行解析操作,例如获取数据或分析工作簿 const parsedData = processWorkbook(workbook); res.json({ result: parsedData }); }); } catch (error) { console.error(error); res.status(500).json({ error: 'Error processing Excel file' }); } }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Cloud Function listening on port ${PORT}`); }); ``` 以上代码展示了基本流程,但在实际应用中,你需要替换`your-cloud-storage-url`和`your-function-url`为实际的云存储地址和云函数地址,并处理`processWorkbook`函数以适应你的需求。 **相关问题--:** 1. 小程序如何处理文件上传失败的情况? 2. 云函数如何保证文件安全地保存和访问? 3. 在处理Excel文件时,如何避免node-xlsx的内存消耗过大?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值