Dll injection in general is just a horrible idea from a stability standpoint in almost all cases. There are only two fairly reliable solutions:
Conversation
Well, the WriteProcessMemory + CreateRemoteThread + LoadLibrary combo worked fairly well for me so far. What I describe in the blog post is an exceptional incompatibility, but generally I'm not sure there's a better alternative with the same level of flexibility.
1
I meant, flexible on the side of what I can inject. Windhawk is a modular customization framework, anyone can write mods to any programs. I wouldn't want to constrain devs to using ntdll, forcing to adhere to the DllMain limits, etc. But it might be a good tradeoff for others.
1
BTW regarding "an exceptional incompatibility", I'm no longer sure about that. Just today, a user showed a similar crash in a TLS callback. My findings (from the Windhawk Discord channel) are below. Seems that it's sometimes not safe to create threads before CRT is initialized.
1
1
Except that here, unlike DllMain, I can't know when I'm in this (CRT initialization) context, can I? It's just non-remarkable code that runs at the beginning, no locks/mutexts I can grab and use. The best I can do is wait a bit before CreateThread and hope for the best.
1
AFAIK you can't, yes. This is why recording software and similar use APC or SetWindowHookEx, because the reverse (not enumerating times that are bad for injection, but using one that's most likely a good time) is safer, and they just don't care about windowless processes.

