взломporoseNok/ P0R0SEN0K@yANDEX.RU /24!Диплом за 24 часаБлестящая защита по-хакерскиДолгожданное лето, конечно, не может не радовать. Но вместе с наступлением лета подошелк концу и учебный год. У одних студентов в полном разгаре сессия, а у других настал тяжелыйпериод в жизни под названием «ДИПЛОМ». Вот и моему товарищу также предстояла защитадиплома. Все бы ничего, но до защиты оставалось всего лишь несколько дней :(. Видя, что он ужепрактически впал в отчаяние и смирился с мыслью о том, что придется защищать диплом в следующемгоду, я решил ему помочь.ема его диплома была следующая: «Разработка автоматизированнойсистемы удаленной диагностики компью-Tтера». Если в нескольких словах, то система должна иметьклиент-серверную технологию, задачей клиентов которойявляется сбор и отправка значений датчиков (температура процессора,скорость вращения кулера и т. д.) на сервер.Поиск решенияПервоначально для получения данных от датчиков предполагалосьиспользовать WMI-технологию, но после нескольких часов, проведенныхза работой, нам так и не удалось достичь желаемых результатов. Крометого, в интернете была найдена статья, в которой упоминалось о безуспешнойпопытке получения скорости вращения кулера с использованиемWMI-технологии. Тогда возник вопрос: каким же образом программыаналогичной тематики получают интересующие нас значения? Для исследованиябыла выбрана программа Everest.В папке с программой находится около двух десятков файлов. Сразу и несообразить, где располагается код, отвечающий за получение данных отдатчиков. Поэтому, чтобы избавиться от лишнего, я стал последовательнопереименовывать файлы и запускать программу, проверяя, отображаютсяили нет нужные нам данные. В итоге осталось всего лишь четыре файла:everest.exe, everest.bin, kerneld.wnt и everest.key, назначение которых нампредстоит выяснить.Судя по размеру файла everest.exe, который составляет всего 65 Кб,напрашивается вывод, что он не отвечает за получение информации осистеме, а выполняет какие-то другие действия. Для того чтобы выяснить,какие именно, откроем его в отладчике OllyDbg. Но для начала проверим,запакован он или нет. PEiD показал, что программа запакована UPX’ом,поэтому для распаковки выполним команду upx.exe -d everest.exe. Преждечем приступить к отладке, посмотрим, вызовы каких функций используютсяв программе: для этого откроем окно Found intermodular calls («ПК Search for All intermodular calls»). Сразу же привлекает внимание вызовCreateProcess. Жмем на нем для установки брейкпоинта, а затеми для запуска программы. Через несколько мгновений срабатываетбряк и выполнение программы прекращается. В качестве имени выполняемогофайла функции передается строка, содержащая everest.bin.Предположение оказалось верным — выходит, что основная работа выполняетсяв everest.bin. Поэтому делаем следующее: переименовываем070xàêåð 08 / 104 / 07
взломПередача управления Everest.bineverest.bin в everest_bin.exe и запускаем на выполнение.После запуска программа выдала сообщение об окончании срока лицензиии закрылась. Значит файл everest.exe отвечал за проверку регистрациипрограммы. Но ничего страшного, это мы поправим. Открываемeverest_bin.exe в отладчике, не забыв сначала его распаковать все тем жеUPX’ом. Программа загружена, но, прежде чем нажать , поставимбрейкпоинты на вызов MessageBox. После запуска сработает бряк по адресу0x00695249h. Посмотрев немного выше, нельзя не заметить командуJBE everest_.0069525A, которая очень походит на проверку на регистрацию.Чтобы развеять все сомнения, меняем JBE на JMP и перезапускаемпрограмму. Все работает отлично, идем дальше.При отображении скорости вращения кулера выводится заголовокCooling Fans, попробуем его поискать в окне отладчика Text stringsreferenced («ПК Search for All referenced text strings»). Такая строкадействительно есть, и по адресу 0x5AECCB осуществляется взятие ее адреса,ставим бряк. Прервавшись на бряке, начинаем выполнять программув пошаговом режиме с помощью . По адресу 0x5AECDC в EDX изпамяти по адресу 0x02E9FA04 помещается число 0x96B, десятичное 2411,то есть количество оборотов кулера. Теперь попробуем выяснить, гдеоно формируется. Для этого перейдем на начало функции, в которой мынаходимся в данный момент, и поставим бряк. Для того чтобы определитьмомент записи числа 0x96B в память, перейдем в окне дампа памяти поадресу 0x02E9FA04. Итак, выполнение программы прервалось на бряке,поставленном в начале функции. В памяти по адресу 0x02E9FA04 находятсянули. Теперь начинаем выполнять программу в режиме анимации,без входа в процедуры (), и одновременно смотрим в окно дампа.После строчки «CALL everest_.005A37E8» в дампе оказалось число 0x96B.Поэтому заходим в эту функцию и ставим в ее начале бряк. При следующемпроходе, прервавшись на нем, снова жмем (забыл сказать: — пауза). Таким образом, мы дошли до адреса 0x595193, где чутьниже из регистра AX в память записывается количество оборотов. При этомзначения [LOCAL.7] и [LOCAL.8] равны 0. Теперь нам нужно найти место, гдепроизводится запись в [LOCAL.9]./*595193*/ MOV EAX,[LOCAL.7]/*595196*/ ADD EAX,[LOCAL.8]/*595199*/ ADD EAX,[LOCAL.9]/ *59519C* / MOV DWORD PTR DS:[EBX+998],EAXТакое место находится чуть выше, по адресу 0x59502C./*594FEB*/ MOV AL,2A/*594FED*/ CALL everest_.0058801C/*594FF2*/ MOV ESI,EAX./*59500C*/ IMUL ESI,[LOCAL.11]/*595010*/ MOV [LOCAL.81],ESI/*595016*/ FILD [LOCAL.81]/*59501C*/ FLD DWORD PTR DS:[59F5AC]/*595022*/ CALL everest_.004032FC/*595027*/ CALL everest_.00402C5C/*59502C*/ MOV [LOCAL.9],EAXЗдесь происходит следующее: с помощью команд сопроцессора значение,находящееся по адресу 0x59F5AC (=1350000), делится на произведениеESI (=0x46) и [LOCAL.11] (=8). Деление выполняется в вызове «CALLeverest_.004032FC». В результате анализа кода было выяснено, что значения[LOCAL.11] и [0x59F5AC] постоянны. В ESI же записывается результатвызова подпрограммы, находящейся по адресу 0x0058801C. Внутриэтой подпрограммы находятся два CALL’а (0x588047 и 0x588056), внутрикоторых происходит вызов DeviceIoControl. Выходит, что программа дляполучения сведений от датчиков использует обращение к драйверу.Про работу с драйверами можешь почитать в литературе. Скажу лишь, чтодля общения программ прикладного уровня с драйверами используютсязапросы, посылаемые с помощью DeviceIOControl.BOOL DeviceIoControl(HANDLE hDevice,// дескриптор устройстваDWORD dwIoControlCode,/ / код операцииLPVOID lpInBuffer, // буфер входных данныхDWORD nInBufferSize, // его размерLPVOID lpOutBuffer, // буфер данных результатаDWORD nOutBufferSize, // его размерLPDWORD lpBytesReturned, // адрес данных для выводаСообщение об окончании срока действия лицензииРабочий примерxàêåð 08 / 104 / 07071