gpt4 book ai didi

c++ - 在十六进制编辑器中写入程序存储器并以编程方式读取

转载 作者:可可西里 更新时间:2023-11-01 09:48:13 31 4
gpt4 key购买 nike

嗯,我有 .exe 应用程序和一些其他文件。我想要做的是将这个其他文件写入 .exe 文件的末尾。 .exe 文件应该在它的内存中找到这个文件的地址,从那里读取它并做一些事情。

我能够找到我之前写入内存的文件的地址,但是当我尝试从那里读取时,我遇到了访问被拒绝的异常。我如何从那里阅读?

基本上我只是想要一个自解压的PE文件。是的,我知道,我可以制作自解压存档,但这不是我想要的,因为我同时需要 .exe 和 .dll,但自解压存档只能是 .exe,所以看起来唯一的方法是让我的应用程序 self -提取自身。这是代码:

int main(void)
{
HMODULE hBegin = GetModuleHandle(NULL);

PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)hBegin;
PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)((PBYTE)hBegin + dosHeader->e_lfanew);
PIMAGE_SECTION_HEADER pSectionTable = (PIMAGE_SECTION_HEADER)(ntHeaders + 1);


// get size of each section
DWORD dwSize = 0;

for(int i = 0; i < ntHeaders->FileHeader.NumberOfSections; i++)
{
dwSize += pSectionTable[i].SizeOfRawData;
}

//get size of PE headers
dwSize += ntHeaders->OptionalHeader.SizeOfHeaders;

WCHAR lpszSfxPath[MAX_PATH];
GetModuleFileNameW(NULL, lpszSfxPath, MAX_PATH);
HANDLE hFile = CreateFileW(lpszSfxPath,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
SetFilePointer(hFile, dwSize, NULL, FILE_BEGIN);
BYTE BUF[10];
if(!ReadFile(hFile,BUF,sizeof(BYTE),NULL,NULL))
printf("FAIL!\n");

printf("HELLO WORLD\n");
getchar();
return 0;
}

调用 SetFilePointer 后,文件指针指向存储打包文件的文件末尾,但我无法从那里读取

最佳答案

Microsoft 的 PE 可执行二进制文件包含一个单独的资源部分,可以将其放置在文件中 - 例如,资源用于在可执行文件中传送数据。这是您最有可能想要放置数据的地方。

看看:http://www.devsource.com/c/a/Architecture/Resources-From-PE-I/

关于c++ - 在十六进制编辑器中写入程序存储器并以编程方式读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13345295/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com