Сейчас я поделюсь с тобой ценнейшим
опытом, который обрел я в следствии
необузданного желания стать кул хацкером.

Сидел я, программировал игрушки — не знал
беды, а тут, хлобысь! Свалился мне наголову
небезызвестный SoftICE для Win9x от нумеги.
Программулина мне сразу понравилась, ибо
без всяких проблем рисовала свое окошко
поверх Выня, да еще этот самый Вынь
тормозила так, что даже винт свопить
переставал. По ходу изучения отладчика я
сломал всю защиту на своих же играх, мною же
написанную. Оказалось, что защита моя —
отстой и сломать ее может каждый недохацкер
(прям как я :.) Далее попер креатив. Освоив
азы (поэтому тех, кто кул, прошу не наезжать),
я стал думать куда бы применить столь
полезный тул и придумал! А что если
покопаться мне в коде у самого Кармака,
авось чего полезного выйдет!

Те, кто режутся по сетке в CounterStrike, наверняка,
не раз думали о том, как же было бы хорошо
иметь такой девайс, чтобы сквозь стены
смотреть, и чтоб ни какой злобный террор не
мог за стенкой отсидеться. В контер я не
играю, но играю в ку3 и идея мне эта пришлась
по вкусу. Боты хоть и на найтмаре остаются
тупыми, но хотелось бы знать какая сволочь у
меня под носом мегу сожрала. Короче решил я
SoftICE’ом поковыряться в кваке, причем не
просто так, а с ясной целью сделать
прозрачными стены, чтобы тварей хорошо
видеть и при этом не засветиться позорным
читером.

Понятие прозрачных стен можно понимать как
угодно, но результат должен быть следующим:
мы хотим видеть всех и вся, но при этом
чувствовать землю под ногами, а не так чтобы
парить в космосе посреди wireframe’а и делать
вид, что мы контролируем ситуацию.

Самое путевое, что мне пришло в голову — это
запретить тест глубины, т.е. на момент
рендеринга карты уровня хотелось бы
отрубить z-буффер. Дело в том, что в Кваке, да
впрочем как и везде, сперва рисуется сам
уровень или некоторая нужная нам его часть,
а затем уже все активные модельки, т.е. боты,
игроки и разный хлам, типа, факелов и статуй.
Так же нам известно, что Кармак не очень то
любит софтинку от мелкомягкого гиганта и
вместо того, чтобы юзать весь такой из себя
замечательный DirectX, Кармак пишет все сам, а
для хардварно-ускоренного рендеринга
применяет OpenGL API. К счастью, я придерживаюсь
такой же политики, и точно знал в каком
направлении нужно было капать. Что бы иметь
возможность брякаться на OpenGL’ных функциях я
в файлик ‘winice.dat’, что в папке с SoftICE’ом лежит,
добавил строчку: EXP=c:\windows\system\opengl32.dll и
перезагрузил комп.

Практически все состояния видюхи в OpenGL
устанавливаются с помощью функций
переключателей glEnable\glDisable принимающих в
качестве единственного параметра
целочисленный идентификатор флажка,
который меняем. Так, чтобы разрешить тест
глубины, нужно вызвать: glEnable (GL_DEPTH_TEST). Сию
штучку мне и предстояло отыскать.

Открыв окно SoftICE (Ctrl+D), я поставил брейкпойнт
на нужную функцию (bpx glEnable). Если хочешь
посмотреть текущий список бряков,
воспользуйся командой bl. После этого я
запустил quake3.exe

Через пару секунд вылетело окошко
отладчика с вестью о том, что был вызван
glEnable. Чтобы выйти в функцию совершившую
столь необдуманный поступок я нажал F11,
поднявшись в окне отладчика немного вверх (Ctrl+Up),
я увидел следующую картину (в твоей
компиляции ку3 картина может немного
отличаться):


PUSH 0000DE1
CALL [OPENGL32!glEnable]

Очевидно, прога запихивала в стек некую
константу и вызывала glEnable. Нам была нужна
константа GL_DEPTH_TEST, которой соответствует
шестнадцатеричное 0B71. Выхожу из отладчика (Ctrl+D),
опять бряк и опять не та константа. На
четвертый или пятый раз я вижу:


TEST EBX, 00010000
PUSH 0000B71
JZ 00457c66
CALL [OPENGL32!glDisable]
JMP 00457666
CALL [OPENGL32!glEnable]

Здесь тестится 16-й бит регистра EBX, затем
пушится константа 0B71 и вызывается либо glEnable,
либо glDisable. Так как установки стейтов
выполняются каждый раз при инициализации
кваковского клиента, что происходит при
каждом реконнекте, т.е. смене уровня, я не
придумал ни чего умнее, кроме как изменить
саму константу. С помощью команды ed я вошел
в участок памяти, где располагалась команда
PUSH 00000B71, и заменил хранившийся там опкод
000B7168 на 00000068, т.е. фактически вызвал glEnable с
нулевым параметром.

Еще несколько раз пошарахавшись вокруг да
около, я наткнулся на такой же кусок кода и
снова заменил в нем 0B71 на 0000, этого
оказалась достаточно. А что бы не стопиться
на дальнейших glEnable, я запретил бряк (bd 0) и
покинул отладчик. Затем запустил
кваковский q3dm7 и о счастье! На экране царил
полный хаос, все вывернулось наизнанку и я
увидел как в соседней комнате Daemia хавала
армор. Я стал всемогущим, теперь я так же,
как и боты видел приближающегося из-за угла
противника.

Конечно на абсолютно незнакомом уровне так
играть не реально, но хорошо изученные мапы
покорятся вам за просто так. Напомню, что
большинство шутеров: все Кваки, Халф-Лайф,
Контер и Анрылы поддерживают OpenGL рендеринг,
и поэтому там можно сделать то же самое!

Теперь кое-какая теоретическая инфа,
которая может пригодиться при дальнейшем
насиловании OpenGL игр, а именно еще несколько
возможных параметров функций glEnable, glDisable:

GL_DEPTH_TEST 0B71 Тест глубины
GL_ALPHA_TEST 0BC0 Тест альфа-канала (прозрачности)
GL_FOG 0B60 Туман
GL_BLEND 0BE2 Блендинг цветов
GL_TEXTURE_2D 0DE1 Текстурирование
GL_CULL_FACE 0B44 Отбрасывание невидимых
треугольников

Для особо пытливых могу посоветовать
поэкспериментировать с функциями glPolygonMode и
glCullFace, описание которых можно найти либо в
спецификациях OpenGL, либо в обычном opengl.hlp.

У меня уже назрела еще парочка чертовски
изуверских мыслишек, но об этом в следующий
раз 🙂

Оставить мнение

Check Also

10 научно-фантастических комиксов для тех, кто не читает комиксы и не любит супергероев

В то время как фильмы по комиксам бьют все возможные рекорды кассовых сборов, сами комиксы…