
DLL sideloading/proxying with Nim!
Mit diesem Repo kannst du einfach Nim-DLLs erzeugen, die du zum Sideloading/Proxy Loading verwenden kannst. Wenn du nicht weißt, was DLL-Sideloading ist, wirf einen Blick auf diesen Blogbeitrag.
Lege die legitime DLL (oder mehrere DLLs), die du als Proxy verwenden möchtest, in das build-Verzeichnis dieses Repos und führe dann make aus.
Dadurch werden zwei .dlls im out-Verzeichnis erzeugt:
Wenn das Sideloading erfolgreich ist, solltest du ein Popup-Meldungsfeld und/oder eine Datei auf dem Desktop sehen.
Um den Payload tatsächlich zu „bewaffnen“, kannst du dir das OffensiveNim-Repository für Ideen und fertige Codeschnipsel ansehen :).
dllproxy.nim ist die Proxy-DLL, die deinen Payload ausführt und legitime Funktionsaufrufe an die ursprüngliche(n) DLL(s) weiterleitetgen_def.py parst die Exporttabelle der ursprünglichen DLL und erzeugt eine Moduldefinitionsdatei (.def).Die .def-Datei wird dann zur Compile-Zeit an den Linker übergeben, um die legitimen Funktionsaufrufe weiterzuleiten.
NimMain aus der Exporttabelle einer Nim-DLL ausblendenSiehe diesen Microsoft-Artikel
Beachte die letzte Zeile dieser .def-Datei:
EXPORTS
GetFileVersionInfoA=ZCnerzNI.GetFileVersionInfoA @1
GetFileVersionInfoByHandle=ZCnerzNI.GetFileVersionInfoByHandle @2
GetFileVersionInfoExA=ZCnerzNI.GetFileVersionInfoExA @3
GetFileVersionInfoExW=ZCnerzNI.GetFileVersionInfoExW @4
GetFileVersionInfoSizeA=ZCnerzNI.GetFileVersionInfoSizeA @5
GetFileVersionInfoSizeExA=ZCnerzNI.GetFileVersionInfoSizeExA @6
GetFileVersionInfoSizeExW=ZCnerzNI.GetFileVersionInfoSizeExW @7
GetFileVersionInfoSizeW=ZCnerzNI.GetFileVersionInfoSizeW @8
GetFileVersionInfoW=ZCnerzNI.GetFileVersionInfoW @9
VerFindFileA=ZCnerzNI.VerFindFileA @10
VerFindFileW=ZCnerzNI.VerFindFileW @11
VerInstallFileA=ZCnerzNI.VerInstallFileA @12
VerInstallFileW=ZCnerzNI.VerInstallFileW @13
VerLanguageNameA=ZCnerzNI.VerLanguageNameA @14
VerLanguageNameW=ZCnerzNI.VerLanguageNameW @15
VerQueryValueA=ZCnerzNI.VerQueryValueA @16
VerQueryValueW=ZCnerzNI.VerQueryValueW @17
NimMain @19 NONAME PRIVATE
Diese letzte Zeile weist den Linker im Grunde an, den Namen der NimMain-Funktion zu entfernen. Wenn du die DLL kompilierst und die obige .def-Datei an den Linker übergibst, erhältst du den folgenden Eintrag, wenn du einen Blick auf die Exporttabelle der .dll wirfst:
