在十六进制编辑器中写入程序内存,并以编程方式读取
Writing to program memory in hex editor and reading programmatically
我有.exe应用程序和其他一些文件。我要做的是将此其他文件写入.exe文件的末尾。.exe文件应在其内存中找到此文件的地址,从那里读取并做一些事情。
我能够进入之前写给内存的文件的地址,但是当我尝试从那里阅读时,我会被访问拒绝。我该如何从那里阅读?
基本上,我只想拥有一个自用的PE文件。是的,我知道,我可以做自我提取的档案 - 提取自己。这是代码:
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 WORLDn");
getchar();
return 0;
}
在存储包装文件的文件结束后调用setFilePointer文件指针点后,我无法从ther
Microsoft的PE可执行二进制文件包含一个单独的部分,用于 resources ,可以将其放置在文件中 - 如上所示,资源用于在可执行文件中运送数据。这是您很可能想要将数据放入的地方。
看一下:http://www.devsource.com/c/a/architecture/resources-from-pe-i/
可能的另一个解决方案是将标头结构持续存储在文件中,其中包含偏移到数据启动的文件中,以及数据的长度。然后,您的程序可以轻松地寻找文件的末尾(减去标头的大小),并读取数据的位置和长度。
您要做的就是将可执行文件,将其写入第二个文件,可能写入填充,写入数据,写更多的填充物,最后写入数据的长度以及数据在文件中的位置。
文件将(在磁盘上)看起来像:
--------------- |可执行||程序| --------------- |填充| --------------- |数据| --------------- |填充| --------------- |数据长度||数据pos。| ---------------
现在,可执行文件可以将文件作为常规文件打开,仅读取。寻求最终减去data length
和data position fields
的大小(通常是sizeof(DWORD)
(第二次))。读取两个字段的长度和位置。现在,您可以查找数据所在位置的实际位置(data pos.
)并读取data length
字节以读取实际数据。
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 如何读取套接字编程(c ++)中的所有数据?
- 使用 ffmpeg 以编程方式读取 fMP4
- 如何使用 c++ 以编程方式读取地理数据
- 在十六进制编辑器中写入程序内存,并以编程方式读取
- 以编程为QTIMEEDIT的读取
- Linux套接字编程:读取Sigio的数据
- 无法在 Windows 中以编程方式从其他用户帐户读取文件(C++)
- 将C++结构写入文件并使用另一种编程语言读取文件
- QT编程CSV从特定文件读取和写入
- Windows 8:如何以编程方式读取用户文档文件夹路径(使用 c)
- 读取文件行和查询结果的编程函数
- c++防御性编程:从具有类型安全的缓冲区中读取
- 以编程方式读取internet explorer cookie
- 如何在Windows中以编程方式从调用堆栈帧中读取函数参数
- C++编程,从字符串中读取行
- 访问冲突读取位置0xfeeefef2多线程编程c++窗口