那麼我有.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文件指針點之後,但我不能從療法
問題是我不能真正從文件中讀取任何東西,但「MZ」使用ReadFile函數 – spandei
@spandei請參閱我編輯的答案。 –
這很好,但看起來我還沒有設法解釋我想要所有這些東西的工作。我想創建一個包含另一個文件的可執行文件,這樣就可以運行帶有文件的exe文件,並在執行過程中從內存中解壓第二個文件。你在說的是:在執行過程中使用exe文件和exe文件使用該文件創建另一個exe文件,並在其中注入文件。但我需要一個自我包裝的exe。 – spandei