Pull to refresh

GMABooster? Разгоняем?

Reading time 4 min
Views 27K


Решился опубликовать результаты моего исследования программы GMABooster, которая была представлена хабражителям буквально вчера. Сразу скажу, анализ не был бы проведен столь быстро, если бы не совершенно незнакомый хабраюзер Werat, который удаленно тестировал из под админа мой код на своем Acer Aspire One a150 (отважился же человек).

Своим топиком мне хотелось бы подчеркнуть важность открытых продуктов, свободы обмена информации между людьми [а еще напомнить всем жалующимся и плачущим, что Хабр — торт!].

Disclaimer: Анализ приведен исключительно в обучающих и мирных целях, меньше всего мне хотелось бы снизить размер пожертвований в сторону автора программы. В любом случае им проведена работа, которая заслуживает уважения. Также, я вынужден рассмотреть «альтернативное» решение для некоторых платформ, в силу того, что GMABooster не удобен по ряду критериев, особенно для пользователей Linux и Mac.



Тема поднялась достаточно интересная, в топике появились мысли о возможном обмане и решено было проверить самому. Будучи обладателем Acer Aspire 8735G сделать это было не просто, поэтому я пошел от обратного, занялся reverse engineering'ом. Сразу уточню, обходить защиту автора мы не будем.

Нутро под Windows


На данный момент с официального сайта можно скачать две версии GMABooster'a. Для GMA900 и GMA950. На самом деле версия всего одна и дистрибутив один. Распакуем и погрузимся в анализ содержимого — сразу отбросим uninstaller, пресеты для разных частот, документацию. Оставим следующий набор файлов:

Auto.exe — консольная утилита для смены частоты. Эта утилита может быть вызвана с параметрами командной строки, которые устанавливают значение частоты.

Как вы видите, реализовано на .Net (язык не важен). На .Net написан и GUI, лаунчеры и прочие пресеты. Вот такая вот дикая смесь драйверов и высокоуровневых фреймворков. Любители декомпиляции могут воспользоваться .Net Reflector'ом, чтобы выяснить все что они хотят. Лицензионное соглашение запрещает мне декомпилировать, пока что я принимаю условия игры и ищу другие пути.

Porttalk.sys — собственно какой-то драйвер. Погуглив, можно обнаружить, что это действительно PortTalk — драйвер для NT-семейства OS Windows, который позволяет обращаться напрямую к портам ввода/вывода. У него действительно нет поддержки x64, а последнее обновление было в 2002-ом году. Кстати, PortTalk использует достаточно хитрые трюки для предоставления доступа (да, это только в Windows 9x было все просто). Рекомендую подробнее ознакомиться на странице проекта, тем более проект открытый и бесплатный.

Helper.exe — абсолютно случайно заметил в документации к PortTalk, что он поставляется вместе с программой AllowIO, которая позволяет запустить стороннее приложение и открыть для него определенные (либо все) порты через установленный драйвер PortTalk'a. Собственно это и есть AllowIO.exe, за исключением того, что автор переименовал его и внес забавные изменения:

Затерты ссылки на официальный сайт PortTalk и уничтожен copyright как класс. Стало грустно.

По-маленько проясняется рабочий процесс GMABooster'a. Кто-то запускает Helper.exe, который открывает приложению доступ к портам ввода/вывода. Теперь приложение должно обратиться к портам и осуществить ряд запросов. ASM-вставки в .Net будут не совсем уместны (а в таком виде и невозможны), поэтому автор был обязан вынести их в отдельные модули. Посмотрим дальше.

AsmDll.dll и AsmDll2.dll — собственно реализация общения на уровне I/O ports [0CF8h / 0CFCh, конфигурируем PCI]. Ну не будем мы декомпилировать, там наверняка будет что-то до боли классическое (хотя я достаточно далек от этого):

Выставляем параметры Bus / Device / Function / Register и выполняем запрос + записываем значение параметра. Подробнее можно почитать по ссылкам: PCI Configuration Space и оно же, но для программистов.

Остановимся только на AsmDll.dll (между собой они практически не отличаются, просто Auto.exe не использует AsmDll2 вообще, соответственно, можно справиться и без нее). Не буду рассказывать как я получил прототип одной единственной экспортированной функции [int32 AsmAdd(int32, int32)], но тут я перед законом чист. Уже не раз останавливался на том, что мы не будем декомпилировать, поэтому была написана подмена библиотеки AsmDll, которая так же экспортировала только одну функцию AsmAdd и выводила в лог прилетевшую информацию. Немного помучив господина Werat'a и его нетбук, были получены значения входных параметров для каждой частоты.

166 MHz [0xF0, 0x34646000] [0xF0, 0x34646500] [0xF0, 0x34646000]
200 MHz [0xF0, 0x34646000] [0xF0, 0x34640534]
250 MHz [0xF0, 0x34646000] [0xF0, 0x34640531]
400 Mhz [0xF0, 0x34646000] [0xF0, 0x34640533]


В [] заключен один вызов AsmAdd утилитой «переключения частоты», соответственно, для 166 MHz вызвано трижды (возможно это ошибка, либо некий авторский watermark — не буду судить, ибо дилетант), для остальных дважды.

Собственно для меня 0x34640533 так и останется magic number'ом, уверен что на хабре найдется кто-нибудь, кто сможет объяснить что / куда и как.

Альтернатива


Таким образом, для разгона вашего Intel-based GPU до частоты 400 MHz (по данным GMABooster'a) достаточно выполнить запись в hardware registers.

К примеру, скрипт для Mac OS будет выглядить как-то так:
reggie_se -w 0x34646000 -D PCI -i 16 -a 0xF0 -B 32
reggie_se -w 0x34640533 -D PCI -i 16 -a 0xF0 -B 32

Можно без особых проблем добавить его в автозагрузку. Уверен, что утилита, аналогичная reggie_se имеется и в Linux.

Выводы для себя


1. Говорить о смене частоты не хочется, т.к. напряжение не изменяется, я в этом уверен;
2. Утилита безопасна (с точки зрения malware);
3. Утилита выполняет простейшее (с точки зрения реализации) действие — запись некоего значения в регистр, определенное изменение конфигурации PCI устройства. Зачем автор держит это в секрете и устраивает головную боль пользователям [еженедельное обновление и т.д.], лично мне не понятно;
4. Внесенные изменения работают до момента ухода в спящий режим / гибернации / выключения;
5. Автор GMABooster'a многих подсадил на иглу :)
6. Исходя из многочисленных отзывов, незначительное ускорение действительно наблюдается;
7. Я был не прав, используя слегка размытые floomby jpg-изображения в топике.

Не отрицаю заслуг автора, хотелось бы все-таки увидеть его на Хабре, услышать историю появления magic number'a и извиниться перед ним за свою статью.

Мне бы очень хотелось, чтобы нашлись люди, которые смогли бы грамотно воспользоваться полученными результатами (реализация под x64, к примеру). Также буду рад услышать любые дополнения от знающих специалистов — будучи далеким от столь низкоуровневых вещей, я не все могу понять, а тем более объяснить, за что приношу свои извинения.

Update #1 Новости с фронта маководов, там владелец Mac'a обратил внимание на то, как работает GMABooster (он оказывается вызывает все тот же reggie_se) и предложил свой вариант скрипта + дал достаточно забавные комментарии. И еще полезный материал (не проверенный, правда) для владельцев Linux
Tags:
Hubs:
+108
Comments 24
Comments Comments 24

Articles