在hex编辑器中写入程序存储器并以编程方式读取

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

我能够得到我写到内存的文件的地址,但是当我尝试从那里读取我得到访问被拒绝exception。 我怎样才能从那里读取?

基本上我只想要一个自解压的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文件指针点后立即文件结束我的打包文件存储,但我无法读取

微软的PE可执行二进制文件包含一个单独的资源部分,可以放在文件中,如资源用于在可执行文件中发送数据。 这是您最想要放置数据的位置。

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

另一个可能的解决方案是在文件中最后存储头结构,包含数据开始处的偏移量和数据的长度。 然后你的程序可以很容易地找到文件的结尾(减去头的大小),并读取数据的位置和长度。


你要做的就是把你的可执行文件,写入第二个文件,可能写入填充,写入数据,写入更多的填充,最后写入数据的长度和数据在文件中的位置。

该文件将看起来像(在磁盘上):

 + ------------- +
 | 可执行|
 | 程序|
 + ------------- +
 | 填充|
 + ------------- +
 | 数据|
 + ------------- +
 | 填充|
 + ------------- +
 | 数据长度|
 | 数据位置  |
 + ------------- +

现在可执行文件可以作为常规文件打开文件,只读。 寻找到最后减去data lengthdata position fields的大小(通常是sizeof(DWORD) (times two))。 阅读两个字段的长度和位置。 现在你可以找到数据所在的实际位置( data pos.位置),并读取data length字节来读取实际数据。