Сегодня я взломал TrawlServer

Тема в разделе "WASM.HEAP", создана пользователем Miller Rabin, 8 янв 2008.

  1. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Trawl - это программа для опознавания диктора по речевым фонограммам.
    Защита основана на Ключе Hasp4 M1

    Суть защиты такова, что блок данных, включающий в себя заранее определенное количество лицензий и серийный номер токена
    шифруется с помощью сервиса HaspEncodeData и включается в тело программы. Пароли для доступа к Хаспу походу задаются константами во время компиляции. Таким образом каждый клиент при заказе программы получает свой собственный дистрибутив, работающий только с указанным ключем и с заранее вбитым колиечством лицензий.

    Взлом защиты предполагал анализ работы программы с шифром и получение возможности привязывать дистрибутив к любому ключу с любым количеством лицензий
    На взлом защиты ушло 2 дня

    За новогодние праздники это уже третья взломанная защита основанная на Аладдиновских ключах.

    Но если, к примеру, VideoNet до меня ломала уже куча народу, и я уже знал как там устроена защита, то про взлом Trawl я в сети не нашел ничего.

    Так к чему это я. Просто вот сижу сейчас читаю Руководство программиста Hasp, а там кругом лозунги, что типа с использованием Хаспа вы создаете почти неломаемую защиту ну очень высокого уровня. Во бред!!!

    Хасп это не защита - это заглушка в USB, чтобы пыль не попадала!!!
     
  2. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Если ваша цель не просто хвастовство, тогда выложите подробное описание, как была взломана данная защита.
    Можно в виде статьи.
    Сюда или на кряклаб.
     
  3. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.738
    Неломаемых защит нет.

    И уж тем более СТАНДАРТНЫХ типа алладиновских хаспов ...

    Это не бред а обычный маркетинг .... Им же нужно свой товар продавать.
    Как ты думаеш много бы они продали если бы написали что защита ломается в среднем за 3-4 дня :)
     
  4. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    Вау каг, круто! ломануто очередное вендузятно-глюкавое, поделие жлобливого ламачья, которое на йух никому не нужно...
    Можно и попроще версию ексешки и диелел + крак-патч... :)
    Наверняко дело решилось заменой 75 (je) ЁB-ом (jmp) ;)
     
  5. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    154
    bugaga
    Я знаю ты линуксоид. И тебе не дают женщины. И вообще не пиши этот бред, после прочтения кажется, что ты неудачник.
     
  6. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    малыш, мне пофик на твое личное мнение... лучше помедетируй на:
    "Software is like sex: it's better when it's free."
    (с)Linus Torvalds.
     
  7. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    bugaga
    а ты помедетируй над выражением

     
  8. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    bugaga
    А кстати верно. Сильно специфический продукт, который имеет смысл применять разве, что в службах безопасности крупных предприятий.
    Если бы его не заказали, то я до сих и понятия бы не имел, что такое вообще существует.
    Поэтому не уверен, что статью, посвященную взлому этого подукта будет интересно читать.

    Ну а если в кратце, взлом осуществлялся так:

    У меня был демонстрационный ключ и дистрибутив программы Trawl.
    В дистрибутив входит сервер(TrawlServer), который собственно и защищен ключем Hasp.
    И несколько клиентских модулей, работающих с этим сервером.

    Демонстрационный ключ позволял подключаться к серверу только одному клиенту.

    Для взлома использовались следующие инструменты IDA, Блокнот, и OllyDbg

    Защита предоставляемая компанией Alladin для Hasp бывает двух видов На уровне приложения и на уровне исходного кода.

    Небольшое знакомство с программой, что применена защита на уровне исходного кода.
    Сам защитный модуль предоставляет вызов только одной процедуры Hasp

    Процедура Hasp имеет 9 аргументов.
    Первый аргумент это номер сервиса, который мы хотим вызвать

    к примеру:
    1 - Это определение подключен ли хасп
    5 - Это получение информации про хасп
    6 - Это получение уникального ID Токена

    Всю подробную инфомацию можно прочитать в руководстве программиста Hasp с сайта алладина.

    Для того чтобы получить доступ к Хасп нужно знать два его пароля.
    При вызове сервиса Хасп пароли должны указываться четвертым и пятым аргументом.

    Таким образом чтобы определить пароли доступа к ключу достаточно найти хотя бы один вызов сервиса Хасп и четвертый и пятый аргументы будут собственно паролями доступа
     
  9. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Но одних паролей мало для того чтобы определить как с ключем работает программа.
    А для того, чтобы было легче хорошо бы прочитать Стратегии защиты программы из руководства разработчика Hasp.

    Разработчики ПО такие же люди как и мы (представляете). Поэтому при проектировании защиты они скорее всего опирались на приведенный компанией стратегии защиты.

    Так каковы же эти стратегии?
    В кратце так.
    Ести два сервиса шифрования и дешифрования постироенные на внутренних алгоритмах шифрования Хасп. Для обеспечения защиты рекомендуется сделать контрольный буфер и защифровать его ключем или наоборот расшифровать. Если результат получится верным, то ключ верный.

    итак примерно известно, что нужно искать. Для шифрования используются сервисы 60(HaspEncodeData) и 61(HaspDecodeData).

    В процедуре, отвечающей за определения корректности ключа я нашел вызов HaspDecodeData.
    осталось только посмотреть с каким буфером она работает.
    Как выяснилось в программе используется два буфера. Один уже защифрованный, воторой шифруется ключем во время выполнения. После этого буфера сравниваются и сели они совпадают значит ключ верный.

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

    Но возник вопрос как же тогда рапространяется программа? И где тогда хранится количество лицензий. Такой способ защиты обеспечивает жесткую привязку программы к конкретному ключу, а не к партии ключей. Ответ только один для каждого клиента создается отдельный дистрибутив с отдельным ключем. А количество лицензий защито непосредственно в исполняемый файл.

    Но одно дело предположить, а другое дело действительно найти необходимые данные. Для этого нужно разобрать процедуру проверки ключа.
    Только вот как не заблудится в таком объеме кода?

    Тут на помощь приходит IDA. Я активно использую скрытие текста. Проанализоровав участок кода, я просто свертываю его с глаз долой а в описании пишу, что этот учаток делает. и так до тех пор пока процедура не принимает следующий вид

    Код (Text):
    1. ;Получаем ID ключа в ecx
    2. ;Получаем заданное значение TokenID в ebx
    3. cmp ecx, ebx
    4. je Success
    5. Failed:
    6. xor eax, eax
    7. ret
    8. Success
    9. mov eax, 1
    10. ret
    Как видим в процедуре явно фигурирует зараннее определенный ID Токена где он хранится.
    Вообще мы имеем дело с шифрованием. А с шифрованием шутить вредно. Для того чтобы четко знать откуда, что берется необходимо иметь
    представление о структуре данных. Вот здесь то на помощь приходит обычный блокнот.
    В нем удобно записывать алгоритм защиты псевдокодом с указанием адресов.
    У меня получается прмерно следующее.

    Код (Text):
    1. (00413С28)HaspData:
    2. Полное содержимое структуры
    3. (00413С28)HaspData.OriginalKey:
    4.  13 93 87 FE AB FF FF FF 73 74 72 45 78 65 4E 61           “‡ю«яяяstrExeNa
    5.  6D 65 28 65 78 65 50 61 74 68 29 3B 20 20 20 69    me(exePath);   i
    6.  6E 74 20 6E 49 6E 64 65 78 20 3D 20 73 74 72 45    nt nIndex = strE
    7.  78 65 4E 61 6D 65 2E 52 65 76 65 72 73 65 46 69     xeName.ReverseFi
    8.  6E 64 28 5F 54 28 27 61 61 21 27 29 29 3B 20 69    nd(_T('aa!')); i
    9.  2B 2B 3B 20                        ++;
    10.  
    11. (00413C7C)HaspData.CryptedKey:
    12.  69 18 01 A8 00 E6 0B E3 81 38 2C 90            iЁ.жгЃ8,ђ
    13.  E8 C9 67 A4 5A 9A 18 18 7F 00 58 8B 64 6C 4D 80    иЙg¤Zљ.X‹dlMЂ
    14.  F4 0F 05 36 A1 F2 D1 0B F3 D6 C1 DC 9B BC B0 95    ф6ЎтСуЦБЬ›ј°•
    15.  B2 34 18 0C D4 99 0F 66 AE 96 7F 86 A2 72 1D 16    І4.Ф™f®–†ўr
    16.  72 F6 65 13 30 84 BF 71 D3 9E 41 35 F1 CE AF 9F    rцe0„їqУћA5сОЇџ
    17.  5D 0D C6 1E 7B A8 DD A4                                ].Ж{ЁЭ¤
    18.  
    19. (0041315С)ActualUSBPort        DD 0
    20. (00413160)ErrorStatus                  DD 0FFFFFC18h
    21. (00413164)ControlPhrase                DB'UNIQUE_CODTAB_'
    22.                     DB  186 DUP(0)                                                         
    23. (0041322C)NotCompleted      DD  -1
    24.  
    25. (00408490)Proc Main
    26.    (00408543)call GetHaspData
    27.    (0040858D)call validateToken 1
    28.    (00408599)call GetHaspData
    29. ret
    30. endp
    Для чего это все нужно? Просто в таком коде очень хорошо видно что зачем идет и по какому адресу. И в процессе анализа сегмент данных превращается набор переменных, где хорошо видно какая переменная к чему относится. Это хорошо помогает при работе, особенно, с шифруемыми блоками данных.
     
  10. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    При таком подходе анализировать данные становится намного легче.

    Если с заранее защитым TokenID все разрешилось - он прямо фигурирует в коде защиты, то как быть с масимальным количеством лицензий?

    TokenID - это первые 4 байта буфера HaspData.OriginalKey
    В коде получения заданного токена есть строки
    mov ebx, [TokenID]
    not ebx
    sub ebx, 53h
    После этого в ebx получается ID к которому привязана программа.

    но как же быть с максимальным количеством лицензий? В процедуре защиты ничего про него нет. Видимо он извлекается где-то в недрах сообщений диалогового окна. Копаться в оконных процедурах дело неблагодарное.
    однако известно, что количество лицензий выводистся как-то на экран. ЧЕМ?
    Ну процедур вывода текста на экран слава богу не так уж много.

    Как их перебрать? Да с помощью аппаратных бряков.

    Просто ставишь бряк в теле процедуры, которая предположительно будет вызвана для задание текста и ждешь пока она сработает.
    Нужной оказалась SetWindowtextA. Именно с помощью нее выводится на экран максимальное количество лицензий.

    Дальше возвращаемся из процедуры в вызвавший ее код. И видим. что это вторые четыре байта нашего HaspData.OriginalKey.

    Внутри присутствуют строки
    mov eax, [MaxLicense]
    not eax
    sub eax, 53h
    FORMAT ...
    SetWindowtextA, ....

    Вот и весь взлом. Таким образом для того чтобы привязать программу к другому ключу с другим количеством лицензий нужно просто перебить
    HaspData.OriginalKey
    А новый буфер защифровать указанным ключем и перебить им HaspData.CryptedKey.

    Все было не слишком сложно :)
     
  11. dbrain

    dbrain New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2007
    Сообщения:
    197
    Аффтар, пиши об этом статью на сайт
     
  12. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    ыы, а HR менеджеры Оладдина активно набирают в свою команду программистов.
    вопрос - ст0ит ли идти в такую контору с учетом такой разгромной статьи уважаемого Miller Rabin-a, которая (не)много ставит под сомнение профессионализм Оладдиновских программистов?
     
  13. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    varnie
    Вспомним небезызвестного афтара FlexLM, демоны которого (после небольшого патча) позволяют генерировать новую лицензию. У них в саморекламе отмечалось, что с помощью их менеджера лицензий защищено софта на многие миллиарды долларов. :)
     
  14. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    В техническом смысле защита программы с помощью дешевого донгла Хасп обычно действительно несерьезна. Новое поколение донглов с открытыми алгоритмами я надеюсь будет более стойким. Естественно речь идет про более-менее опытного кракера, отличающего на глаз пакованый ПЕшник от генерика

    Более важен с моей точки зрения моральный смысл этого действия. Убить человека ведь тоже в сущности технически несложно, но далеко не каждый слава богу проверяет свои силы на этом поДприще. Я в свои 42 года затрудняюсь сказать - имеет ли посторонний человек моральное правило на взлом программы? Думаю где-то 50-на-50 Очень зависит от конкретной ситуации

    Miller Rabin
    Готов ли ты встретиться лично с девелоперами этого софта и пообщаться на тему заказанного и выполненного тобой взлома? Я тут ни при чем, важно чтобы ты себе мог ответить на этот вопрос
     
  15. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    z0mailbox
    А я в свои 20 отвечаю: "имеет! и ниипет!"

    А какого **я с ними общацо? То что вздрючили их защиту - это их проблемы.
    На то она и защита, чтобы отражать атаки. Если не отразила - значит ***вая защита!
    В конечном счете, сыты все, и "защитостроители" и "защитоломатели". А если вы попытаетесь донести идею морали до масс, то обе стороны вас просто забросают камнями.
     
  16. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    varnie
    Ну если говорить о профессиональных навыков сотрудников Alladin'а, то я могу с уверенностью сказать что их навыки повыше моих будут.

    z0mailbox
    Сама концепция защиты провальная.

    Производителю ПО, которое нужно защитить предоставляется библиотека с набором сервисов: Определение ID, Шифрования, Дешифрования, Работы с пользовательской памятью.

    Шифрование/Дешифрование происходит внутренними ключами, которые неизвестны никому кроме самого ключа :).

    Ну хорошо я ключей не знаю. Но производитель Софта их тоже не знает. Таким образом при работе с ключем программа может опираться только на исходные данные и на данные которые получились в результате шифрования ключем. А коли так, то я и сам могу вызвать сервис Шифрования для новых данных и подсунуть целевой программе эти данные за верные.

    Новые же поколения ключей содержат в себе микроконтроллеры, которые осуществляют это самое шифрование. Таким образом ключи шифрования не содержатся даже в коде драйвера. И если,к примеру, я не вижу реальной возможности проэмулировать эти ключи, то программы, защищенные ими ломаются точно также.

    Это защита, которая способна защитить только саму себя.

    Взломать конкретный экземпляр программы технически несложно, убить конкретный экземпляр человека технически несложно, написать пару статей в УК РФ оправдывающих одних и очерняющих других тоже технически несложно.

    Что же до морали и легальности, то это скорее поединок воров со лжецами. Кто правее? А уважать нужно и тех и других. А значит и себя :)
     
  17. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.738
    А каков смысл подобных встреч ?
     
  18. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Miller Rabin
    с оладдином не знаком; всяко может быть:)) но я не имел ввиду ни в коем случае то что "раз продукт конторы Х ломаем, то хреновые в этой конторе прогеры" :) тут дофигищща разных подходов внутриконторных к производству конечного продукта, и было бы глупо поголовно вешать ярлык "лузер" на всех её прогеров. тут слишком много неизвестных факторов, в частности, направления менеджмента конторы итд итп. а рядовой прогер делает только то, что ему велят делать:))
     
  19. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    угу.. иногда даже ломать/декомпилировать чужие проги :)
     
  20. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    Я просто так спросил. Мне интересно, хочу разобраться

    Miller Rabin
    техническая сторона мне лично неинтересна
    это пройденный, давно завершившийся этап ;)

    Всегда можно сделать ключ который никто не взломает, например заказать кустомный ПИК и перенести часть аппликейшын-специфик вычислений в него. Все. Кому надо - тот так и сделает, кто лох - тот будет кодить BOOLEAN IsProtected(void) :)

    Меня интересует чисто моральная сторона дела. Есть такая штука - логическая справедливость. т.е. не делай так как не хотел чтобы сделали тебе. Согласись что в той области где ты не лох - легко отследить агрессию и дать по рукам. Но мы же все в чем-то лохи, нет? Нормально чтобы твоей слабостью пользовались более сильные или нет?

    asmlamo
    Это был риторический вопрос. Жызненный опыт говорит что одно дело взломать за бабки программу наших жырных заокеанских братьев по разуму. И совсем другое - чуваков из соседней комнаты - здания. Почему так? Не связано ли это с возможностью личного знакомства?

    Другими словами не выступают ли в данном случае высокоразвитые реверсеры в качестве старшеклассников отбирающих у детей мобилы?