
Implémentation de D/Invoke en Nim
Implémentation de D/Invoke en Nim
Tous les binaires Nim exposent généralement les mêmes 58 à 60 fonctions de l'API Windows :
Toutes les autres fonctions de l'API Windows sont généralement résolues à l'exécution via GetProcAddress et LoadLibraryA, comme mentionné dans OffensiveNim ou cet article de blog.
Il n'est donc pas possible de masquer (complètement) les imports d'API via DInvoke en Nim, à moins que quelqu'un utilise par exemple cette implémentation de DInvoke pour modifier le compilateur Nim afin d'utiliser DInvoke au lieu de Dynlib.
Analyser manuellement les fonctions depuis le PEB au lieu d'utiliser GetProcAddress et LoadLibraryA reste plus furtif que le comportement par défaut de Nim. Pour éviter également le hooking inline, un mapping manuel d'une copie fraîche de DLL serait par exemple nécessaire, comme mentionné dans l'article de blog de TheWover sur DInvoke :
Ceci n'est - toutefois - pas implémenté ici pour l'instant. J'utilise actuellement uniquement pour charger de nouvelles DLL en mémoire.
LdrLoadDllCe projet a été fortement inspiré par le code D/Invoke de NanoDump.
La fonction peut ensuite être utilisée comme ceci :
const
KERNEL32_DLL* = "kernel32.dll"
const
OpenProcess_FuncName * = "OpenProcess"
type
OpenProcess_t* = proc (dwDesiredAccess: DWORD, bInheritHandle: WINBOOL, dwProcessId: DWORD): HANDLE {.stdcall.}
MyOpenProcess = cast[OpenProcess_t](cast[LPVOID](get_function_address(cast[HMODULE](get_library_address(KERNEL32_DLL, FALSE)), OpenProcess_FuncName, 0)))
echo "[*] Calling OpenProcess via D/Invoke"
let pHandle = MyOpenProcess(
PROCESS_ALL_ACCESS,
false,
cast[DWORD](https://github.com/s3cur3th1ssh1t/nim_dinvoke/blob/main/processID)
)
Lors de mes tests, j'ai rencontré des comportements étranges pour certaines fonctions de l'API, qui nécessitent des cas particuliers pour trouver la bonne adresse relative. Ma confusion est visible dans les commentaires. C'est peut-être aussi simplement mon style de code minable - qui sait.
L'exemple, une fois réussi, ressemble à ceci :