- Баллы
- 78
- Имя в Minecraft
- gelion
Додумалась*
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
Додумалась*
Да, без проблем. Какой функционал требуется именно от драйвера?Хотелось бы спросить, будет ли возможность сделать защиту в виде драйвера
Сертификат твой личный и EV? Потому что тебе потребуется дополнительно подписывать драйвер на портале Microsoft, чтобы была возможность загружаться на машинах с включенным SecureBoot или HVCI/DeviceGuard (для некоторых настроек последнего дополнительно придётся проходить сертификацию WHQL). Для этого нужно регистрировать на портале свою компанию, на которую оформлен сертификат, и сертификат, разумеется, должен быть EV. Если сертификат обычный (не-EV) - сможешь загружаться только на машинах без SecureBoot'a.сертификат для подписывания exe имеется.
Будет EV, пока не evДа, без проблем. Какой функционал требуется именно от драйвера?
Сертификат твой личный и EV? Потому что тебе потребуется дополнительно подписывать драйвер на портале Microsoft, чтобы была возможность загружаться на машинах с включенным SecureBoot или HVCI/DeviceGuard (для некоторых настроек последнего дополнительно придётся проходить сертификацию WHQL). Для этого нужно регистрировать на портале свою компанию, на которую оформлен сертификат, и сертификат, разумеется, должен быть EV. Если сертификат обычный (не-EV) - сможешь загружаться только на машинах без SecureBoot'a.
А смысл? Почему именно в драйвере? Драйвер стоит использовать для задач, которые нельзя сделать в юзермоде. Проверять инжекты в драйвере и вполовину не так удобно, как в юзермоде (и возможностей меньше), но в драйвере можно блокировать доступ к процессу со стороны - например, для защиты от читэнджина и других редакторов памяти. Этот функционал уже готов в не связанном с антиинжектами проекте - Kernel-Bridge (посмотри у меня на гитхабе).ну чтобы драйвер уже чекал инжекты
От читэнжина можно нормально защититься только драйвером или все же можно как-то нативно?А смысл? Почему именно в драйвере? Драйвер стоит использовать для задач, которые нельзя сделать в юзермоде. Проверять инжекты в драйвере и вполовину не так удобно, как в юзермоде (и возможностей меньше), но в драйвере можно блокировать доступ к процессу со стороны - например, для защиты от читэнджина и других редакторов памяти. Этот функционал уже готов в не связанном с антиинжектами проекте - Kernel-Bridge (посмотри у меня на гитхабе).
Без драйвера нельзя, с драйвером можно, но тоже не на 100%. Если пересоберут драйвер читэнджина, сменят имена девайсов - обойдут защиту, потому что в ядре нет простых способов задетектить, что кто-то читает память. Например, в моём драйвере можно поставить фильтр на функцию DeviceIoControl, через которую читэнджин общается со своим драйвером, но как отличить драйвер читэнджина от любого другого системного драйвера - вопрос открытый. Разве что сигнатурами, которые легко обходятся, стоит читеру накрыть драйвер криптором.От читэнжина можно нормально защититься только драйвером или все же можно как-то нативно?
Допустим, игрок меняет координаты. Как проверить их корректность в условиях сервера с модами?Проще бороться с самими последствиями работы CheatEngine, проверяя корректность тех участков памяти, которые читеры меняют чаще всего, чем пытаться выявить модифицированный драйвер. Таким способом можно защититься не только от CheatEngine, но и от других читов, меняющих память.
СталКрафт, хкс вроде же защитились от ЧитЭнжина. В чем секрет?)Без драйвера нельзя, с драйвером можно, но тоже не на 100%. Если пересоберут драйвер читэнджина, сменят имена девайсов - обойдут защиту, потому что в ядре нет простых способов задетектить, что кто-то читает память. Например, в моём драйвере можно поставить фильтр на функцию DeviceIoControl, через которую читэнджин общается со своим драйвером, но как отличить драйвер читэнджина от любого другого системного драйвера - вопрос открытый. Разве что сигнатурами, которые легко обходятся, стоит читеру накрыть драйвер криптором.
Именно от читэнджина не защитились, но защитились от инжекта классов. На сталкрафте пересобрана джава, все классы (в том числе, классы джавы) зашифрованы, а внутри джавы вшит декриптор. Плюс, вырезано очень много того, что облегчает читерам внедрение классов, и перемешаны поля во внутренних структурах JVM, которые необходимы для работы с JNI (разработчик читов, разумеется, новое расположение полей не знает, а итоговая джава накрыта сверху протектором - например, вмп или темидой). Но именно от редактирования памяти они не защищены, как и не защищены от воллхака (на сталкрафте работают хуки OpenGL). Другое дело, что у них есть проверки и на сервере. Например, на хкс отправляются не координаты игрока, а движение (типа, "сделать шаг вперёд"), а сервер уже сам решает, на сколько сдвинуть игрока - поэтому спидхаки не работают.СталКрафт, хкс вроде же защитились от ЧитЭнжина. В чем секрет?)
Вот это правильная защита да. Все остальное изи сдуть на стороне клиента.Именно от читэнджина не защитились, но защитились от инжекта классов. На сталкрафте пересобрана джава, все классы (в том числе, классы джавы) зашифрованы, а внутри джавы вшит декриптор. Плюс, вырезано очень много того, что облегчает читерам внедрение классов, и перемешаны поля во внутренних структурах JVM, которые необходимы для работы с JNI (разработчик читов, разумеется, новое расположение полей не знает, а итоговая джава накрыта сверху протектором - например, вмп или темидой). Но именно от редактирования памяти они не защищены, как и не защищены от воллхака (на сталкрафте работают хуки OpenGL). Другое дело, что у них есть проверки и на сервере. Например, на хкс отправляются не координаты игрока, а движение (типа, "сделать шаг вперёд"), а сервер уже сам решает, на сколько сдвинуть игрока - поэтому спидхаки не работают.
Это очень сложная работа, требует модификации джавы, клиента и сервера, поэтому такое себе могут позволить только топовые сервера со штатом разработчиков.
В паблик такую защиту выкладывать бессмысленно, т.к. требует доработки конкретного клиента и сервера, а мало кто будет с этим заморачиваться, особенно с учётом паблик-модов, которые тоже, вероятно, потребуется допиливать руками. Но да, если продавать конкретному серверу за крупную сумму - только такую защиту и есть смысл писатьВот это правильная защита да. Все остальное изи сдуть на стороне клиента.
Не хочешь заняться таким ?:ВНо да, если продавать конкретному серверу за крупную сумму - только такую защиту и есть смысл писать
Пример такого имеется ?Проще бороться с самими последствиями работы CheatEngine, проверяя корректность тех участков памяти, которые читеры меняют чаще всего, чем пытаться выявить модифицированный драйвер. Таким способом можно защититься не только от CheatEngine, но и от других читов, меняющих память.
HHOOK SetWindowsHookExA(
int idHook,
HOOKPROC lpfn,
HINSTANCE hmod,
DWORD dwThreadId
);
#include <Windows.h>
static HMODULE hInstance = NULL;
static HHOOK hHook = NULL;
static LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(hHook, code, wParam, lParam);
}
extern "C"
__declspec(dllexport)
BOOL WINAPI InjectEmAll()
{
hHook = SetWindowsHookEx(WH_DEBUG, HookProc, hInstance, 0);
return hHook != NULL;
}
extern "C"
__declspec(dllexport)
BOOL WINAPI UnInjectEmAll()
{
return UnhookWindowsHookEx(hHook);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, PCONTEXT lpContext)
{
if (dwReason == DLL_PROCESS_DETACH) {
hInstance = hModule; // Сохраняем инстанс нашей библиотеки
}
return TRUE;
}
#include <Windows.h>
int main()
{
// Загружаем библиотеку и импортируем нашу функцию:
HMODULE hLib = LoadLibrary(L"OurAwesomeLib.dll");
auto InjectEmAll = reinterpret_cast<BOOL(WINAPI*)()>(GetProcAddress(hLib, "InjectEmAll"));
// Инжектим нашу дллку во все процессы:
InjectEmAll();
return 0;
}
// Проверяем, лежит ли адрес в первых 256 байтах функции:
static inline BOOL IsInFunction(PVOID Ptr, PVOID FuncBase)
{
return reinterpret_cast<PBYTE>(Ptr) >= reinterpret_cast<PBYTE>(FuncBase)
&& reinterpret_cast<PBYTE>(Ptr) < (reinterpret_cast<PBYTE>(FuncBase) + 256);
}
BOOL IsCalledFromWinHook(PVOID StacktraceFrame)
{
for (PVOID KernelCallback : KernelCallbackTable) {
if (IsInFunction(StacktraceFrame, KernelCallback)) {
return TRUE; // Мы внутри __ClientLoadLibrary
}
}
return FALSE;
}