Сегодняшнюю запись посвящу довольно узкоспециализированным вещам, поэтому большинство ее может пропустить как абсолютно бесполезную для себя. На повестке дня аж целых два вопроса.
1. Как начать работать с OpenGL в Ubuntu 9.10
2. Кто такие “трамплины” для вирусописателей.
Почему именно эти? Спрос рождает предложение... Предложите рассказать о другом, если хотите.
Как начать работать с OpenGL в Ubuntu 9.10
Сделать это на самом то деле довольно не сложно.
Шаг #1: Для начала нужно убедиться, что у нас есть необходимые для работы пакеты.
Нас интересуют: libgle3-dev и libglut3-dev.
Проверить наличие пакета в системе можно вот так:
dpkg --get-selections | grep 'packet name'
Чтобы установить недостающие можно воспользоваться:
sudo apt-get install 'packet name'
Шаг #2: В качестве первой программы можно взять шаблон OpenGL программы из Code::Blocks IDE. Там же можно будет посмотреть как работать с окнами в XSystem. Только при компиляции c g++ там маленькая ошибка вылезет. Он будет ругаться на поле 'class' у одного из объектов, замените его на 'c_class' и все заработает.
Шаг #3: Процесс компиляции и линковки тоже несложен, даже если использовать g++ вручную. Чтобы окна и OpenGL дружно заработали, необходимо прилинковать к вашему бинарному файлу библиотеки X11.a и GL.a. Средствами g++ это можно сделать так:
g++ sample.cpp -o sample -lGL -X11
В различных IDE это еще проще. Достаточно добавить вышеуказанные библиотеки в список библиотек для линковки. Обычно такой список расположен в свойствах проекта.
Кто такие “трамплины” и как они связаны с вирусами
Рассмотрим следующую абстрактную задачу. В некоторой библиотеке Library.dll есть функция MegaFunction(int a). И вам ну очень хочется контролировать все вызовы этой функции. Контролировать, я имею ввиду, это значит что до выполнения этой функции должен выполняться ваш код, которому известены все параметры функции. Так вот как раз трамплины служат для подобных махинаций. Не стану вдаваться в подробности и писать тут какой-то код, просто на уровне конструктивного плана:
1.Есть наш процесс A и есть сторонний процесс B использующий библиотеку Library.dll
2.Узнаем адрес функции MegaFunction в пространстве памяти процесса B
3.Выделяем в памяти процесса B блок памяти
4.Первые несколько инструкций сносим в новый блок памяти и снизу приписываем jmp <адрес на первую невынесенную инструкцию>
5.В начало функции вписываем jmp <адрес нашей функции>
Таким образом, что мы имеем:
Новый, выделенный блок, содержит код, который работает ровно также как MegaFunction. Выполняется вынесенный код, а далее jmp на остаток кода.
При вызове MegaFunction процессом B будет происходить вызов нашей функции, которая будет знать все об аргументах. Если мы посчитаем нужным, можем вернуть управление оригинадльной MegaFunction. Но это уже по усмотрению.
Подход, конечно, не идеален, но работает очень и очень часто. А почему не идеален, предлагается подумать самостоятельно.