Мы же не знаем что там в $db->prepare происходит
Можно пример async/await?
Promise - не вариант, усложняет
Разве нет у VMP галочки про продвинутый антидебаг ?
https://lifeinhex.com/use-of-syscall-and-sysenter-...
Либо же scylaHide сканит heap на сисколлы....
Да, адресов winapi. Не знаю насколько моя терминология верна, но обычно называю системным вызовом даже вызов к kernel32.dll, а не именно вызов к ядру(sysenter). Руководствуюсь тем, что сисколы недокументированы, архитектура windows в некоторой степени микроядерная. Ну и в литературе о Windows, usermoдные либы относят к системе.
Я имел ввиду не защиту от анализа, обфускацию системных вызовов, вычисление их динамически. Я это написал как цель защиты от копирования кода.
То что реверсер поставит брейки на нужные ему функции это понятно, я про то что если он например сломает авторизацию, но пропатченный код следующий перезапуск или у других пользователей работать уже не будет.
Ему придется патчить каждый джамп вшитый на сервере(Для авторизованного юзера под его конкретные адреса системных вызовов при текущем запуске системы). Потому что перезапустив систему адреса системных либ(и соответственно функций в них) поменяются.
Дополнительные обфускации этих джампов просто лишь усложняют их поиск и фикс. Например генерация на сервере каждый раз разного кода вычисления адреса для прыжка (разные регистры разные команды). Что усложняет поиск по паттерну.
А Vmp например титан хайду ниче не делает.
Лоадер скидывает все адреса системных вызовов на серверер. А сервер в код вставляет адреса этих системных вызовов(Просто jmp на адрес, либо вставляет код, который этот адрес вычисляет, всякими сдвигами битовыми и тд, чтобы дополнительно усложнить анализ). В итоге если даже злоумышленник скопирует этот код, все эти jmp будут крашить, потому что адреса системных либ поменяются.
import { assertType } from 'typescript-is';
interface User
{
firstName: string;
lastName: string;
age: number;
avatar?: string;
}
interface UsersResponse
{
totalCount: number;
users: User[];
}
/*
Тут какой-то ваш код, где получаете данные в переменную "data"
*/
assertType<UsersResponse>(data); // Если то, что в "data", не соответствует структуре UsersResponse, то будет выброшено исключение