Inserisco il codice x86 nativo in un'applicazione .NET, tramite una callback TLS nell'immagine binaria. Sfortunatamente, gli eseguibili .NET importano solo mscorlib.dll
all'interno del PE e hanno kernel32.dll
mappato automaticamente nello spazio di memoria in fase di runtime. Non voglio iniettare nessuna importazione. Questo rende trovare gli indirizzi di LoadLibrary
e GetProcAddress
awkward.
Il mio primo pensiero per una soluzione è stato trovare il PEB tramite mov eax, dword ptr [fs:030h]
, quindi caricare PEB->Ldr
e PEB->Ldr.InMemoryOrderModuleList.Flink
da lì e usarli per trovare il modulo in memoria. Da lì ho potuto prendere l'indirizzo di base di kernel32.dll
in memoria e spostato sull'intestazione PE e sulla directory di esportazione RVA. Da lì ho potuto scorrere le voci di importazione per l'esportazione per nome e trovare l'indirizzo.
Questo ha i seguenti problemi:
- Un sacco di codice per qualcosa di banale come una chiamata API.
- La stringa ASCII che rappresenta il nome dell'API dovrebbe essere incorporata nel codice.
- Memorizzare nella cache gli indirizzi trovati su un lungo runtime / thread multipli è scomodo.
C'è un modo più pulito per fare ciò che risolve questi problemi, senza ricorrere all'iniezione di importazione? Tieni presente che non riesco a modificare l'EP dell'immagine, perché il CLR si basa sul fatto che l'EP è un salto verso l'IL gestito.