-
Notifications
You must be signed in to change notification settings - Fork 195
Description
I found a rather peculiar edge case, which is not currently handled by libpeconv (and if it is, I am too dumb to figure it out). Consider following scenario:
Payload is an executable PE with stripped relocs, its imagebase is 0x400000. My loader accounts for this with an explicit section layout, like so:
Name Start End R W X D Class
-------- -------- -------- - - - - -----
.payload 00401000 20401000 R W . . BSS
.og_bss 20401000 20402000 R W . . BSS
.og_text 20402000 20414000 R . X . CODE
.og_data 20414000 20415000 R W . . DATA
The loader maps EXE payload into the .payload section, patches what's needed and jumps to its OEP. This technique is called Process Hiving, I believe. I'm using it as an alternative to DLL load order hijacking method (aka proxy DLLs) in my game modding framework.
If payload is not reloc-stripped, the loader will relocate it into the .payload section anyway.
I do not call VirtualAlloc at all, VirtualProtect is used to set appropriate section flags before jumping to the OEP.
My long-term goal is to have per-game targeted Linux compat patches as well - stuff like replacing XInput/WndProc with SDL2, replacing d3d9 with dxvk, etc. It would be nice for libpeconv to support Linux as well. taviso/loadlibrary is Linux-only and it feels redundant to have two separate dependencies of identical nature.
Similar approach is used in the following projects