[英]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 格式包含:
有關 PE 的更多信息:
如果你想做一個打包機,你需要:
第 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.