/*-----------------------------------------------------------------------*/
/*                       R I N G 0,    I S S U E   # 1                   */
/*-----------------------------------------------------------------------*/

                  Отлучение программ от HASP-ключа

                                                           by Dr_Net/TSRH

     Target : HASP - guard
     Author : Dr_Net [[email protected]] [http://www.uofg.cc ,
http://tsrh.cjb.net]
      Toolz : Soft-Ice v4.xx , IDA v4.xx , ручка прямая и лист бумаги .
  ATTENTION :   Вся   приведенная   в   этом  документе  информация
предназначена  для  ознакомления  , но _не для применения на практике_ !
Автор ничего и никого не несет .

-=Интро=-
     Статья  предназначена  для  подготовленных  крякеров , имеющих опыт
работы  с различными защитами . Но это может быть первый тутор по снятию
защит донглов . Труд представляет собой сосредоточие разрозненных знаний
о  HASP-guard  .  Я  не  буду  приводить  конкретный  пример программы ,
защищенной  хаспом  ,  а  дам  общие представления о защите . Видов HASP
существует великое множество , я приведу только самые распространенные .
HASP-4                  LPT-ключ без памяти
MemoHASP                LPT-ключ с памятью (от 112 до 496байт)
NetHASP[X]              LPT-ключ с памятью (5   100 пользователей) сетевой
TimeHASP                LPT-ключ с памятью (16 байт) и реалтаймом
Не смотря на различное строение ключей , механизмы защиты имеют схожий
алгоритм .

-=Основа защиты=-
     Через  обращение  к  функции  , размещенной в коде программы [или в
dll]  ,  происходит  обмен  данными программы с донглом . Среди крякеров
функция получила название HaspReg() , так как параметры передаются через
регистры  .  Она возвращает различные значения . Вот таблица , в которой
описано большинство параметров функций и нужных программе значений .

SERVICE BH=FUNC,  BL=PORT           RETURN

01h.ISHASP SERVICE                  AX : 0 - HASP NOT FOUND1 - HASP FOUND
02h.HASPCODE                        AX : 1ST RETURN CODE BX : 2ND RETURN
CODE
                                    CX : 3RD RETURN CODE DX : 4TH RETURN
CODE
03h.READMEMO                        BX : DATACX : STATUSDI=MEMORY ADDR.
                                    (ЧИТАЕТ 1 БАЙТ ПО АДРЕСУ DI)
05h.HASPSTATUS                      AX : MEMORY SIZE BX : HASP TYPE CX :
ACTUAL LPT_NUM
06h.HASPID                          AX : IDLOW BX : IDHIGH CX : STATUS
32h. READBLOCK                      CX : STATUS

     На  самом деле их намного больше , но эти чаще всего используют . В
некоторых случаях достаточно изменить код результата выполнения [ecx=0]

     -=Для  углубленного  изучения  предлагаю  код HaspCode (bh=2)=- Для
ленивых в айсдамп встроена команда /haspcode [параметры]

HaspCode:
        mov     edx,HaspBuffer
        movzx   eax,word [pwd2]         ; Password 2
        movzx   ebx,word [pwd1]         ; Password 1
        shl     eax,10h
        mov     ax,bx
        mov     [edx],eax
        xor     dword [edx], 09071966h
        xor     eax,eax                 ; Clear eax
        call    sub_401108

        xor     ebx,ebx
        mov     edi,HaspBuffer+14h

loc_4011F9:
        xor     eax,eax
        mov     esi,eax
        jmp     short loc_401220

loc_4011FF:
        movsx   edx,byte [ebx+HaspBuffer+4]
        shl     edx,3
        lea     ecx,[edx+HaspTable]     ; Points at table entry.
        mov     eax,esi
        mov     dl,[eax+ecx]
        mov     ecx,esi
        shl     ecx,3
        add     ecx,ebx
        mov     [edi+ecx],dl
        inc     esi

loc_401220:
        cmp     esi,byte 8
        jb      loc_4011FF

        inc     ebx
        cmp     ebx,byte 8
        jb      loc_4011F9

        call    sub_40112E
        retn

;------ Functions ------

sub_401108:
        mov     cl,[edx]
        and     cl,7
        mov     [edx+eax+4],cl
        sar     dword [edx],3
        inc     ax
        cmp     ax,8
        jl      sub_401108

        retn

sub_40112E:
        movzx   ecx,word [seed]         ; Seed Code
        mov     ax,cx
        lea     edi,[HaspBuffer+0Ch]
        xor     esi,esi

loc_40113E:
        mov     byte [esi+edi],0
        xor     edx,edx

loc_401144:
        movzx   eax,ax
        imul    ecx,eax,01989h
        mov     eax,ecx
        add     ax,5
        mov     ecx,7
        sub     ecx,edx
        movzx   ebx,ax
        sar     ebx,9
        and     ebx,3Fh
        mov     bl,[ebx+HaspBuffer+14h]
        shl     bl,cl
        or      [edi+esi],bl
        inc     dx
        cmp     dx,8
        jl      loc_401144

        inc     si
        cmp     si,8
        jl      loc_40113E

        movzx   eax,word [edi]
        mov     esi,[dClient_EAX]
        mov     [esi],eax

        movzx   eax,word [edi+2]
        mov     esi,[dClient_EBX]
        mov     [esi],eax

        movzx   eax,word [edi+4]
        mov     esi,[dClient_ECX]
        mov     [esi],eax

        movzx   eax,word [edi+6]
        mov     esi,[dClient_EDX]
        mov     [esi],eax

        retn

pwd1:           dw 0
pwd2:           dw 0
seed:           dw 0
HaspBuffer:     times 84 db 0
HaspTable:      db
00h,00h,00h,00h,00h,00h,00h,00h,00h,01h,00h,01h,00h,01h,00h,01h
                db
01h,00h,01h,00h,01h,00h,01h,00h,00h,00h,01h,01h,00h,00h,01h,01h
                db
01h,01h,00h,00h,01h,01h,00h,00h,00h,00h,00h,00h,01h,01h,01h,01h
                db
01h,01h,01h,01h,00h,00h,00h,00h,01h,01h,01h,01h,01h,01h,01h,01h

-=Последние слова=-
     Есди   вам   что-нибудь  непонятно  или  у  вас  возникли  денежные
предложения - пишите или ищите меня ...
ICQ   114366611
IRC   dalnet #uofg #xtin
MAIL  [email protected] or [email protected]

-=Словарь=-
     Донгл[dongle]   -   ключ   ака  hardware-устройство  ,  висящее  на
каком-либо порту . [конкретно subj - LPT]

     Greetz  jump  out  to  TeaM | TsrH , UOFG crew [special for aSL!] ,
HangUp , XTIN , Nerf and All DeveLopErz AroUnd the w0rlD .