-
Автор темы
- #1
Дисклеймер. Не стоит сильно воспринимать всерьез сказанное в этой теме. Просто делюсь тем что смог случайно наверное реализовать
Сидя дома и делая лоадер для своего будущего проекта я столкнулся с проблемой защиты потоков от заморозки. И как нельзя кстати мне попалась одна тема на югейме где челик задавал вопрос по этой теме. Там давали весьма дельные советы такие персоны как
Keaton
colby57 и другие. Спасибо вам ребятки за идеи и советы, но сейчас не об этом.
Собственно второй человек из этого списка скинул мне один материальчик в котором было расписано о том как отладчики могу реагировать на трюк с проверкой на заморозку потоков и как оказалось это более чем неплохо в современных реалиях. Если проще с помощью пары строк кода я смог сделать подобие анти-дебага без использование любых антидебаг трюков. Изначально я догадывался что это можно реализовать так, но данный материальчик мне в целом неплохо помог.
Суть в том что отладчики при аттаче могут проворачивать болезненный для себя трюк связанный с заморозкой потоков(тоже самое с бряками). Исходя из этой информации мы с вами можем смело напастить две проверки:
проверка на то заморожен поток или нет и проверка на время исполнения кода. Я покажу оба трюка.
Для начала для тех кто не знал, потоки можно создавать с определенными флагами, пример такого флага - 0x40 (AKA BYPASS PROCESS FREEZE). Данный флаг создает поток который сможет спокойно функционировать даже когда основной поток программы заморожен(из плюсов если у вас какая-то защита в потоке, то при бряке ну и при условии что прога конечно триггернула защиту вы сможете что либо сделать не взирая на саму заморозку процесса). Собственно надеюсь вы поняли как это можно использовать на практике, так что к коду.
Есть в винапи такие веселые функции как: Resume и SuspendThread, что имеют вывод. Да их можно запатчить, но сейчас не об этом. Если первая функция ResumeThread имеет возвращаемое значение отличное от нуля, то можно смело критовать ибо ваш поток был заморожен. Осталось только сделать простую реализацию, создаем поток, получаем хендл нужного для защиты потока путем создания и переменной и задавания ей значения CreateThread.
И все что остается сделать такие рофлы:
P.s это только пример, пожалуйста, учтите что это легко патчится.
Сидя дома и делая лоадер для своего будущего проекта я столкнулся с проблемой защиты потоков от заморозки. И как нельзя кстати мне попалась одна тема на югейме где челик задавал вопрос по этой теме. Там давали весьма дельные советы такие персоны как
Keaton
colby57 и другие. Спасибо вам ребятки за идеи и советы, но сейчас не об этом.
Собственно второй человек из этого списка скинул мне один материальчик в котором было расписано о том как отладчики могу реагировать на трюк с проверкой на заморозку потоков и как оказалось это более чем неплохо в современных реалиях. Если проще с помощью пары строк кода я смог сделать подобие анти-дебага без использование любых антидебаг трюков. Изначально я догадывался что это можно реализовать так, но данный материальчик мне в целом неплохо помог.
Суть в том что отладчики при аттаче могут проворачивать болезненный для себя трюк связанный с заморозкой потоков(тоже самое с бряками). Исходя из этой информации мы с вами можем смело напастить две проверки:
проверка на то заморожен поток или нет и проверка на время исполнения кода. Я покажу оба трюка.
Для начала для тех кто не знал, потоки можно создавать с определенными флагами, пример такого флага - 0x40 (AKA BYPASS PROCESS FREEZE). Данный флаг создает поток который сможет спокойно функционировать даже когда основной поток программы заморожен(из плюсов если у вас какая-то защита в потоке, то при бряке ну и при условии что прога конечно триггернула защиту вы сможете что либо сделать не взирая на саму заморозку процесса). Собственно надеюсь вы поняли как это можно использовать на практике, так что к коду.
Есть в винапи такие веселые функции как: Resume и SuspendThread, что имеют вывод. Да их можно запатчить, но сейчас не об этом. Если первая функция ResumeThread имеет возвращаемое значение отличное от нуля, то можно смело критовать ибо ваш поток был заморожен. Осталось только сделать простую реализацию, создаем поток, получаем хендл нужного для защиты потока путем создания и переменной и задавания ей значения CreateThread.
И все что остается сделать такие рофлы:
P.s это только пример, пожалуйста, учтите что это легко патчится.
C++:
protectionthread_id = CreateThreadA(args); //пример получения хендла
while (1) {
if (ResumeThread(GetCurrentThread()) != 0) { //текущий поток
exit(-1);
}
if (ResumeThread(protectionthread_id) != 0) { //поток с защитой например
exit(-1);
}
}
И в сумме такой код в вашем потоке во первых будет критовать при заморозке его самого так еще и при заморозке другого потока, что тоже впринципе доставит геморроя и выполнит поставленную перед нами задачку.
Трюк №2. Время исполнения кода.
Наш любимый колбасник57 уже рассказывал об
этом во все том же треде, но просто повторюсь что любой код в цикле выполняется определенное время и все что нужно засечь это время и дать пизды в случае того, если код выполнялся дольше нужного. Сразу к коду с комментариями.
Трюк №2. Время исполнения кода.
Наш любимый колбасник57 уже рассказывал об
этом во все том же треде, но просто повторюсь что любой код в цикле выполняется определенное время и все что нужно засечь это время и дать пизды в случае того, если код выполнялся дольше нужного. Сразу к коду с комментариями.
C++:
while(1) {
auto time_start = TickCountClock::now(); //custom GetTickCount, вы можете использовать просто GetTickCount, но его хукает ScyllaHide
std::this_thread::sleep_for(std::chrono::milliseconds(1)); //полезная нагрузка
auto time_end = TickCountClock::now(); //время после полезной нагрузки
if ((time_end - time_start).count() > 1100) //так как мы знаем что данная операция не может занимать больше 1 секунды, если что дело имеем с милисекундами, то выключаем нахуй кампуктер, а вернее прогу.
{
exit(-1);
}
}
Вот впринципе и все. Причем тут антидебаг спросите вы? А я уже говорил здесь о том, что при аттаче дебаггером такие рофлы спокойно дадут триггер и вы спокойно поймете что вашу прогу отлаживают. В примерчике выше я кстати юзал кастомную альтернативу GetTickCount по причине что он хукается сциллой. Инфа как это сделать есть в паблике, гуглите.
Всем спасибо за ваше время и хорошего настроения.
Еще одно P.S - все трюки были проверены с помощью process hacker, scylla hide и x64dbg и полностью себя оправдывают.
И еще одно P.S -
Всем спасибо за ваше время и хорошего настроения.
Еще одно P.S - все трюки были проверены с помощью process hacker, scylla hide и x64dbg и полностью себя оправдывают.
И еще одно P.S -
Последнее редактирование: