好吧,我有 .exe 应用程序和其他一些文件。我想要做的是将这个其他文件写入 .exe 文件的末尾。.exe 文件应该在它的内存中找到这个文件的地址,从那里读取它并做一些事情。
我能够访问我之前写入内存的文件的地址,但是当我尝试从那里读取时,我得到拒绝访问异常。我怎样才能从那里阅读?
基本上我只想拥有一个自解压的 PE 文件。是的,我知道,我可以制作自解压存档,但这不是我想要的,因为我需要 .exe 和 .dll 但自解压存档只能是 .exe,所以看起来唯一的方法是让我的应用程序自己- 提取自身。这是代码:
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 文件指针指向,但我无法从中读取