
Привет, хабр! Закончилось лето, деревья роняют свои листья на холодную землю, в Новосибирске идет первый снег, а я в это время хочу рассказать небольшую историю о настройке платформы для перебора паролей WPA/WPA2 на базе устаревшей на сегодняшний день видеокарты RADEON HD4890.
Введение
Прошли времена, когда видеокарта была просто видеокартой. Вычисления на базе GPGPU (https://ru.wikipedia.org/wiki/GPGPU) набирают популярность и в десятки, а иногда и в сотни раз, производительнее, чем вычисления на CPU. Ни для кого не секрет, что дела у видеокарт AMD RADEON в этом плане значительно лучше, чем у эквивалентных видеоадаптеров NVIDIA. Для осуществления данных вычислений существуют следующие реализации:
- NVIDIA CUDA — технология, позволяющая реализовать алгоритмы, выполняемые исключительно на графических процессорах GeForce, Quadro и Tesla;
- OpenCL — фреймворк для написания программ, связанных с параллельными вычислениями на различных графических (GPU, включая NVIDIA и AMD RADEON) и центральных процессорах (CPU), а также FPGA. Входит в состав OpenGL и является конкурентом CUDA;
- CAL++ — простая библиотека для реализации выполнения алгоритмов на видеоадаптере с похожим на OpenCL синтаксисом.
Как известно, pyrit состоит из двух частей: ядра и модуля, необходимого для поддержки дополнительного оборудования. Причем данный модуль можно скомпилировать для поддержки одной из трех вышеописанных технологий вычислений на GPGPU. CUDA отпадает сразу, так-как реализована только для «зеленых» видеокарт. Остановимся на CAL++.
Предыстория
Все началось с желания сделать из старого разобранного компьютера что-нибудь полезное, just for fun. Буквально «на коленках» все было собрано воедино, машина была готова. Первым в голову пришел брутфорс паролей, естественно, в мирных целях. Итак, что мы имеем:
- CPU Intel Core 2 Duo с частотой 1.86GHz;
- 4Gb RAM в режиме Dual-Channel;
- GPU ATI RADEON HD4890, 1024Mb GDDR5, 975 MHz.
В качестве системы была выбрана Ubuntu версии 14.04, что и послужило источником проблем. Для полноценного аппаратного ускорения необходим пропиетарный драйвер, скачиваемый с сайта AMD, который отказался устанавливаться. Загуглив сообщение об ошибке, было найдено несколько причин: версии ядра и иксов были слишком новыми для Legacy-версии драйвера. Пришлось скачать (отсюда) более старую версию Ubuntu 12.04 с версией xorg 1.11.3 и ядром 3.2. Дальнейшие руководства были найдены тут: http://www.blackmoreops.com/2013/11/22/install-pyrit-in-kali-linux/.
Поехали!
Что нам понадобится?
- Пропиетарный драйвер видеокарты, который можно найти на официальном сайте AMD. В моем случае это legacy-amd-driver-catalyst-13.1, скачанный тут: http://support.amd.com/ru-ru/download/desktop/legacy?product=Legacy2&os=Linux%20x86_64.
- AMD APP SDK — инструменты для компил��ции второго модуля pyrit. Скачиваются здесь: http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/.
- CAL++ — еще одна библиотека для компиляции. http://sourceforge.net/projects/calpp/.
- Патч для APP SDK — https://github.com/clockfort/amd-app-sdk-fixes.
- Исходники pyrit, которые лучше всего взять из SVN.
Удобнее всего скачивать это богатство в отдельную папку и уже там работать из консоли. Начнем с драйвера:
$ unzip amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.zip $ chmod +x amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run $ sudo ./amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run
Запустится графическая версия установщика, с которой теперь не должно возникнуть проблем. После установки перезагружаемся и проверяем, все ли работает:
$ sudo reboot # После загрузки $ lsmod | grep fglrx fglrx 3273643 124 # Модуль загружен, числа могут быть другими $ fglrxinfo display: :0.0 screen: 0 OpenGL vendor string: Advanced Micro Devices, Inc. OpenGL renderer string: ATI Radeon HD 4800 Series OpenGL version string: 3.3.11672 Compatibility Profile Context # Теперь немного магии :) $ fgl_glxgears Using GLX_SGIX_pbuffer 7919 frames in 5.0 seconds = 1583.800 FPS

Появится окошко с вращающимся кубиком, FPS не должен быть низким. Если все ок, жмем CTRL-C — установка драйвера успешна. Далее установим AMD APP SDK:
$ tar -xvf AMD-APP-SDK-linux-v2.9-1.599.381-GA-x64.tar.bz2 $ chmod +x AMD-APP-SDK-v2.9-1.599.381-GA-linux64.sh $ sudo ./AMD-APP-SDK-v2.9-1.599.381-GA-linux64.sh # Принимаем лицензию, ставим в /opt $ sudo gedit /root/.bashrc
В конец открывшегося файла нужно добавить следующее:
# AMD APPSDK export AMDAPPSDKROOT=/opt/AMDAPPSDK-2.9-1 export AMDAPPSDKSAMPLESROOT=/opt/AMDAPPSDK-2.9-1 export LD_LIBRARY_PATH=${AMDAPPSDKROOT}/lib/x86_64:${LD_LIBRARY_PATH} export ATISTREAMSDKROOT=$AMDAPPSDKROOT
А затем применить изменения:
$ source /root/.bashrc
Эти переменные помогут компилятору найти нужные папки. Теперь нужно добавить несколько недостающих компонентов APP SDK:
$ sudo apt-get update $ sudo apt-get install subversion # Создадим новый пароль администратора, если его еще нет $ sudo passwd root $ su root # Копируем отсутствующие компоненты $ svn checkout https://github.com/clockfort/amd-app-sdk-fixes/trunk/include/CAL $AMDAPPSDKROOT/include/CAL
Собираем CAL++:
$ apt-get install cmake libboost-all-dev $ tar -xvf calpp-0.90.tar.gz $ cd calpp-0.90/ $ gedit CMakeLists.txt
В этом файле нужно изменить
# Эту строку: FIND_PATH( LIB_ATICAL_INCLUDE NAMES cal.h calcl.h PATHS "$ENV{ATISTREAMSDKROOT}/include" ) # На вот эту: FIND_PATH( LIB_ATICAL_INCLUDE NAMES cal.h calcl.h PATHS "$ENV{ATISTREAMSDKROOT}/include/CAL" )
И скомпилировать библиотеку:
$ cmake . $ make $ make install
Если ошибок не возникнет, идем дальше, в противном случае нужно проверить все пути к файлам в CMakeLists.txt, особенно содержащие версии. Наконец, последний шаг — собираем pyrit:
$ cd .. # Пакеты, необходимые для работы pyrit $ sudo apt-get install libpcap-dev libssl-dev zlib1g-dev $ sudo svn checkout http://pyrit.googlecode.com/svn/trunk/ pyrit_svn # Сборка и установка основного модуля $ cd pyrit_svn/pyrit $ sudo ./setup.py build install # Сборка модуля calpp cd ../cpyrit_calpp/ sudo gedit setup.py # Заменяем: # VERSION = '0.4.0-dev' на VERSION = '0.4.1-dev' # CALPP_INC_DIRS.append(os.path.join(CALPP_INC_DIR, 'include')) на CALPP_INC_DIRS.append(os.path.join(CALPP_INC_DIR, 'include/CAL')) # Собираем $ sudo ./setup.py build install
Ура! Теперь проверяем, видит ли pyrit наш GPU:
$ pyrit list_cores Pyrit 0.4.1-dev (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com This code is distributed under the GNU General Public License v3+ The following cores seem available... #1: 'CAL++ Device #1 'ATI RV770'' #2: 'CPU-Core (SSE2)' $ pyrit selftest Pyrit 0.4.1-dev (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com This code is distributed under the GNU General Public License v3+ Cores incorporated in the test: #1: 'CAL++ Device #1 'ATI RV770'' #2: 'CPU-Core (SSE2)' All results verified. Your installation seems OK
И бенчмарк:
$ pyrit benchmark Pyrit 0.4.1-dev (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com This code is distributed under the GNU General Public License v3+ Running benchmark (26285.9 PMKs/s)... / Computed 26285.86 PMKs/s total. #1: 'CAL++ Device #1 'ATI RV770'': 26369.6 PMKs/s (RTT 1.2) #2: 'CPU-Core (SSE2)': 525.0 PMKs/s (RTT 3.0)
Ну вот и все. Теперь можно оставить машину на ночь, а самому пойти спать, согреваясь ее теплом.
Заключение
Надеюсь, кому-нибудь пригодится материал данной статьи, и еще в одном доме оживет сердце старой забытой видеокарты. В следующих частях постараюсь рассказать про объединение нескольких видеоадаптеров для совместной работы, а также про объединение нескольких машин в кластер. Всем успехов!
P.S. Благодарен товарищу Dimones за предоставленное оборудование.