 |

16.11.2024, 01:54
|
|
Постоянный
Регистрация: 26.03.2016
Сообщений: 660
С нами:
5332594
Репутация:
163
|
|
QQ TEAM! думаю многие знают или даже сталкивались с проверками от админов сервочков и вас сто процентов заставляли открывать панельку нвидиа, чтобы прочекать проги с гуишкой. так вот, щас разберём что это такое, как оно устроено изнутри и как это наебошить. значится список программулек по пути
Код:
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
&
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
(
&
unused
)
,
sizeof
(
unused
)
)
;
ofs
.
write
(
reinterpret_cast
(
&
unused
)
,
sizeof
(
unused
)
)
;
while
(
true
)
{
std
::
uint8_t
unused_2
[
3
]
{
}
;
ifs
.
read
(
reinterpret_cast
(
&
unused_2
)
,
sizeof
(
unused_2
)
)
;
if
(
ifs
.
eof
(
)
)
break
;
std
::
uint16_t
path_size
{
}
;
ifs
.
read
(
reinterpret_cast
(
&
path_size
)
,
sizeof
(
path_size
)
)
;
wchar_t
*
path
=
new
wchar_t
[
path_size
]
;
ifs
.
read
(
reinterpret_cast
(
path
)
,
path_size
)
;
std
::
uint8_t
unused_3
[
7
]
{
}
;
ifs
.
read
(
reinterpret_cast
(
&
unused_3
)
,
sizeof
(
unused_3
)
)
;
if
(
!
condition
(
path
)
)
{
ofs
.
write
(
reinterpret_cast
(
&
unused_2
)
,
sizeof
(
unused_2
)
)
;
ofs
.
write
(
reinterpret_cast
(
&
path_size
)
,
sizeof
(
path_size
)
)
;
ofs
.
write
(
reinterpret_cast
(
path
)
,
path_size
)
;
ofs
.
write
(
reinterpret_cast
(
&
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
)
;
|
|
|

15.02.2025, 18:02
|
|
Новичок
Регистрация: 11.02.2025
Сообщений: 29
С нами:
660951
Репутация:
13
|
|
Ебать, спасибо большое
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|