簡體   English   中英

如何恢復 Windows 可執行文件的原始入口點?

[英]How to restore original entry point of a windows executable?

我正在嘗試學習如何修改 Windows PE 並制作包裝器。 我目前所做的是獲取一個 exe 文件,向其中添加一個新部分並將 oep 更改為該新部分。 新部分的作用是跳回文件的原始地址。 這是新部分的代碼:

__asm {
    pushad
        mov eax, 0x0044F125 //oep
        jmp eax
}

如您所見,我必須對 oep 地址進行硬編碼。 有什么方法可以存儲 oep 或計算它?

首先,PE 文件的入口點在標題中,總而言之,PE 格式包含:

  • MZ Header(出於兼容性目的,但包含 PE Header 的偏移量)。
  • PE 標頭(包含有關文件的信息、多少節、導入等...)。 包含:文件頭、可選頭(這是包含 PE 文件入口點的頭。
  • 章節標題
  • 截面數據

有關 PE 的更多信息:

如果你想做一個打包機,你需要:

  1. 遍歷 PE 標頭結構以定位原始入口點
  2. 使用新入口點保存並更新
  3. 添加新添加部分的信息。

第 2 點和第 3 點可以按任何順序執行,如果您先執行第 2 點,則需要知道該部分的位置,閱讀現有部分很容易計算出來。 如果你先做第 3 點,你就已經知道新的入口點了。

如果您願意,您可以查看UPX打包程序以獲取有關如何修改 PE 格式以及如何執行打包程序的更多提示。

OEP 作為 RVA 存儲在 PE 文件中。 您修改該值,此時原始值將丟失。 如果要獲取原始值,則必須在修改值之前閱讀並記住它。

好的,我發現它實際上將 oep 寫入文件本身,如下所示:

void write_stub_entry_point(PIMAGE_NT_HEADERS nt_headers, void *stub_addr) {
    if (stub_addr != NULL) {
        const char *signature = "\xFF\xEE\xDD\xCC";
        unsigned int index = 0;
        while (memcmp(((unsigned char *)stub_addr + index), signature, sizeof(int)) != 0) {
            ++index;
        }
        DWORD old_protections = 0;
        VirtualProtect(((unsigned char *)stub_addr + index), sizeof(DWORD), PAGE_EXECUTE_READWRITE, &old_protections);
        memcpy(((unsigned char *)stub_addr + index), &nt_headers->OptionalHeader.AddressOfEntryPoint, sizeof(DWORD));
        VirtualProtect(((unsigned char *)stub_addr + index), sizeof(DWORD), old_protections, NULL);
    }
}

現在他們只能像這樣從文件中恢復它:

__asm { //Epilogue, stub exit point
    mov eax, target_image_base
        add eax, 0xCCDDEEFF     //Signature to be replaced by original entry point (OEP)
        mov esp, ebp
        mov[esp + 0x20], eax     //Store OEP in EAX through ESP to preserve across popad
        pop ebp
        popad                   //Restore thread context, with OEP in EAX
        jmp eax                 //Jump to OEP
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM