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



    Решился опубликовать результаты моего исследования программы 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
    Поделиться публикацией

    Похожие публикации

    Комментарии 24

      +12
      3. Утилита выполняет простейшее (с точки зрения реализации) действие — запись некоего значения в регистр, определенное изменение конфигурации PCI устройства. Зачем автор держит это в секрете и устраивает головную боль пользователям [еженедельное обновление и т.д.], лично мне не понятно;

      Автор хочет денег. :) А факт затирания копирайтов характеризует его не с самой лучшей стороны. Ждёмс комментариев от автора…
        0
        Мне показалось также, но здесь можно понять автора, я поискал по всем magic numbers — результаты нулевые. Те что есть, обычно ссылаются на GMABooster под Mac (там он спалился открытым прокидыванием параметров). Т.е. это его личные наработки, скорее всего. А отсюда уже желание получить хоть какой-то feedback. В итоге я себя даже как-то не уютно чувствую.
          0
          Вы всё правильно сделали.

          Если автор нашёл как добиться такого результата чтением спеков или дизассемблированием драйвера\биоса то ему, конечно, всяческое уважение. Но это нисколько не отменяет того факта, что человек наплевал на чужой труд, а это сразу перечёркивает всё остальное. Ну и конечно мне это всё видится щёко-надувательтвом, публикация этих комманд на любом крупном мак\вин\лин форуме принесла бы автору явно не меньше славы, но конечно не принесла бы денег.
        +17
        Из всего вышеперечисленного мне катастрофически не нравится затирание копирайтов. Вспоминается (ох щас заминусуют) Болженос…
          0
          Тут глупо было затирать копирайт, всего лишь использование стороннего бесплатного и открытого модуля для выполнения своих задач. Можно было оставить все как есть, нарушения лицензии не было изначально.
          +2
          есть драйвер для доступа к портам I/O и памяти устройств — WinIO, там в версии 3.0 заявлена поддержка 64-битных систем.
          www.internals.com/
            +2
            То что нужно! Обещать не буду, но попробую сделать маленькую утилитку под windows и обе архитектуры. Приложения и пожелания приветствуются.
              +1
              Вот если бы под x3100 можно было частоты переключать… =)
              Я правильно понимаю, что там уже другие значения в регистры отсылаться должны?
                0
                Вероятнее всего — да, нужен специалист, который сможет понять что/куда и как, либо ждать реализации от автора GMABooster'a. Надеюсь, что моя статья не заставит его прекратить работу над проектом и повлияет только хорошим образом на развитие.
            +13
            Я всегда знал, что хабр — торт!
            • НЛО прилетело и опубликовало эту надпись здесь
            • НЛО прилетело и опубликовало эту надпись здесь
                0
                «Сталин сказал: — Своё иметь надо.»
                +2
                Теперь осталось найти magic number для x4500
                Думаю что автор программы не смог таким образом погнать видео отличное от 900 и 950, а каминг сун для новых видеокарт — просто способ вышибать деньги на разработку. Вон, даже на хабре все хотели скинуться и подогнать ему ноут.
                Печально.
                  0
                  для линукса инструкции верны, долгое время использовал на hp 2140. Так же в свое время мне кто-то показал что вместо GMABooster можно использовать дефолтный setpci :)
                  • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      Это решение (которое само собой совпало с моим) — и есть перехвачанный вызов reggie_se со стороны GMABooster'a, сделанный тупо в лоб обоими сторонами. Далее автор поясняет, что под Mac reggie_se стоит вызывать с плавающим параметром девайса, предварительно получив его. Иначе действия могут применяться куда угодно, но не к адаптеру, вот его и рекомендуется использовать.
                        +1
                        Это совпадение, не более того.
                          +1
                          Я имел ввиду адрес загрузки AppleEFIRuntime.kext — просто совпадение.
                        0
                        Аналог reggie_se под win бывает?
                          +13
                          А можно и в DSDT сразу подправить (а при желании потом и в BIOS прошить):
                          Для устройства GFX0 (у кого-то может быть другое имя, важно что бы было _ADR = 0x00020000) добавляем OperationRegion типа PCI_Config с адресом 0xF0 и длинной 0x04:
                          OperationRegion (BOST, PCI_Config, 0xF0, 0x04)
                          объявляем одно поле:
                          Field (BOST, DWordAcc, NoLock, Preserve)
                          {
                          FREQ, 32
                          }
                          насчет длинны 32 бита не уверен, возможно нужно будет сделать 2 по 16.
                          Добавляем метод _INI в устройство GFX0:
                          Method (_INI, 0, NotSerialized)
                          {
                          Store (0x34646000, FREQ)
                          Sleep (0x01)
                          Store (0x34640533, FREQ)
                          }
                          Для того, что бы после просыпания не слетал разгон, добавим (на всякий случай, не уверен, что _INI вызывается при просыпании) вызом этого метода в _WAK:

                          Method (_WAK, 1, NotSerialized)
                          {
                          … skip…
                          \_SB.PCI0.GFX0._INI()
                          Return (Package () {0x00, 0x00})
                          }

                          Должно работать :)
                            +6
                            Вот таких комментариев я и ждал!
                            0
                            Погонял синтетику (по много раз). Результат: прирост 5%.
                            Не стоит оно того.
                              0
                              затирание копирайта печально… и зачем??!

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое