Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Prevent SuspendThread() & TerminateThread()


Автор: ApolloKiD 9.9.2011, 21:22
Доброго времени суток, возникла проблема, я пишу Анти-Чит для онлайн игры, анти-чит работает нормально, но есть уязвимость, можно заморозить поток - SuspendThread или убить его TerminateThread и тогда тред с лупом анти-чита, работать не будет, и читеры смогут играть свободно с читами.
Вот и вопрос: как можно сделать так, чтобы не смогли замораживать или убивать поток?
Если можно приведите примеры.
Спасибо заранее.

Автор: Dem_max 10.9.2011, 05:04
Хукать SuspendThread и TerminateThread т.е. подменять на свои процедуры. В этих процедурах проверять идет обращение к твоему процесу ???? да - то ничего не делать иначе вызвать настоящие SuspendThread и TerminateThread.


Мне кажется твой процесс проще грохнуть.

Автор: ApolloKiD 10.9.2011, 13:31
если грохнуть процесс - закроется игра, а пример с хуком можно?

Автор: Dem_max 10.9.2011, 14:05
http://www.rsdn.ru/article/qna/baseserv/hookapi.xml
http://habrahabr.ru/blogs/cpp/90377/

Автор: ApolloKiD 11.9.2011, 10:46
я читал что надо не хукать, а ставить параметры безопасности при создании потока, с помощью первого параметра LPSECURITY_ATTRIBUTES lpThreadAttributes.
если можно, покажите кто-то пример созданого потока с параметрами безопасности.

Автор: xvr 11.9.2011, 19:54
Цитата(ApolloKiD @  11.9.2011,  10:46 Найти цитируемый пост)
если можно, покажите кто-то пример созданого потока с параметрами безопасности.

Вам надо создать Security Descriptor с запретом для всех (само создание SD абсолютно не зависит от того, где вы собираетесь его применять).
http://msdn.microsoft.com/en-us/library/aa446595%28v=VS.85%29.aspx пример создания SD (надеюсь вы сможете адаптировать его под свой случай)

Автор: ApolloKiD 11.9.2011, 23:15
Прошу прощения, я в C++ не очень разбераюсь, но когда я создаю поток
Код

hThread = CreateThread(&sa,NULL,LPTHREAD_START_ROUTINE(AntiHack),NULL,0,0);

Поток не запускается не знаю почему.

надо просто сделать чтобы не смогли заморозить поток или убить его.

Если вам не трудно и есть пару минут, можете показать что и как, пожалуйста.

Автор: Earnest 12.9.2011, 07:44
Более эффективно не сопротивляться явно закрытию проверяющего потока, а запустить второй (третий... десятый...) которые будут просто проверять, что проверка работает. А если нет - запускать снова. Ну или карательное что-нибудь, по желанию. Такая тактика обычно эффективнее, чем прямое противодействие, а код, который непосредственно не оказывает влияния на защищаемые сущности, обнаружить сложнее. Проверять, что проверка работает тоже лучше не прямо, а по каким-нибудь косвенным признакам...
Есть еще механизм тайм-бомб. Коротко, суть в том, что запускается таймер, который потихоньку сбрасывает некую переменную. Когда переменная дойдет до 0, делаешь что-то нехорошее (для пользователя). Например убиваешь процесс с разрушением стека. А поток проверки эту нехорошую переменную восстанавливает, кроме прочего. Т.е. работает проверка - все хорошо, перестает - все рушится, но не сразу, а через какое-то время, причем связь эту обнаружить непросто.

Автор: ApolloKiD 12.9.2011, 11:18
WaitForSingleObject(hEvent,1);
ResumeThread(hThread);
От Suspend спасает, а от TerminateThread нет, я незнаю как сделать проверку, если Поток убит, чтобы его запустили снова.

Автор: volatile 12.9.2011, 11:48
Цитата(ApolloKiD @  12.9.2011,  11:18 Найти цитируемый пост)
как сделать проверку, если Поток убит,

WaitForSingleObject (hThread, ...);

Автор: ApolloKiD 12.9.2011, 12:36
Цитата(volatile @ 12.9.2011,  11:48)
WaitForSingleObject (hThread, ...);

спасибо, проблему практически решил, но для полной безопасности надо ещё аттрибуты безопасности =/

и ещё 1 проблемка, каждый поток кушает по 20 ЦП - в итоге у меня запущенно 3 потока + игра кушает 50 цп, нельзя както снизить нагрузку со стороны потоков?


Код

void proverka2()
{
    if(WaitForSingleObject(hThread,0) == FALSE)
    {
        ExitProcess(0);
    }
}

Код

void Proverka()
{
again:
    WaitForSingleObject(hEvent,1000);
    ResumeThread(hThread);
    proverka2();
    goto again;
}

Автор: xvr 12.9.2011, 13:53
Цитата(ApolloKiD @  12.9.2011,  12:36 Найти цитируемый пост)
    if(WaitForSingleObject(hThread,0) == FALSE)

Поставьте не 0, а что нибудь побольше. Этот цикл (я надеюсь, что это цикл) жрет все 100% CPU

Автор: ApolloKiD 12.9.2011, 14:51
Спасибо всем за помощь =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)