Сейчас на форуме: rmn, exp50848 (+7 невидимых)

 eXeL@B —› Основной форум —› Софт управления контроллером под HASP'ом
Посл.ответ Сообщение

Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 30 августа 2011 16:42 · Поправил: Модератор
· Личное сообщение · #1

Привет ломателям донглов.

Есть софт. Софт несколько приватен, поэтому выложить его не могу. К софту прилагается ключ HASP HL Pro. Сложилось впечатление, что софт умеет работать с ключами двух типов - Aladdin HASP и Rainbow Technologies Sentinel (более того, я так понял обе конторы подмял под себя SafeNet).

Итак, что накопал. Во время работы данного софта обращений к ключу не обнаружено (скорее всего их нет). Но если дернуть ключ во время работы, софтина подвисает (я полагаю так ведет оборону сам драйвер хаспа). Насколько я понял, обращение к ключу происходит на FormCreate. Сначала идет обращение к ключу HASP и сразу за ним проверка строки ошибки с шаблонной строкой "OK":
Code:
  1. mov     edx, offset aOk ; "OK"
  2. lea     eax, [ebp+var_9C]
  3. call    strcpy2
  4. push    eax
  5. inc     [ebp+var_CC]
  6. mov     [ebp+var_D8], 344
  7. push    4
  8. call    HASP_test
  9. pop     ecx
  10. mov     edx, eax
  11. lea     eax, [ebp+var_98]
  12. call    strcpy2
  13. inc     [ebp+var_CC]
  14. pop     edx             ; Check HASP error message
  15. call    @System@AnsiString@$beql$xqqrrx17System@AnsiString ; System::AnsiString::operator==(System::AnsiString &)
  16. ...
  17. test    al, al
  18. jnz     _nextNormalCode

Code:
  1. HASP_test proc near
  2.  
  3. arg_0= dword ptr  8
  4.  
  5. push    ebp
  6. mov     ebp, esp
  7. push    offset hasp_handle
  8. push    offset vendor_code ; "aYkhErjfgz/VEqShjFt//uRT3n06h+hRyt4H74fd"... текст я изменил, всего 940 символ, включая знак '=' в конце
  9. mov     eax, [ebp+arg_0]
  10. push    eax
  11. call    check_hasp_key_state
  12. mov     dword_9605C0, eax
  13. mov     edx, dword_9605C0
  14. push    edx
  15. call    GetMessageByErrorCode ; здесь формируется сообщение об ошибке
  16. pop     ecx
  17. pop     ebp
  18. retn
  19. HASP_test endp

Как мне подсказали опытные ломатели хасп, строка "aYkhErjfgz/VEqShjFt//uRT3n06h+hRyt4H74fd<...>=" представляет собой некий пароль для доступа к ключу vendor code. В дебрях check_hasp_key_state есть и AES и MD5, что очень характерно для HASP. Если строка сформированная GetMessageByErrorCode не соответствует строке "OK", выполнение передается на следующий кусок кода:
Code:
  1. openSentinel:
  2. call    openSentinelDevice ; открывается хендл на "\\.\RNBODRV0"
  3. test    ax, ax
  4. jnz     openSentinel
  5. jmp _askSentinelKey
  6. _printError:
  7. SEND_ERROR_MESSAGE
  8. _askSentinelKey:
  9. call    waitSentinelKeyState
  10. test    ax, ax
  11. jnz     _printError
  12. _nextNormalCode:
  13. <КОД ДЛЯ ДАЛЬНЕЙШЕЙ РАБОТЫ ПРОГРАММЫ>

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

А в чем собственно вопрос? А вопросы будут такие:

1. Дейсвительно ли все так, как я описал? Т.е. верно ли, что представленная схема это реально связка HASP+Sentinel по принципу "что есть, с тем и работает"? Если нужны дополнительные данные (кроме драйверов, с которыми работают эти куски кода), могу попробовать достать.
2. Во время эксперимента на боевой машине, я пропатчил переход "jnz _printError", и софт там завис. Потом удалил на своей машине драйвер Sentinel и понял, что виснуть может и на цикле "jnz openSentinel". Т.е. как пропатчить правильно я то конечно понимаю (либо убить оба цикла, либо сразу после сравнения строк поставить железный JMP вместо условного JNZ), но во время экспериментов выяснилось, что HASP жестко обороняется. Вот что я под этим имею в виду:
2.1) восстановить файл из бекапа не получается, вылезает ошибка, что файл уже используется (при этом пропатчить его никаких проблем );
2.2) ни один из файлов в каталоге нельзя переименовать (зато можно переместить, можно добавить произвольный файл);
2.3) нельзя переименовать какой-либо файл в каталоге, изменив его разрешение на .exe, можно только скопировать его на нейтральную территорию, а затем пропатчить если надо, переименовать и скопировать обратно.

Отсюда следующий вопрос: как мне запустить патченную версию из этого же каталога, т.е. что умеет HASP? Допустим я убедился, что эта софтина "научилась" работать без ключа, как вообще вынести драйвера HASP с их дебильной защитой (дебильной в плане рациональности)?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 30 августа 2011 16:50
· Личное сообщение · #2

Скачай вот эту хреньку
http://exelab.ru/f/action=vthread&forum=13&topic=6248&page=7#12

и сразу поймешь что там за 940 символов и как правильно функции называются. Я даже с помощью этой хреньки и память ключа всю считал, и эту память в ключе подредактировал и проэмулил все HaspEncrypt/Decrypt

-----
Yann Tiersen best and do not fuck




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 30 августа 2011 17:06
· Личное сообщение · #3

У меня цель немного другая. Мне не особо интересно, что это за 940 символов. Мне сказали, что это ключ, я этому верю. В данном случае явно есть возможность отвязать от ключа патчем одного байта. И если так, то очень хорошо. Софт слишком кривой, чтобы полагаться на него и дальше. Конечная цель вообще обойтись без ключа, а затем и без проги (сделать свою софтину управления контроллером станка).

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




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 30 августа 2011 21:56
· Личное сообщение · #4

int
По вашему описанию я понял, что вся суть защиты заключается в вызовах так называемых HASP API. Они вручную расставляются на этапе компиляции разработчиком, так что хасп в таком случае может ровно столько, сколько прописано в SDK. В нём можно найти прототипы, примеры вызова и описание возможностей всех защитных функций. Лежит он на оф. сайте хаспа. Весь дистрибутив весит 1,4 Гб, но если попросите, то могут выложить лишь pdf с описанием АПИ хаспа. Я б сам выложил, но мой рабочий жёсткий сейчас временно недоступен.

А, вообще, как показывает мне мой скромный опыт, то ИМХО виной всему Sentinel. Алладиновский ключ так себя не ведёт.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 30 августа 2011 22:04
· Личное сообщение · #5

С SDK благодаря прямой наводке PE_Kill'а я уже разобрался. Реально используется только hasp_login. Т.е. имеем защиту по типу IsDonglePresent. Просто реально интересно узнать от тех, кто имел опыт распаковки драйвера, на что у меня сейчас сил и опыта не хватит (конверт в ядре это для меня крутой уровень), что он может. Т.е. насколько опасны такие эксперименты? Может он поймает факт модификации софта и сделает что-нибудь интересное. Например, поломает ключ или завесит систему через пару дней (тайм-бомба). Поэтому я сразу и спросил, как избавится от драйвера. Я нагуглил один способ (вроде бы штатный), попробую его.



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 30 августа 2011 22:52
· Личное сообщение · #6

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

-----
старый пень




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 31 августа 2011 02:18
· Личное сообщение · #7

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

Напоролся на очень интересный момент. Железка подцеплена к COM-порту. А вот программа работает с портами ввода/вывода с номерами 0x378 и 0x37A, что соответствует LPT-портам. Чудеса? Может кто-нибудь этот момент прокомментировать?

P.S. Не знаю зачем Archer тему перетащил. Вроде ковыряю конкретную программу, а HASP по-большому счету вообще не причем.




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 31 августа 2011 09:43 · Поправил: Vamit
· Личное сообщение · #8

Железка подцеплена к COM-порту. А вот программа работает с портами ввода/вывода с номерами 0x378 и 0x37A, что соответствует LPT-портам. Чудеса? Может кто-нибудь этот момент прокомментировать?
А ключ в какой порт всунут?

-----
Everything is relative...





Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 31 августа 2011 10:02
· Личное сообщение · #9

int пишет:
Железка подцеплена к COM-порту. А вот программа работает с портами ввода/вывода с номерами 0x378 и 0x37A, что соответствует LPT-портам

Может используется эмуль COM>LPT ? (моё предположение на основе того что есть эмуль USB>COM).

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 31 августа 2011 10:45
· Личное сообщение · #10

А вот программа работает с портами ввода/вывода с номерами 0x378 и 0x37A
Думаю, ошибся. Эмулятор обычно порты не эмулирует, он выше сидит. Порты может проверять только на предмет наличия ключа под этот интерфейс и все. Помню его выполняли в виде переходника, на который дальше вешали принтер.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 31 августа 2011 13:22
· Личное сообщение · #11

Какой нафиг эмулятор и ключ? Вы о чем? Софт уже без ключа работает, я там один переход пропатчил. Я сейчас изучаю протокол взаимодействия программы и станка (которым программа и управляет).

Vamit пишет:
А ключ в какой порт всунут?

Ключ был USB-шный, хасповский.

tundra37 пишет:
Думаю, ошибся.

Не, не ошибся. Там реально используются только эти два порта.

На самом деле я обнаружил что в компьютер вставлены два контроллера LPT портов, порты замкнуты между собой каким-то шлейфом (вроде без микросхем внутри). Отдельно от них есть контроллер COM-портов. К одному из них зацеплен станок.



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 31 августа 2011 13:49
· Личное сообщение · #12

Если есть железячный анализатор, посмотри трафик на этом шлейфе. Возможно, там схема
твой софт (front-end gui) <-> lpt0 (out) <-> lpt1 (in) <-> служба, либо другой сервис (типа сервер-диспетчер, back-end) <-> com <-> твой агрегат

-----
старый пень




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 31 августа 2011 14:04
· Личное сообщение · #13

r_e
У меня такое же предположение, только склонялся к мысли что в твоей схеме вместо back-end служит обычный шнурок сцепляющий внутри корпуса LPT плату с COM платой. Хотя контроллер COM-портов выглядит вполне себе стандартно. В принципе похоже на то, что раньше в цепи было два компа. Производитель решил объединить все в один, но не стал переписывать софт.

P.S. Пошел вскрывать корпус.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 31 августа 2011 16:09
· Личное сообщение · #14

Вскрытие корпуса разрешило все вопросы.

LPT-порт на материнской плате <--> шлейф на планку с внешним LPT-портом <--> внешний шлейф LPT<->LPT <--> контроллер с внешним LPT-портом, внутри питание от материнской платы и шлейф к другой планке <--> планка с разветвлением на два COM-порта <--> нуль-модемный кабель от станка до этой планки.

Таким образом, все выглядит как какой-то девайс подключенный к LPT-порту - это единственный канал данных.

На этом изучение софтины завершено (изучен протокол управления через LPT-порт), всех благодарю.


 eXeL@B —› Основной форум —› Софт управления контроллером под HASP'ом
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати