QQ TEAM! думаю многие знают или даже сталкивались с проверками от админов сервочков и вас сто процентов заставляли открывать панельку нвидиа, чтобы прочекать проги с гуишкой. так вот, щас разберём что это такое, как оно устроено изнутри и как это наебошить. значится список программулек по пути
Разбор формата файла:
из курса C++ за 2 часа мы помним то что каждая C-строка оканчивается нуль-терминатором. поэтому берём строку с запасом в 1 байт. помимо наших предположений, это так же учитывается в поле с размером строки, доказать это просто: 4A = 74. 74 / 2 = 37. значит длина первого пути со скриншота равна 37 байтам памяти.
Исходный код:
Пример использования:
C:\ProgramData\NVIDIA Corporation\Drs\nvAppTimestamps
. казалось бы можно просто удалить этот файлик, но тогда вас забанят за то что в панельке ничего нет=) поэтому я расчекал этот файл (по закону подлости там содержится: хуня + хуня + путь) и на кондициях написал функцию удаляющую путь по условию из коллбека.Разбор формата файла:
из курса C++ за 2 часа мы помним то что каждая C-строка оканчивается нуль-терминатором. поэтому берём строку с запасом в 1 байт. помимо наших предположений, это так же учитывается в поле с размером строки, доказать это просто: 4A = 74. 74 / 2 = 37. значит длина первого пути со скриншота равна 37 байтам памяти.
Исходный код:
C++:
namespace nvAppTimestamps {
/**
* Удалить запись из NVIDIA Control Panel
* @param timestamp_path Путь до nvAppTimestamps (включительно)
* @param condition Callback функция условия удаления
* @return Nihua! Дропает рядом файл с расширением .new
**/
void remove_if(const std::string& timestamp_path,
const std::function<bool(wchar_t*)>& condition) {
std::ifstream ifs{timestamp_path, std::ios::in | std::ios::binary};
ifs.unsetf(std::ios::skipws);
std::ofstream ofs{timestamp_path + ".new", std::ios::out | std::ios::binary};
ofs.unsetf(std::ios::skipws);
std::uint8_t unused{};
ifs.read(reinterpret_cast<char*>(&unused), sizeof(unused));
ofs.write(reinterpret_cast<char*>(&unused), sizeof(unused));
while (true) {
std::uint8_t unused_2[3]{};
ifs.read(reinterpret_cast<char*>(&unused_2), sizeof(unused_2));
if (ifs.eof()) break;
std::uint16_t path_size{};
ifs.read(reinterpret_cast<char*>(&path_size), sizeof(path_size));
wchar_t* path = new wchar_t[path_size];
ifs.read(reinterpret_cast<char*>(path), path_size);
std::uint8_t unused_3[7]{};
ifs.read(reinterpret_cast<char*>(&unused_3), sizeof(unused_3));
if (!condition(path)) {
ofs.write(reinterpret_cast<char*>(&unused_2), sizeof(unused_2));
ofs.write(reinterpret_cast<char*>(&path_size), sizeof(path_size));
ofs.write(reinterpret_cast<char*>(path), path_size);
ofs.write(reinterpret_cast<char*>(&unused_3), sizeof(unused_3));
}
delete[] path;
}
ofs.write("\x01", 1);
}
}; // namespace nvAppTimestamps
Пример использования:
C++:
std::filesystem::path nvidia_path{"C:\\ProgramData\\NVIDIA Corporation\\Drs\\nvAppTimestamps"};
nvAppTimestamps::remove_if(nvidia_path.string(), [](wchar_t* path) {
return std::wstring{path}.find(L"app.exe") != std::wstring::npos; // true - удалить, false - оставить
});
std::filesystem::rename(nvidia_path.string() + ".new", nvidia_path);
Последнее редактирование: