| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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. если можно, покажите кто-то пример созданого потока с параметрами безопасности. |
| Автор: ApolloKiD 11.9.2011, 23:15 | ||
Прошу прощения, я в C++ не очень разбераюсь, но когда я создаю поток
Поток не запускается не знаю почему. надо просто сделать чтобы не смогли заморозить поток или убить его. Если вам не трудно и есть пару минут, можете показать что и как, пожалуйста. |
| Автор: 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 |
WaitForSingleObject (hThread, ...); |
| Автор: ApolloKiD 12.9.2011, 12:36 | ||||||
спасибо, проблему практически решил, но для полной безопасности надо ещё аттрибуты безопасности =/ и ещё 1 проблемка, каждый поток кушает по 20 ЦП - в итоге у меня запущенно 3 потока + игра кушает 50 цп, нельзя както снизить нагрузку со стороны потоков?
|
| Автор: xvr 12.9.2011, 13:53 |
Поставьте не 0, а что нибудь побольше. Этот цикл (я надеюсь, что это цикл) жрет все 100% CPU |
| Автор: ApolloKiD 12.9.2011, 14:51 |
| Спасибо всем за помощь =) |