2012-11-12 26 views
2

那麼我有.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文件指針點之後,但我不能從療法

回答

1

讀取另一個可能的解決辦法是將最後一個頭結構存儲在文件中,包含數據開始處的文件偏移量和數據長度。然後你的程序可以很容易地找到文件的結尾(減去標題的大小),並讀取數據的位置和長度。


你要做的就是把你的可執行文件,將其寫入第二個文件,可能寫的填充,寫數據,寫可能更多的填充,最後寫入數據的長度和數據的位置在文件中。

的文件看起來(上盤)是這樣的:

 
+-------------+ 
| Executable | 
| Program  | 
+-------------+ 
| Padding  | 
+-------------+ 
| Data  | 
+-------------+ 
| Padding  | 
+-------------+ 
| Data length | 
| Data pos. | 
+-------------+ 

現在可執行文件可以打開該文件爲常規文件,只讀。尋找最後減去data lengthdata position fields(通常爲sizeof(DWORD)(兩倍))的大小。閱讀兩個字段的長度和位置。現在您可以查找數據的實際位置(data pos.)並閱讀data length字節以讀取實際數據。

+0

問題是我不能真正從文件中讀取任何東西,但「MZ」使用ReadFile函數 – spandei

+0

@spandei請參閱我編輯的答案。 –

+0

這很好,但看起來我還沒有設法解釋我想要所有這些東西的工作。我想創建一個包含另一個文件的可執行文件,這樣就可以運行帶有文件的exe文件,並在執行過程中從內存中解壓第二個文件。你在說的是:在執行過程中使用exe文件和exe文件使用該文件創建另一個exe文件,並在其中注入文件。但我需要一個自我包裝的exe。 – spandei

相關問題