Запись в память программы в шестнадцатеричном редакторе и чтение программно

Ну, у меня есть приложение .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 указатель на файл указывает сразу после конца файла, где хранится мой упакованный файл, но я не могу прочитать из него

2

Решение

Исполняемые двоичные файлы Microsoft PE содержат отдельный раздел для Ресурсы который может быть помещен в файл — как, например, ресурсы используются для доставки данных в исполняемые файлы. Это где вы, скорее всего, хотите разместить свои данные.

Взглянуть: http://www.devsource.com/c/a/Architecture/Resources-From-PE-I/

5

Другие решения

Другим возможным решением было бы сохранить последнюю структуру заголовка в файле, содержащую смещение в файле, где начинаются данные, и длину данных. Тогда ваша программа может легко искать в конце файла (минус размер заголовка) и считывать положение и длину данных.


Что вы делаете, это берете свой исполняемый файл, записываете его во второй файл, возможно записываете заполнение, записываете данные, записываете возможное дополнительное заполнение и, наконец, записываете длину данных и положение данных в файле.

Файл будет выглядеть (на диске) примерно так:

+-------------+
| Исполняемый файл |
| Программа |
+ ------------- +
| Обивка |
+ ------------- +
| Данные |
+ ------------- +
| Обивка |
+ ------------- +
| Длина данных |
| Данные поз. |
+ ------------- +

Теперь исполняемый файл может открывать файл как обычный файл, только для чтения. Искать до конца минус размер data length а также data position fields (как правило, sizeof(DWORD) (раз два)). Прочитайте два поля для длины и положения. Теперь вы можете искать фактическое положение данных (data pos.) и читать data length байты для чтения фактических данных.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector