Hi Hao,
Thanks for replying to this query.
I'm afraid that I simply don't have the scope to go through a binutils
change request. I was hoping that a link script might work to inject the
binary section manually. If it is simply not possible for GNU binutils
to inject custom PE directory entry data at all (which I assert is what
you are implying) then I guess I'll just have to continue to make do
with delay-loaded DLLs (and hope that someone else also eventually takes
a stab at fixing https://sourceware.org/bugzilla/show_bug.cgi?id=14339
for binutils).
Regards,
/Pete
On 2025.03.04 03:37, LIU Hao wrote:
在 2025-03-04 01:14, Pete Batard via Mingw-w64-public 写道:
Considering that the current approach to fighting DLL side-loading
vulnerabilities for MinGW generated executables is to manually run
them through something like procmon, to see if they attempt to load
DLLs from nonsystem dirs, and if so, manually apply delay-loading to
the DLLs (that is when delay-loading works, because while I didn't
have an issue with other DLLs --outside of binutils needing an
annoying DECLSPEC_IMPORT redef-- I have been entirely unable to make
it work with cfgmgr32 [1]), being able to use a simple flag that tells
Windows: "Hey, this application is designed to *not* to ever need to
load anything but system DLLs" would be a real godsend.
However, applying that flag requires the GNU PE toolchain that can
generate a 'Load Configuration' PE directory entry, and arbitrarily
set some the attributes there. And from what I can see, while LLVM has
recently introduced an option that adds such a section to set the
relevant flag, I don't expect gcc to do so anytime soon, so I would
very much like a workaround for it...
Unsurprisingly, this topic is far too advanced for ChatGPT to produce
anything useful. I am therefore asking the MinGW experts if they have
a solution for this kind of additional PE entry generation.
I believe at the moment there's no support for load config directories
in GNU LD. You will have to modify GNU LD source:
In 'binutils-gdb/bfd/peXXigen.c' there is code which sets up the TLS
directory (keyword: `PE_TLS_TABLE`). You can also see that while the
constant `PE_LOAD_CONFIG_TABLE` is defined, it's unused elsewhere. So an
executable that is created by GNU LD doesn't have a load config directory.
Perhaps you can take that as a reference and implement it. Microsoft
LINK and LLD-LINK look for the external variable `_load_config_used` and
point the load config directory to it, same way with how they look for
`_tls_used` and set up the TLS directory. The difference is that the
load config directory is of a variable length, as recorded in its `Size`
field.
Once that is done, you can add an option to GNU LD to override the
`DependentLoadFlags` field.
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public