Защита, использующая хасп-ключ. Часть 1

Дата публикации 11 май 2004

Защита, использующая хасп-ключ. Часть 1 — Архив WASM.RU

Что собираемся делать ?

  Объект исследования: программа, использующая для защиты hasp-key

  Инструменты: Soft-Ice (под '98), hiew

  Цель: изучение win32-программ, обладающих защитой в нулевом кольце и hasp

  Документация/источники: статья "Програмная эмуляция HASP ключей By exefoliator, 2000", утилита haspgrab

  Примечание: это есть поверхностный анализ защиты такого типа, приношу свои извинения знатокам hasp'ов за возможно "наивные" рассуждения :smile3:

Состав защиты

  Программа включает в себя следующие компоненты: рабочий модуль prog.exe, возможно частично зашифрованный, два VxD драйвера: haspbig.vxd, весом полмегабайта, статический (загружаемый системой при старте) и hasplit.vxd, небольшой и динамический (загружаемый программой prog.exe при запуске). В порт компьютера LPT воткнут hasp-ключ.

Первая попытка.Soft-Ice

  Первое, что я попробовал сделать - это посмотреть, как защита работает с hasp. Воспользовавшись командой Soft-Ice мониторинга портов:

Код (Text):
  1.  
  2.   bpio 0378
  3.   bpio 0379
  4.   ...
  5.  

  я ожидал получить break по доступу к портам ввода-вывода и сделать какие-нибудь предварительные выводы. Запускаем программу... нет. Нет никаких break'ов.

  Почему ? Проверяю работу ice на тестовых (своих) программах и обнаруживаю: 0) обращение из дос-задачи перехватывается; 1) из vxd-драйвера не перехватывается. В случае 1 не помогают sti и т.п.

  Получается, ice не перехватывает работу с портами с нулевого кольца (в 98 есть только два уровня: 0-ой, в котором находятся все vxd-драйвера и 3-ый: win32-приложения. Не считая, конечно, V86 для дос-программ и BIOS).

Вторая попытка.Сервисы перехвата VMM

  Обнаружив в списке функций главного VxD системы функции перехвата обращений к портам типа:

Код (Text):
  1.  
  2.   VMMCall Enable_Global_Trapping
  3.   VMMCall Disable_Global_Trapping
  4.   ...
  5.  

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

Третья попытка.Битовая карта ввода-вывода

  При организации работы в защищенном режиме есть такая вещь: если программист использует задачи (task), то в описателе задачи (на который необходимо выполнить переключение командами jmp или call) содержится так называемая битовая карта запрещения ввода-вывода. Если текущий CPL задачи не соответсвует IOPL и в этой карте установлен бит запрещения доступа к порту, то процессор генерирует исключение. Эта удобная вещь используется дос-менеджерами типа emm386 для предоставления сервиса trapping'а (возможность установить ловушку и эмулировать работу устройства). Например, программа PCDOSEMU.COM ("PC3000AT HASP/ISA board emulator") использует эту возможность для эмуляции второго hdd.

  Однако поверхностное вскрытие win показало, что она совсем не использует механизм переключения задач (бит NT - nested task - в регистре EFLAGS сброшен). К тому же не совсем ясно, как настроить CPL (текущий уровень привелегий задачи) для VxD, ибо по умолчанию он у него наивысший.

Четвертая попытка.Регистры DRx

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

  Для настройки отладки необходимо загрузить в регистр DR7 флаги-описатели типа ловушки: по доступу на чтение/запись/исполнение, размер точки (байт/слово/dword) и т.п. (далее будет подробнее про форматы DRx). Адреса портов ввода-вывода (или памяти) необходимо записать в регистры DR0-DR3. При выполнении условия отладочного прерывания процессор выполнит исключение #1 - debug interrupt. Таким образом можно иметь 4 точки останова по доступу к портам - как раз то, что нужно. Минусом является невозможность работать бок о бок с sice в этом случае: он и такой перехватчик не смогут разделить общий ресурс - int 01h.

  Сказано - сделано. Написав динамический vxd-драйвер, обладающий подобным перехватом портов:

Код (Text):
  1.  
  2. .586p
  3. ; Необходимые инклюды для сборки VxD
  4. include vmm.inc
  5. include vwin32.inc
  6. ...
  7. ;
  8. ; Обрабатываем только сообщение w32_DeviceIoControl
  9. ;
  10. Begin_control_dispatch SER
  11.     Control_Dispatch w32_DeviceIoControl, OnDeviceIoControl
  12. End_control_dispatch SER
  13. ...
  14. ;
  15. ; Секция данных
  16. ;
  17. include log.inc
  18. VxD_LOCKED_DATA_SEG
  19.   Port equ 0378h
  20. ttrap  struc
  21.   offs1  dw  0   ; [0]
  22.   sel    dw  28h ; [2]
  23.   rsrv   db  0   ; [4]
  24.   attr_  db  8fh ; [5]
  25.   offs_h dw  0   ; [6]
  26. ttrap  ends
  27. trap        ttrap
  28. old_trap_01 ttrap  ; Старый описатель ловушки #01
  29. old_trap_UD ttrap
  30. tidt_descr struc
  31.   idt_size dw ? ; размер idt
  32.   lin_addr dd ? ; линейный адрес начала idt
  33. tidt_descr ends
  34. idt_descr tidt_descr
  35. old_trapUD    dd 0 ; Адрес старого обработчика исключения #06
  36. old_Jump_Addr dd 0 ; Адрес команд перехода на инсталлятор #06
  37. ; Буфер лога
  38. LogPtr        dd 0 ; Указатель лог-буфера-его размер
  39. LogPackets    db (MAX_LOG_RECORDS * sizeof(tLogPacket)) dup (?)
  40. ;
  41. ; Инсталлятор обработчика исключения #1
  42. ;
  43.   mov  dword ptr LogPtr,0                                                    
  44.   mov  dword ptr LastLogPtr,0                                                
  45.  
  46. ; Установка обработчика #1 - debug
  47.  
  48. ; Создание дескриптора ловушки в idt
  49.   mov  eax,offset32 TrapPort
  50.   mov  trap.offs1,ax
  51.   shr  eax,16
  52.   mov  trap.offs_h,ax
  53.  
  54. ; Загрузка в idt
  55. ; Получить текущий idt_base
  56.   sidt fword ptr idt_descr
  57.   mov  ebx,dword ptr idt_descr.lin_addr
  58. ; Получить начало описателя #1 - debug
  59.   add  ebx,8
  60.  
  61. ; Установить ловушку #1, сохранив старую
  62.  
  63.   mov  eax,dword ptr trap
  64.   xchg [ebx],eax
  65.   mov  dword ptr old_trap_01,eax
  66.   mov  eax,dword ptr trap+4
  67.   xchg [ebx+4],eax
  68.   mov  dword ptr old_trap_01+4,eax
  69.  
  70. ; Set trap to ports i/o
  71. ; Enable DE flag
  72.   mov  eax,cr4
  73.   or   eax,01000b
  74.   mov  cr4,eax
  75.  
  76. ; Ports set
  77.   xor  ebx,ebx
  78.   mov  bx,Port
  79.   mov  dr0,ebx
  80.   add  ebx,2
  81.   mov  dr1,ebx
  82.   add  ebx,2
  83.   mov  dr2,ebx
  84.   add  ebx,2
  85.   mov  dr3,ebx
  86.  
  87. ; Включение ловушек
  88.   ;        FEDCBA9876543210FEDCBA9876543210
  89.   mov  eax,01100110011001100010011111111111b
  90.   mov  dr7,eax
  91.  ...
  92. ;
  93. ; Обработчик исключения #1
  94. ;
  95. TrapPort proc
  96.   push ebp
  97.   mov  ebp,esp
  98.   push eax
  99.   pushad
  100.   push ds
  101.   push es
  102.   pushfd
  103.   mov  ax,ss
  104.   mov  ds,ax
  105.  
  106. ; Адрес возврата EIP
  107.   mov  ecx,[ebp+4]
  108. ; Адрес возврата CS->ES
  109.   mov  es,word ptr [ebp+8]
  110.  
  111.   ...
  112.  
  113.   popfd
  114.   pop  es
  115.   pop  ds
  116.   popad
  117.   pop  eax
  118.   pop  ebp
  119.   iretd
  120. TrapPort endp
  121.  

  Немного пояснений по вышеприведенному коду. Загруженному драйверу VxD система (VMM) посылает различные сообщения, которые он по своему желанию может обработать. Например, при нажатии кнопки "Пуск" всем VxD придет сообщение THREAD_INIT (~ создана новая нить и драйвер может что-то встроить в нее). Наш VxD обрабатывает из всего набора сообщений (~ 15 шт) одно: w32_DeviceIoControl. Это сообщение будет послано при загрузке с подфункцией DIOC_Open:

Код (Text):
  1.  
  2. BeginProc OnDeviceIoControl
  3.   assume esi:ptr DIOCParams                                                  
  4. .if [esi].dwIoControlCode==DIOC_Open ; Контрольное сообщение ?!              
  5.   ...
  6.  

  Я имею в виду, что мы через esi добираемся до параметра при сообщении w32_DeviceIoControl. Такое сообщение система будет посылать нам всякий раз, когда win32-приложение будет вызвать нас через апи DeviceIoControl, но тогда параметр будет тем, который уже это приложение нам передаст (второй аргумент):

Код (Text):
  1.  
  2.   invoke DeviceIoControl,hVxD,1,addr InBuffer,sizeof InBuffer,NULL,NULL,NULL,NULL
  3.  

  Инсталляция заключается в установке обработчика исключения #1 и инициализации отладочных регистров DRx. Для установки обработчика необходимо встроить дескриптор собственной ловушки в idt - interrupt table. Эта таблица состоит из элементов типа ttrap (выше) (не только - могут быть hardware прерывания, но нам это сейчас не важно). Адрес таблицы idt можно получит так: выгружаем текущий дескриптор idt командой sidt, из него получаем начальный адрес таблицы idt. Далее индексируемся на описатель 1 в ней и меняем его так, чтобы управление передавалось на нашу подпрограмму TrapPort. Загрузка регистра DR7 требует некоторого пояснения (лучше прочесть более детально в книге Зубкова С.В.):

Код (Text):
  1.  
  2. ; Включение ловушек
  3.   ;        FEDCBA9876543210FEDCBA9876543210
  4.   mov  eax,01100110011001100010011111111111b
  5.   mov  dr7,eax
  6.  
  7.   Биты 31-30: 01 - размер точки останова: 2 байта
  8.   Биты 29-28: 10 - тип точки: доступ к портам i/o
  9.   Биты 27-16: аналогичны предидущим - другие точки останова тоже на i/o
  10.   Биты 15-14: 00
  11.   бит 13: бит GD - включает режим, в котором любое обращение к
  12.                    любому отладочному регистру, даже из кольца защиты 0,
  13.                    вызывает исключение #DB
  14.   биты 12 - 10: 001
  15.   бит 9: бит GE - если этот бит 0, точка останова по обращению к
  16.                    данным может не сработать или сработать на несколько
  17.                    команд позже, так что лучше всегда сохранять его равным 1
  18.   бит 7: бит G3 - точка останова 3 включена
  19.   ...
  20.  

  Теперь обработчик исключения #1 может получить управление и, например, записать в лог обмен приложения с портами ввода-вывода.

  Тестирование на собственных "кошках": OK

  Тестирование на защищенном приложении: нет перехвата !

  Но почему ?! Почему я могу перехватить работу с портами из другого VxD, но не из защищенного ? Смотрим внимательнее на инициализацию DR7: никто не может помешать приложению (VxD защиты обладает ВСЕМИ правами) записать в DR7 ноль и никаких прерываний больше не будет. Достаем дизассемблер - hiew (точнее, hiew32) и открываем в нем hasplit.vxd:

Код (Text):
  1.  
  2. ; Если бит не 0, мусорим dr7 нулем
  3. xx4C: 50             push        eax
  4. xx4D: 2BC0           sub         eax,eax
  5. xx4F: 0F23F8         mov         dr7,eax
  6. xx52: 58             pop         eax
  7.  

  Ага, нам мешают ловить прерывания :smile3: Но отсюда сразу же вытекает следующая проверка:

  Найти все такие команды и забить nop'ами: bad result

  Так выяснилось, что hasplit контролирует собственную модификацию (видимо, динамические проверки crc и т.п.). Пока получается замкнутый овал: нельзя трейсить обращения к портам, пока нам мешает маленький драйвер, но сам его трогать нельзя дабы убрать сброс отладки.

DeviceIOControl

  Однако тут я сделал паузу но не скушал "твикс", а обратил внимание на то, что я пока был подобен солдату, бездумно кидающемуся на пулеметную точку вместо того, чтобы обойти ее сбоку и спокойно сделать head-shoot.

  Зачем пытаться имитировать отклик порта, если можно перехватить "сеанс связи" приложения (prog.exe) с драйвером (драйверами). Единственный способ общения приложения с загруженным им драйвером VxD - это апи DeviceIOControl и больше ничего. Ну если не извращаться и не патчить всякий раз статические данные VxD и запускать его несколько раз подряд.

  Перехват апи - это легко и приятно. По крайней мере, в сравнении с драйверами. На тему перехвата апи не буду распространяться, отошлю Вас к замечательной статье 90210 "техника перхвата апи". Скажу лишь, что я использовал метод, открытый Vecna (вызов первой экспортируемой kernel32.dll функции VxDCall0).

  Таким образом мне удалось перехватить обмен через DeviceIOControl с драйверами:

MsgDeviceIOControlHook:
hVxD:00000030 SecParam: 9C402450 InBufferLen: 00000006 nOutBufferSize: 00000006 lpOverlapped: 00000000
InBuffer: 00 00 00 00 00 00
OutBufbefore: 00 00 00 00 00 00
VxDAnswerEAX: 00000001
(BytesReturned: 00000000):
Out buffer changed !
VxDAnswerMsg: 00 00 FA FA 19 03


MsgDeviceIOControlHook:
hVxD:00000034 SecParam: 00000003 InBufferLen: 00000000 nOutBufferSize: 000015E8 lpOverlapped: 00000000
InBuffer:
OutBufbefore: C7 85 8F 17 00 00 00 00 00 00 8D 95 F1 18 00 00 8D BD 73 17 00 00 B8 07 00 00 40 66 8C CB 8B D2 B9 6F 01 00 00 66 8C CE 8B FF FE EF 00 01 02 03 04 05 8D 95 F1 18 00 00 8D BD 74 17 00 00 B8 07 00 00 40 66 8C CB 8B D2 B9 6F 01 00 00 66 8C CE 8B FF FE EF 00 01 02 03 04 05 8D 95 F1 18 00 00 8D BD 75 17 00 00 B8 07 00 00 40 66 8C CB 8B D2 B9 6F 01 00 00 66 8C CE 8B FF FE EF 00 01 02 03 04 05 8D 95 F1 18 00 00 8D BD 76 17 00 00 B8 07 00 00 40 66 8C CB 8B D2 B9 6F 01 00 00 66 8C CE 8B FF FE EF 00 01 02 03 04 05 8B 8D 73 17 00 00 8B 9D 8F 17 00 00 8B 9C 1D 77 17 00 00 02 D9 C1 CB 08 C1 C9 08 02 D9 C1 CB 08 C1 C9 08 02 D9 C1 CB 08 C1 C9 08 02 D9 C1 CB 08 C1 C9 08 03 DD FF E3 57 56 52 51 53 50 33 C9 33 FF 66 8B CB 66 83 F9 00 75 04 66 B9 E8 03 66 8B F0 FC 66 33 FF 66 47 02 FB 80 C3 05 22 C3 32 D0 E2 F3 8A CA 58 5B 59 5A 5E 5F 57 56 52 51 53 50 33 C9 33 FF 66 8B C9 66 83 F9 00 75 04 66 B9 E8 03 66 8B F3 FC 66 33 FF 66 47 02 FB 80 C3 05 22 C3 32 D0 E2 F3 8A C2 58 5B 59 5A 5E 5F 8D 95 46 23 00 00 8D BD 46 23 00 00 B8 06 00 00 40 66 8C CB 8B D2 B9 9F 01 00 00 66 8C CE 8B FF FE EF 00 01 02 03 04 05 21 9A AA AA AE CC 62 16 72 F3 7C 4B AA AA 31 9F 8A AA AA 45 54 AA BA 8A 9A EA FA 92 F2 52 DB AA AA EA 72 F3 AC 0B AA AA 72 71 9D DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 74 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 AC 0B AA AA 72 71 ED DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 74 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 AC 0B AA AA 72 71 FD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 74 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 AC 0B AA AA 72 71 CD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 74 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 12 72 9D DB AA AA 12 73 52 DB AA AA 12 63 7B DD DB AA AA 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 9A 77 55 94 DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 04 2F 1F 3F 0F 4F 5F 72 F3 A6 A8 AA AA 72 71 A6 A8 AA AA 21 CA AA AA AE CC 62 16 12 87 31 C2 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 21 9A AA AA AE CC 62 16 72 F3 A6 A8 AA AA 31 C2 8A AA AA 45 54 AA BA 8A 9A EA FA 92 F2 52 DB AA AA EA 72 F3 7E 6B AA AA 72 71 9D DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 A8 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 7E 6B AA AA 72 71 ED DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 A8 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 7E 6B AA AA 72 71 FD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 A8 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 7E 6B AA AA 72 71 CD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 A8 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 12 72 9D DB AA AA 12 73 52 DB AA AA 12 63 7B DD DB AA AA 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 9A 77 55 94 DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 04 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 84 2F 1F 3F 0F 4F 5F 72 F3 F4 E8 AA AA 72 71 F4 E8 AA AA 21 CA AA AA AE CC 62 16 12 87 31 21 3A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 21 9A AA AA AE CC 62 16 72 F3 CE 98 AA AA 31 53 BA AA AA 45 54 AA BA 8A 9A EA FA 92 F2 52 DB AA AA EA 72 F3 7C 4B AA AA 72 71 9D DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 9F 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 7C 4B AA AA 72 71 ED DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 9F 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 7C 4B AA AA 72 71 FD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 9F 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 7C 4B AA AA 72 71 CD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 9F 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 12 72 9D DB AA AA 12 73 52 DB AA AA 12 63 7B DD DB AA AA 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 9A 77 55 94 DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 04 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 84 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 05 2F 1F 3F 0F 4F 5F 72 F3 AC 0B AA AA 72 71 AC 0B AA AA 21 CA AA AA AE CC 62 16 12 87 31 74 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 92 F2 52 DB AA AA EA 21 9A AA AA AE CC 62 16 72 F3 AC 0B AA AA 31 74 BA AA AA 45 54 AA BA 8A 9A EA FA 72 F3 A6 A8 AA AA 72 71 9D DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 C2 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 A6 A8 AA AA 72 71 ED DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 C2 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 A6 A8 AA AA 72 71 FD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 C2 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 A6 A8 AA AA 72 71 CD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 C2 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 12 72 9D DB AA AA 12 73 52 DB AA AA 12 63 7B DD DB AA AA 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 9A 77 55 94 DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 04 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 84 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 05 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 84 2F 1F 3F 0F 4F 5F 72 F3 7E 6B AA AA 72 71 7E 6B AA AA 21 CA AA AA AE CC 62 16 12 87 31 A8 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 92 F2 52 DB AA AA EA 72 F3 CE 98 AA AA 72 71 9D DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 53 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 CE 98 AA AA 72 71 ED DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 53 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 CE 98 AA AA 72 71 FD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 53 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 CE 98 AA AA 72 71 CD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 53 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 12 72 9D DB AA AA 12 73 52 DB AA AA 12 63 7B DD DB AA AA 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 9A 77 55 94 DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F 72 F3 7C 4B AA AA 72 71 7C 4B AA AA 21 CA AA AA AE CC 62 16 12 87 31 9F 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 21 BA AA AA AE 45 54 AA BA 8A 9A EA FA 21 9A AA AA AE CC 62 16 72 F3 7E 6B AA AA 31 A8 8A AA AA 45 54 AA BA 8A 9A EA FA BC FF CF DF CC 12 F1 EF 8A AA AA CC 12 71 8F 8A AA AA CC 12 72 B5 BA AA AA CC 12 73 B7 BA AA AA 02 35 CC 12 F3 8A 8A AA AA CC 12 72 AA 8A AA AA CC B2 71 B5 BA AA AA A5 AA 5A E2 97 FA AA AA D6 F2 7F 6A AA AA BA AA AA AA D6 F2 BC 6A AA AA BA AA AA AA AF CF 72 F1 77 BA AA AA 12 CA 32 F2 FC 6A AA AA 4F 2F D6 F2 3C 6A AA AA 2E AA AA AA D6 F2 7C 6A AA AA 28 AA AA AA 21 85 DB AA AA CC 32 F2 BD 6A AA AA 22 71 9D 6A AA AA CC 12 F2 64 BA AA AA 32 F2 FD 6A AA AA 22 73 3D 6A AA AA 32 72 7D 6A AA AA 32 F3 B2 6A AA AA 32 71 F2 6A AA AA 32 F1 32 6A AA AA 12 F2 50 6A AA AA 32 F2 73 6A AA AA CC D6 F2 90 6A AA AA EA AA CC 92 71 B5 BA AA AA 28 8D 5F CC 92 71 B5 BA AA AA A9 CD 8F CC 92 71 B5 BA AA AA F9 ED 2E CC 92 71 B5 BA AA AA E9 ED 49 CC 92 71 B5 BA AA AA FF ED E9 CC 92 71 B5 BA AA AA AC ED 08 CC 92 71 B5 BA AA AA EC ED A8 CC 92 71 B5 BA AA AA 2D ED CB CC 92 71 B5 BA AA AA 3D ED 6A CC 92 71 B5 BA AA AA 7D ED 8A 14 9A 25 14 BA 35 9D 8A 14 AA 92 7D 57 0A ED 1A 92 7D 57 1A ED FA 34 E2 9A AA AA CC 12 73 B5 BA AA AA A2 15 99 ED 8E A2 15 89 5A E2 67 AA AA AA A2 15 F9 ED E9 A2 15 E9 5A E2 46 AA AA AA A2 15 AC ED C8 A2 15 FF ED B8 A2 15 6E ED 6B A2 15 7E 5A E2 C1 AA AA AA A2 15 29 ED 4A A2 15 D9 5A E2 20 AA AA AA 34 E6 BA AA AA 12 F2 32 6A AA AA 32 F2 33 6A AA AA 12 F2 73 6A AA AA 12 A5 51 0E 2A AA AA 9A 75 CC 92 71 B5 BA AA AA 28 8D 5F CC 92 71 B5 BA AA AA A9 CD 8F CC 92 71 B5 BA AA AA F9 ED 2E CC 92 71 B5 BA AA AA E9 ED 49 CC 92 71 B5 BA AA AA FF ED E9 CC 92 71 B5 BA AA AA AC ED 08 CC 92 71 B5 BA AA AA EC ED A8 CC 92 71 B5 BA AA AA 2D ED CB CC 92 71 B5 BA AA AA 3D ED 6A CC 92 71 B5 BA AA AA 7D ED 8A 14 9A 25 14 BA 35 9D 8A 14 AA 92 D6 8A 12 72 33 6A AA AA 21 8A AA AA AA CC D5 B4 12 26 95 E0 34 C2 AA AA AA 12 F2 32 6A AA AA 32 F2 33 6A AA AA 51 0E 2A AA AA 9A 75 CC 92 71 B5 BA AA AA 28 8D 5F CC 92 71 B5 BA AA AA A9 CD 8F CC 92 71 B5 BA AA AA F9 ED 2E CC 92 71 B5 BA AA AA E9 ED 49 CC 92 71 B5 BA AA AA FF ED E9 CC 92 71 B5 BA AA AA AC ED 08 CC 92 71 B5 BA AA AA EC ED A8 CC 92 71 B5 BA AA AA 2D ED CB CC 92 71 B5 BA AA AA 3D ED 6A CC 92 71 B5 BA AA AA 7D ED 8A 14 9A 25 14 BA 35 9D 8A 14 AA 34 21 AA AA AA CC 92 71 B5 BA AA AA 28 8D 5F CC 92 71 B5 BA AA AA A9 CD 8F CC 92 71 B5 BA AA AA F9 ED 2E CC 92 71 B5 BA AA AA E9 ED 49 CC 92 71 B5 BA AA AA FF ED E9 CC 92 71 B5 BA AA AA AC ED 08 CC 92 71 B5 BA AA AA EC ED A8 CC 92 71 B5 BA AA AA 2D ED CB CC 92 71 B5 BA AA AA 3D ED 6A CC 92 71 B5 BA AA AA 7D ED 8A 14 9A 25 14 BA 35 9D 8A 14 AA CC 12 73 EF 8A AA AA B2 94 55 55 AA AA 9E CC 55 F1 35 8A AA AA 21 8A AA AA AA CC D5 94 CC 32 F2 35 8A AA AA CC 52 F2 35 8A AA AA 14 7B D6 F2 33 6A AA AA AA AA AA AA D6 F2 73 6A AA AA AA AA AA AA CC D6 F2 B0 6A AA AA AA AA D6 F2 DF 55 55 55 2E AA AA AA CC 92 71 B5 BA AA AA 28 8D 5F CC 92 71 B5 BA AA AA A9 CD 8F CC 92 71 B5 BA AA AA F9 ED 2E CC 92 71 B5 BA AA AA E9 ED 49 CC 92 71 B5 BA AA AA FF ED E9 CC 92 71 B5 BA AA AA AC ED 08 CC 92 71 B5 BA AA AA EC ED A8 CC 92 71 B5 BA AA AA 2D ED CB CC 92 71 B5 BA AA AA 3D ED 6A CC 92 71 B5 BA AA AA 7D ED 8A 14 9A 25 14 BA 35 5A 82 17 AA AA AA 72 71 7F 6A AA AA AC 92 D6 EB 72 F1 56 38 AA AA 32 F1 94 BA AA AA 21 EA AA AA AE CC 62 17 12 D7 31 28 AA AA AA CC 62 46 12 71 94 BA AA AA 45 54 AA BA 8A 9A EA FA DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F BC 72 F2 7F 6A AA AA 34 6F BA AA AA CC 12 73 B5 BA AA AA A2 15 99 ED 99 A2 15 89 ED 48 A2 15 F9 ED 38 A2 15 E9 ED E8 A2 15 AC ED 5B A2 15 FF ED 0B D1 BA A2 15 6E ED 9B A2 15 7E ED 4A D1 AA A2 15 29 ED DA A2 15 D9 ED 8A 14 6B 12 F3 73 6A AA AA 99 36 CC 12 72 EF 8A AA AA A2 55 BA ED 8A 9A 36 55 F3 5A 55 55 55 72 71 7F 6A AA AA AC 72 F3 7F 6A AA AA 31 2E AA AA AA 55 F3 5A 55 55 55 92 D6 EB 72 F1 CB 18 AA AA 32 F1 94 BA AA AA 21 EA AA AA AE CC 62 17 12 D7 31 28 AA AA AA CC 62 46 12 71 94 BA AA AA 45 54 AA BA 8A 9A EA FA DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F BC 72 F2 7F 6A AA AA 14 2B FF 55 F3 D7 45 55 55 7F D6 F2 DF 55 55 55 EA AA AA AA 72 F2 F0 6A AA AA 32 FE 17 FF 55 FF E5 7F CC 12 73 B5 BA AA AA A2 15 99 ED 99 A2 15 89 ED 48 A2 15 F9 ED 38 A2 15 E9 ED E8 A2 15 AC ED 5B A2 15 FF ED 0B D1 BA A2 15 6E ED 9B A2 15 7E ED 4A D1 AA A2 15 29 ED DA A2 15 D9 ED 8A 14 08 12 F2 50 6A AA AA 32 F2 73 6A AA AA 99 A6 12 F3 73 6A AA AA 99 36 CC 12 72 EF 8A AA AA A2 55 BA ED 8A 9A 36 55 F3 1A 55 55 55 CC D6 F2 2E 2A AA AA AA AA 92 25 AA ED 7A 12 26 99 A6 99 17 99 87 34 D7 8A AA AA 92 7D 57 0A ED 1A 92 7D 57 1A ED FA 34 FE BA AA AA CC 92 71 B5 BA AA AA 28 8D 5F CC 92 71 B5 BA AA AA A9 CD 8F CC 92 71 B5 BA AA AA F9 ED 2E CC 92 71 B5 BA AA AA E9 ED 49 CC 92 71 B5 BA AA AA FF ED E9 CC 92 71 B5 BA AA AA AC ED 08 CC 92 71 B5 BA AA AA EC ED A8 CC 92 71 B5 BA AA AA 2D ED CB CC 92 71 B5 BA AA AA 3D ED 6A CC 92 71 B5 BA AA AA 7D ED 8A 14 9A 25 14 BA 35 5A 82 F7 AA AA AA 72 71 7F 6A AA AA AC 92 D6 EB 72 F1 9B 78 AA AA 32 F1 94 BA AA AA 21 CA AA AA AE CC 62 17 12 D7 31 28 AA AA AA CC 62 46 12 71 94 BA AA AA 45 54 AA BA 8A 9A EA FA DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F BC 34 B4 AA AA AA 72 71 7F 6A AA AA AC 92 D6 EB 72 F1 24 78 AA AA 32 F1 94 BA AA AA 21 CA AA AA AE CC 62 17 12 D7 31 28 AA AA AA CC 62 46 12 71 94 BA AA AA 45 54 AA BA 8A 9A EA FA DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F 72 F3 7F 6A AA AA 31 2E AA AA AA 55 F3 1A 55 55 55 BC 92 7D 57 0A ED 2A 92 7D 57 1A ED 8A 14 0D CC 12 73 B5 BA AA AA 14 BD A2 15 89 ED BB A2 15 E9 ED 6A A2 15 7E ED DA A2 15 D9 ED 8A 14 1F 51 0E 2A AA AA 9A 75 CC 12 73 EF 8A AA AA B2 94 55 55 AA AA 9E CC 55 F1 35 8A AA AA 21 8A AA AA AA CC D5 94 CC 32 F2 35 8A AA AA CC 52 F2 35 8A AA AA 12 71 50 6A AA AA 41 0E 2A AA AA 9A F5 92 C6 8A CC 12 72 EF 8A AA AA B2 B4 55 55 AA AA 21 8A AA AA AA CC D5 B4 12 26 95 E0 12 F2 F2 6A AA AA 12 73 32 6A AA AA 12 72 72 6A AA AA 12 F3 B3 6A AA AA 5F 4F 7F 60 B8 02 00 00 40 FE EF 00 01 02 03 04 05 B8 03 00 00 40 66 8C CB 8D 95 E5 24 00 00 B9 B8 09 00 00 FE EF 00 01 02 03 04 05 8D 95 F1 18 00 00 B9 E8 15 00 00 FF 95 0B FF FF FF 61 C3
VxDAnswerEAX: 00000001
(BytesReturned: 00000000):
VxDAnswerMsg: C7 85 8F 17 00 00 00 00 00 00 8D 95 F1 18 00 00 8D BD 73 17 00 00 B8 07 00 00 40 66 8C CB 8B D2 B9 6F 01 00 00 66 8C CE 8B FF FE EF 00 01 02 03 04 05 8D 95 F1 18 00 00 8D BD 74 17 00 00 B8 07 00 00 40 66 8C CB 8B D2 B9 6F 01 00 00 66 8C CE 8B FF FE EF 00 01 02 03 04 05 8D 95 F1 18 00 00 8D BD 75 17 00 00 B8 07 00 00 40 66 8C CB 8B D2 B9 6F 01 00 00 66 8C CE 8B FF FE EF 00 01 02 03 04 05 8D 95 F1 18 00 00 8D BD 76 17 00 00 B8 07 00 00 40 66 8C CB 8B D2 B9 6F 01 00 00 66 8C CE 8B FF FE EF 00 01 02 03 04 05 8B 8D 73 17 00 00 8B 9D 8F 17 00 00 8B 9C 1D 77 17 00 00 02 D9 C1 CB 08 C1 C9 08 02 D9 C1 CB 08 C1 C9 08 02 D9 C1 CB 08 C1 C9 08 02 D9 C1 CB 08 C1 C9 08 03 DD FF E3 57 56 52 51 53 50 33 C9 33 FF 66 8B CB 66 83 F9 00 75 04 66 B9 E8 03 66 8B F0 FC 66 33 FF 66 47 02 FB 80 C3 05 22 C3 32 D0 E2 F3 8A CA 58 5B 59 5A 5E 5F 57 56 52 51 53 50 33 C9 33 FF 66 8B C9 66 83 F9 00 75 04 66 B9 E8 03 66 8B F3 FC 66 33 FF 66 47 02 FB 80 C3 05 22 C3 32 D0 E2 F3 8A C2 58 5B 59 5A 5E 5F 8D 95 46 23 00 00 8D BD 46 23 00 00 B8 06 00 00 40 66 8C CB 8B D2 B9 9F 01 00 00 66 8C CE 8B FF FE EF 00 01 02 03 04 05 21 9A AA AA AE CC 62 16 72 F3 7C 4B AA AA 31 9F 8A AA AA 45 54 AA BA 8A 9A EA FA 92 F2 52 DB AA AA EA 72 F3 AC 0B AA AA 72 71 9D DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 74 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 AC 0B AA AA 72 71 ED DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 74 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 AC 0B AA AA 72 71 FD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 74 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 AC 0B AA AA 72 71 CD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 74 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 12 72 9D DB AA AA 12 73 52 DB AA AA 12 63 7B DD DB AA AA 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 9A 77 55 94 DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 04 2F 1F 3F 0F 4F 5F 72 F3 A6 A8 AA AA 72 71 A6 A8 AA AA 21 CA AA AA AE CC 62 16 12 87 31 C2 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 21 9A AA AA AE CC 62 16 72 F3 A6 A8 AA AA 31 C2 8A AA AA 45 54 AA BA 8A 9A EA FA 92 F2 52 DB AA AA EA 72 F3 7E 6B AA AA 72 71 9D DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 A8 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 7E 6B AA AA 72 71 ED DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 A8 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 7E 6B AA AA 72 71 FD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 A8 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 7E 6B AA AA 72 71 CD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 A8 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 12 72 9D DB AA AA 12 73 52 DB AA AA 12 63 7B DD DB AA AA 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 9A 77 55 94 DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 04 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 84 2F 1F 3F 0F 4F 5F 72 F3 F4 E8 AA AA 72 71 F4 E8 AA AA 21 CA AA AA AE CC 62 16 12 87 31 21 3A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 21 9A AA AA AE CC 62 16 72 F3 CE 98 AA AA 31 53 BA AA AA 45 54 AA BA 8A 9A EA FA 92 F2 52 DB AA AA EA 72 F3 7C 4B AA AA 72 71 9D DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 9F 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 7C 4B AA AA 72 71 ED DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 9F 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 7C 4B AA AA 72 71 FD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 9F 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 7C 4B AA AA 72 71 CD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 9F 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 12 72 9D DB AA AA 12 73 52 DB AA AA 12 63 7B DD DB AA AA 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 9A 77 55 94 DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 04 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 84 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 05 2F 1F 3F 0F 4F 5F 72 F3 AC 0B AA AA 72 71 AC 0B AA AA 21 CA AA AA AE CC 62 16 12 87 31 74 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 92 F2 52 DB AA AA EA 21 9A AA AA AE CC 62 16 72 F3 AC 0B AA AA 31 74 BA AA AA 45 54 AA BA 8A 9A EA FA 72 F3 A6 A8 AA AA 72 71 9D DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 C2 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 A6 A8 AA AA 72 71 ED DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 C2 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 A6 A8 AA AA 72 71 FD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 C2 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 A6 A8 AA AA 72 71 CD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 C2 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 12 72 9D DB AA AA 12 73 52 DB AA AA 12 63 7B DD DB AA AA 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 9A 77 55 94 DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 04 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 84 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 05 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 84 2F 1F 3F 0F 4F 5F 72 F3 7E 6B AA AA 72 71 7E 6B AA AA 21 CA AA AA AE CC 62 16 12 87 31 A8 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 92 F2 52 DB AA AA EA 72 F3 CE 98 AA AA 72 71 9D DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 53 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 CE 98 AA AA 72 71 ED DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 53 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 CE 98 AA AA 72 71 FD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 53 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 72 F3 CE 98 AA AA 72 71 CD DB AA AA 21 DA AA AA AE CC 62 16 12 87 31 53 BA AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 12 72 9D DB AA AA 12 73 52 DB AA AA 12 63 7B DD DB AA AA 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 8A 37 B6 16 2A B6 36 2A 9A 77 55 94 DF CF 8F BF 9F AF 99 36 99 55 CC 12 16 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F 72 F3 7C 4B AA AA 72 71 7C 4B AA AA 21 CA AA AA AE CC 62 16 12 87 31 9F 8A AA AA CC 62 46 12 55 45 54 AA BA 8A 9A EA FA 21 BA AA AA AE 45 54 AA BA 8A 9A EA FA 21 9A AA AA AE CC 62 16 72 F3 7E 6B AA AA 31 A8 8A AA AA 45 54 AA BA 8A 9A EA FA BC FF CF DF CC 12 F1 EF 8A AA AA CC 12 71 8F 8A AA AA CC 12 72 B5 BA AA AA CC 12 73 B7 BA AA AA 02 35 CC 12 F3 8A 8A AA AA CC 12 72 AA 8A AA AA CC B2 71 B5 BA AA AA A5 AA 5A E2 97 FA AA AA D6 F2 7F 6A AA AA BA AA AA AA D6 F2 BC 6A AA AA BA AA AA AA AF CF 72 F1 77 BA AA AA 12 CA 32 F2 FC 6A AA AA 4F 2F D6 F2 3C 6A AA AA 2E AA AA AA D6 F2 7C 6A AA AA 28 AA AA AA 21 85 DB AA AA CC 32 F2 BD 6A AA AA 22 71 9D 6A AA AA CC 12 F2 64 BA AA AA 32 F2 FD 6A AA AA 22 73 3D 6A AA AA 32 72 7D 6A AA AA 32 F3 B2 6A AA AA 32 71 F2 6A AA AA 32 F1 32 6A AA AA 12 F2 50 6A AA AA 32 F2 73 6A AA AA CC D6 F2 90 6A AA AA EA AA CC 92 71 B5 BA AA AA 28 8D 5F CC 92 71 B5 BA AA AA A9 CD 8F CC 92 71 B5 BA AA AA F9 ED 2E CC 92 71 B5 BA AA AA E9 ED 49 CC 92 71 B5 BA AA AA FF ED E9 CC 92 71 B5 BA AA AA AC ED 08 CC 92 71 B5 BA AA AA EC ED A8 CC 92 71 B5 BA AA AA 2D ED CB CC 92 71 B5 BA AA AA 3D ED 6A CC 92 71 B5 BA AA AA 7D ED 8A 14 9A 25 14 BA 35 9D 8A 14 AA 92 7D 57 0A ED 1A 92 7D 57 1A ED FA 34 E2 9A AA AA CC 12 73 B5 BA AA AA A2 15 99 ED 8E A2 15 89 5A E2 67 AA AA AA A2 15 F9 ED E9 A2 15 E9 5A E2 46 AA AA AA A2 15 AC ED C8 A2 15 FF ED B8 A2 15 6E ED 6B A2 15 7E 5A E2 C1 AA AA AA A2 15 29 ED 4A A2 15 D9 5A E2 20 AA AA AA 34 E6 BA AA AA 12 F2 32 6A AA AA 32 F2 33 6A AA AA 12 F2 73 6A AA AA 12 A5 51 0E 2A AA AA 9A 75 CC 92 71 B5 BA AA AA 28 8D 5F CC 92 71 B5 BA AA AA A9 CD 8F CC 92 71 B5 BA AA AA F9 ED 2E CC 92 71 B5 BA AA AA E9 ED 49 CC 92 71 B5 BA AA AA FF ED E9 CC 92 71 B5 BA AA AA AC ED 08 CC 92 71 B5 BA AA AA EC ED A8 CC 92 71 B5 BA AA AA 2D ED CB CC 92 71 B5 BA AA AA 3D ED 6A CC 92 71 B5 BA AA AA 7D ED 8A 14 9A 25 14 BA 35 9D 8A 14 AA 92 D6 8A 12 72 33 6A AA AA 21 8A AA AA AA CC D5 B4 12 26 95 E0 34 C2 AA AA AA 12 F2 32 6A AA AA 32 F2 33 6A AA AA 51 0E 2A AA AA 9A 75 CC 92 71 B5 BA AA AA 28 8D 5F CC 92 71 B5 BA AA AA A9 CD 8F CC 92 71 B5 BA AA AA F9 ED 2E CC 92 71 B5 BA AA AA E9 ED 49 CC 92 71 B5 BA AA AA FF ED E9 CC 92 71 B5 BA AA AA AC ED 08 CC 92 71 B5 BA AA AA EC ED A8 CC 92 71 B5 BA AA AA 2D ED CB CC 92 71 B5 BA AA AA 3D ED 6A CC 92 71 B5 BA AA AA 7D ED 8A 14 9A 25 14 BA 35 9D 8A 14 AA 34 21 AA AA AA CC 92 71 B5 BA AA AA 28 8D 5F CC 92 71 B5 BA AA AA A9 CD 8F CC 92 71 B5 BA AA AA F9 ED 2E CC 92 71 B5 BA AA AA E9 ED 49 CC 92 71 B5 BA AA AA FF ED E9 CC 92 71 B5 BA AA AA AC ED 08 CC 92 71 B5 BA AA AA EC ED A8 CC 92 71 B5 BA AA AA 2D ED CB CC 92 71 B5 BA AA AA 3D ED 6A CC 92 71 B5 BA AA AA 7D ED 8A 14 9A 25 14 BA 35 9D 8A 14 AA CC 12 73 EF 8A AA AA B2 94 55 55 AA AA 9E CC 55 F1 35 8A AA AA 21 8A AA AA AA CC D5 94 CC 32 F2 35 8A AA AA CC 52 F2 35 8A AA AA 14 7B D6 F2 33 6A AA AA AA AA AA AA D6 F2 73 6A AA AA AA AA AA AA CC D6 F2 B0 6A AA AA AA AA D6 F2 DF 55 55 55 2E AA AA AA CC 92 71 B5 BA AA AA 28 8D 5F CC 92 71 B5 BA AA AA A9 CD 8F CC 92 71 B5 BA AA AA F9 ED 2E CC 92 71 B5 BA AA AA E9 ED 49 CC 92 71 B5 BA AA AA FF ED E9 CC 92 71 B5 BA AA AA AC ED 08 CC 92 71 B5 BA AA AA EC ED A8 CC 92 71 B5 BA AA AA 2D ED CB CC 92 71 B5 BA AA AA 3D ED 6A CC 92 71 B5 BA AA AA 7D ED 8A 14 9A 25 14 BA 35 5A 82 17 AA AA AA 72 71 7F 6A AA AA AC 92 D6 EB 72 F1 56 38 AA AA 32 F1 94 BA AA AA 21 EA AA AA AE CC 62 17 12 D7 31 28 AA AA AA CC 62 46 12 71 94 BA AA AA 45 54 AA BA 8A 9A EA FA DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F BC 72 F2 7F 6A AA AA 34 6F BA AA AA CC 12 73 B5 BA AA AA A2 15 99 ED 99 A2 15 89 ED 48 A2 15 F9 ED 38 A2 15 E9 ED E8 A2 15 AC ED 5B A2 15 FF ED 0B D1 BA A2 15 6E ED 9B A2 15 7E ED 4A D1 AA A2 15 29 ED DA A2 15 D9 ED 8A 14 6B 12 F3 73 6A AA AA 99 36 CC 12 72 EF 8A AA AA A2 55 BA ED 8A 9A 36 55 F3 5A 55 55 55 72 71 7F 6A AA AA AC 72 F3 7F 6A AA AA 31 2E AA AA AA 55 F3 5A 55 55 55 92 D6 EB 72 F1 CB 18 AA AA 32 F1 94 BA AA AA 21 EA AA AA AE CC 62 17 12 D7 31 28 AA AA AA CC 62 46 12 71 94 BA AA AA 45 54 AA BA 8A 9A EA FA DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F BC 72 F2 7F 6A AA AA 14 2B FF 55 F3 D7 45 55 55 7F D6 F2 DF 55 55 55 EA AA AA AA 72 F2 F0 6A AA AA 32 FE 17 FF 55 FF E5 7F CC 12 73 B5 BA AA AA A2 15 99 ED 99 A2 15 89 ED 48 A2 15 F9 ED 38 A2 15 E9 ED E8 A2 15 AC ED 5B A2 15 FF ED 0B D1 BA A2 15 6E ED 9B A2 15 7E ED 4A D1 AA A2 15 29 ED DA A2 15 D9 ED 8A 14 08 12 F2 50 6A AA AA 32 F2 73 6A AA AA 99 A6 12 F3 73 6A AA AA 99 36 CC 12 72 EF 8A AA AA A2 55 BA ED 8A 9A 36 55 F3 1A 55 55 55 CC D6 F2 2E 2A AA AA AA AA 92 25 AA ED 7A 12 26 99 A6 99 17 99 87 34 D7 8A AA AA 92 7D 57 0A ED 1A 92 7D 57 1A ED FA 34 FE BA AA AA CC 92 71 B5 BA AA AA 28 8D 5F CC 92 71 B5 BA AA AA A9 CD 8F CC 92 71 B5 BA AA AA F9 ED 2E CC 92 71 B5 BA AA AA E9 ED 49 CC 92 71 B5 BA AA AA FF ED E9 CC 92 71 B5 BA AA AA AC ED 08 CC 92 71 B5 BA AA AA EC ED A8 CC 92 71 B5 BA AA AA 2D ED CB CC 92 71 B5 BA AA AA 3D ED 6A CC 92 71 B5 BA AA AA 7D ED 8A 14 9A 25 14 BA 35 5A 82 F7 AA AA AA 72 71 7F 6A AA AA AC 92 D6 EB 72 F1 9B 78 AA AA 32 F1 94 BA AA AA 21 CA AA AA AE CC 62 17 12 D7 31 28 AA AA AA CC 62 46 12 71 94 BA AA AA 45 54 AA BA 8A 9A EA FA DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F BC 34 B4 AA AA AA 72 71 7F 6A AA AA AC 92 D6 EB 72 F1 24 78 AA AA 32 F1 94 BA AA AA 21 CA AA AA AE CC 62 17 12 D7 31 28 AA AA AA CC 62 46 12 71 94 BA AA AA 45 54 AA BA 8A 9A EA FA DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 95 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 06 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 26 CC 92 35 AA FD EA CC 31 24 9A CC 12 B5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 86 2F 1F 3F 0F 4F 5F DF CF 8F BF 9F AF 99 36 99 55 CC 12 36 CC 92 35 AA FD EA CC 31 24 9A CC 12 A5 65 CC 99 55 CC DE 8A 15 A2 96 FA 88 96 89 A7 84 95 02 07 2F 1F 3F 0F 4F 5F 72 F3 7F 6A AA AA 31 2E AA AA AA 55 F3 1A 55 55 55 BC 92 7D 57 0A ED 2A 92 7D 57 1A ED 8A 14 0D CC 12 73 B5 BA AA AA 14 BD A2 15 89 ED BB A2 15 E9 ED 6A A2 15 7E ED DA A2 15 D9 ED 8A 14 1F 51 0E 2A AA AA 9A 75 CC 12 73 EF 8A AA AA B2 94 55 55 AA AA 9E CC 55 F1 35 8A AA AA 21 8A AA AA AA CC D5 94 CC 32 F2 35 8A AA AA CC 52 F2 35 8A AA AA 12 71 50 6A AA AA 41 0E 2A AA AA 9A F5 92 C6 8A CC 12 72 EF 8A AA AA B2 B4 55 55 AA AA 21 8A AA AA AA CC D5 B4 12 26 95 E0 12 F2 F2 6A AA AA 12 73 32 6A AA AA 12 72 72 6A AA AA 12 F3 B3 6A AA AA 5F 4F 7F 60 B8 02 00 00 40 FE EF 00 01 02 03 04 05 B8 03 00 00 40 66 8C CB 8D 95 E5 24 00 00 B9 B8 09 00 00 FE EF 00 01 02 03 04 05 8D 95 F1 18 00 00 B9 E8 15 00 00 FF 95 0B FF FF FF 61 C3


MsgDeviceIOControlHook:
hVxD:00000034 SecParam: 00000003 InBufferLen: 00000000 nOutBufferSize: 00000048 lpOverlapped: 00000000
InBuffer:
OutBufbefore: 01 00 00 00 01 00 00 00 68 73 68 6C 48 00 00 00 28 00 00 00 F2 17 05 00 00 00 00 00 00 00 00 00 B5 1C 9A D6 AA 58 7C 81 00 00 43 00 00 00 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 1E 00 00 00 00 04 00
VxDAnswerEAX: 00000001
(BytesReturned: 00000000):
VxDAnswerMsg: 01 00 00 00 01 00 00 00 68 73 68 6C 48 00 00 00 28 00 00 00 F2 17 05 00 00 00 00 00 00 00 00 00 B5 1C 9A D6 AA 58 7C 81 00 00 43 00 00 00 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 1E 00 00 00 00 04 00
...

  Не буду приводить весь лог. Скажу только то, что он оказался не очень большим. Я уже начал писать "заменитель" таких обращений, но вначале обратил внимание на то, что вызываемый драйвер меняет совсем немного данных, переданных ему. Только ради "прикола" я заменил все вызовы DeviceIOControl на ответы "все хорошо" и ожидал, естественно, что программа не обнаружит ключа hasp и не будет загружаться. Но ... приложение загрузилось как ни в чем не бывало !!!

  Вот именно - не понял. Как же так же ? Если приложение НИКАК не общается с драйвером, но тем не менее умудряется выполнять проверки на hasp, то как оно это делает ???

Шестая попытка.Опять регистры DRx

  Вот так. Предидущий непонятный момент я пока списал на сообщения, которые передает VMM VxD-драйверам или что еще. Вернемся на арену VxD, где пока была отложена схватка за DRx. Обращаем внимание на то, что в регистре DR7 есть бит 13:

Код (Text):
  1.  
  2. ; Включение ловушек
  3.   ;        FEDCBA9876543210FEDCBA9876543210
  4.   mov  eax,01100110011001100010011111111111b
  5.   mov  dr7,eax
  6.  
  7.   бит 13: бит GD - включает режим, в котором любое обращение к
  8.                    любому отладочному регистру, даже из кольца защиты 0,
  9.                    вызывает исключение #DB
  10.   ...
  11.  

  О. Вот то, что нам нужно. Эта фича поможет нам выполнить следующее: устанваливаем этот бит в 1, теперь все команды замусоривания регистров DRx автоматом перейдут к нам. Но мы тогда не будем их выполнять, а будем эмулировать:

Код (Text):
  1.  
  2. ; подпрограмма - ловушка #1 - debug
  3. BD equ 0010000000000000b
  4. B0 equ 0001b
  5. B1 equ 0010b
  6. B2 equ 0100b
  7. B3 equ 1000b
  8. CMD_IN_AL_DX equ 0ECh
  9. ;      FEDCBA9876543210      
  10. TrapPort proc
  11.   push ebp
  12.   mov  ebp,esp
  13.  
  14.   ...
  15.  
  16. ; Адрес возврата EIP
  17.   mov  ecx,[ebp+4]
  18. ; Адрес возврата CS->ES
  19.   mov  es,word ptr [ebp+8]
  20.  
  21. ; Причина отладочного прерывания
  22.   mov  eax,dr6
  23.   test eax,BD
  24.   jz   @@NotDebugRegs
  25.  
  26. ; Запомнить байты инструкции
  27. ; Адрес возврата EIP
  28. ; Команды мусоренья не запоминаем
  29. ;;  mov  ecx,[ebp+4]
  30. ;;  call Store_LogRecord
  31.  
  32. ; Очищаем бит BD в регистре dr6
  33.   and  eax, not BD
  34.   mov  dr6,eax
  35.  
  36. ; Если это было обращение к DRx, не нужно выполнять эти команды
  37. ; Запоминаем адрес возврата и возвращаемся в наш код
  38.   add  ecx,3
  39.  
  40.   jmp  @@AfterDebugRegs
  41.  
  42. @@NotDebugRegs:
  43.  
  44.   ...
  45.  
  46. ; Причина отладочного прерывания в доступе к портам ?
  47.   mov  eax,dr6
  48.   test eax,B0
  49.   jz   @@NotDR0
  50. ; Очищаем бит B0 в регистре dr6
  51.   and  eax, not B0
  52. @@NotDR0:
  53.   test eax,B1
  54.   jz   @@NotDR1
  55. ; Очищаем бит B1 в регистре dr6
  56.   and  eax, not B1
  57. @@NotDR1:
  58.  
  59.   ...
  60.  
  61.   mov  dr6,eax
  62.  
  63. @@AfterDebugRegs:
  64.  
  65. ; Запоминаем адрес возврата и возвращаемся в наш код
  66.   mov  dword ptr RetAddr_UD01_EIP,ecx
  67.   mov  word ptr RetAddr_UD01_CS,es
  68.  
  69.   mov  [ebp+4],offset32 After_DebugRegisterUsed
  70.   mov  word ptr [ebp+8],cs
  71.  
  72.   ...
  73.  
  74. After_DebugRegisterUsed proc
  75.   pushad
  76.   pushfd
  77. ; Enable DE flag
  78.   mov  eax,cr4
  79.   or   eax,01000b
  80.   mov  cr4,eax
  81.   ;        FEDCBA9876543210FEDCBA9876543210
  82.   mov  eax,01100110011001100010011111111111b
  83.   mov  dr7,eax
  84.   popfd
  85.   popad
  86.   jmp  dword ptr RetAddr_UD01_EIP
  87. After_DebugRegisterUsed endp
  88.  

  Тут несколько сложновато написано, но смысл такой: всякий раз при выполнении такого исключения все биты в DR7 скидываются, и мы получаем в исключении #1 его "чистым". Попытка проинициализировать его внутри обработчика приведет к краху системы, а отдавть управление назад со сброшенным регистром DRx как-то неприлично. Для этого я возвращаюсь не в вызвавший исключение код, но в собственную подпрограммку After_DebugRegisterUsed.

  Запомнив адресок возврата, уже в этой программке делаю переинициализацию DR7 и возвращаюсь куда следует. Возможно, кто-то спросит меня, почему повторная инициализация DR7 внутри After_DebugRegisterUsed не приводит к вызову #1 - ? Ответ такой: не знаю. А если бы это было не так, то как вообще тогда установить DR7 ? :smile3:

  Ну вот. Теперь мы в "памперсе" и мы защищены от порчи DR7. Как удачно, что DR0-DR3 никто не трогает, но с этим тоже легко справиться. А еще не менее удачно, что никто не переставляет int 01 ;)

  Но что это ? Запуск программы prog.exe опять не показал перехватов обращений к портам ! Точнее говоря, в логе видны только обращения к отладочным регистрам DRx и то, что мы их успешно "исправляем". Но нет, нет обращений к портам.

Обоюдоострое оружие от Intel

  Нам интел дал мощное средство против защиты в виде DRx, но "меч не той версии". Почему ? После некоторых копаний в той же книжке Зубкова С.В. находим следующее:

Код (Text):
  1.  
  2. CR4: этот регистр (появился только в процессорах Pentium)
  3.  управляет новыми возможностями процессоров. Все эти возможности
  4.  необязательно присутствуют, и ...
  5.  
  6. бит 3: бит DE - запрещает отладочные прерывания по обращению к портам
  7.  

  Упс. Но вот помешать защите сбросить этот бит никто не может, никакого обращения к нему процессор не контролирует.

  Получается, что Интел дал нам обоим по разному оружию, и у всего оружия есть свои слабости и достоинства. Как же быть >?

  Приходится опять лезть в вязкий (хоть и не очень большой) код малого hasplit в дизассемблере. И выяснять, как и насколько часто он портит уже и регситр CR4.

Попутно: как общается приложение с VxD

  Чуть выше я задал сам себе загадку: как общается код win32-приложения с VxD драйвером, если изоляция DeviceIOControl не помогает ?

  Так вот, при более детальном копании в недрах малого hasplit выясняется, что он делает следующие шаги: при получении сообщения от системной машины THREAD_INIT он проверяет, устанолен ли его собственный обработчик исключений #6 и #14. Исключение #6 - это исключение UD - undefined operation. Если проц наткнется на опкод, который не сможет опознать, то он зовет это исключение. Исключение #14 - это Page Fault - ошибка записи или чтения в защищенную страницу памяти (при включенной страничной адресациии). Для вызова этого исключения существует специальная команда mov eax,ds:[0]. Шутка :smile3:

  Если обработчиков таких вот нет, то малый hasplit установит их на себя. Второй обработчик, видимо, не очень интересен: он проверяет, где эксепшен. Если внутри него же (внутри hasplit.vxd), то он "застрелится" из halt+cli, иначе передаст управление куда-то там дальше...

  Приложение же загружает драйвер, походу слегка проверяя, нету ли тут Soft-Ice. Это делается попыткой открыть файл "\\.\SICE" и, затем, "\\.\NTICE". Но это совсем не главное. Далее приложение сознательно передаст управление на недопустимый к выполнению код. А дальше уже управление получит VxD и начнет свою часть работы. Таких вызовов состоится около 8-ми сотен. При этом VxD активно сопротивляется попыткам его трейсить, видимо, выполняя сверки CRC.

Поиск очистки CR4 внутри hasplit.vxd

  В ходе трассировки hasplit'а как-то не встретилось таких команд, как mov cr4,eax со сброшенным битом DE. Попробуем поискать его в hiew - тоже нет. Да, кончено, hasplit активно противостоит даже просмотру в отладчике: распаковывает и выполняет свои функции в памяти и проч. Но все же странно...

  А что-то я давно не выслушивал "начальника транспротного цеха". Что-то мы подзабыли большой и здоровый haspbig.vxd. А в нем ? Может, в нем есть такие команды ?

  А что Вы думаете - есть ! Небольшая загадка: каким числом ? Правильно, один. Одна команда на полметра. Не может быть ! Быстро пишу nop, nop, nop..., кидаю его в SYSTEM, рестарт... работает ! Все. Теперь наш перехватчик чудесно все записывает - вот они, команды общения с портом LPT:

Код (Text):
  1.  
  2. Total traps: 0000072366 See log file trap_01.log...
  3. OpC=ee DX=0378 AL=80 (?) rep=0000
  4. OpC=ee DX=0378 AL=c6 (?) rep=0000
  5. OpC=ee DX=0378 AL=c7 (?) rep=0000
  6. OpC=ee DX=0378 AL=c6 (?) rep=0000
  7. OpC=ee DX=0378 AL=80 (?) rep=0000
  8. OpC=ee DX=0378 AL=8a (?) rep=0000
  9. OpC=ee DX=0378 AL=8b (?) rep=0000
  10. OpC=ee DX=0378 AL=8a (?) rep=0000
  11. OpC=ee DX=0378 AL=f8 (?) rep=0000
  12. OpC=ee DX=0378 AL=f9 (?) rep=0000
  13. OpC=ee DX=0378 AL=f8 (?) rep=0000
  14.  

  В первой колонке - опкод команды исключения (используются только чтение in al,dx или запись out dx,al).

Подмена сценария

  Мы подходим к кульминации сюжета. Все бронежелеты заюзаны, осталось сердце защиты - hasp ключ. В него пишутся данные и получаются ответы. Эти ответы и нужно один раз записать и подставлять во всех остальных случаях.

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

  Записываем несколько логов. Смотрим разницу. Ага, логи отличаются, но не сильно (примерно 10-50 команд чтения/записи на 53 тысячи). Это внушает оптимизм.

  На данном этапе придется лезть в формат обмена данными с hasp. Лучшее, что я нарыл - это "Програмная эмуляция HASP ключей" by exefoliator. Там упоминается, что hasp реализует всего три функции:

Код (Text):
  1.  
  2. HASP-3 поддерживает только 3 основные функции: ISHASP (дает информацию
  3. о подключении HASP ключа - т.е. подключени или нет), HASPSTATUS (Возвращает
  4. тип ключа HASP) и HASPCODE (возвращает 64 битный код в зависимости от
  5. входного (seed) 16 битного кода). Остальные ключи поддерживают эти 3
  6. функции + функции для записи/чтения в память, получение ID кода и доступа
  7. к таймеру.
  8.  

  Далее говорится, что в коде обычно реализованы три функции вида:

Код (Text):
  1.  
  2. Функции|      Параметры вызова| Возращаемое значение|
  3. ISHASP        BH <- 1, BL <- LPT №.    AX = 0 (нету HASP) или 1 (HASP есть)
  4.  
  5. HASPCODE      BH <- 2, BL <- LPT №|.    AX = return code 1
  6.               AX <- seed код           |BX = return code 2
  7.               CX <- password1           |CX = return code 3
  8.               DX <- password2           |DX = return code 4
  9.  
  10. HASPSTATUS    BH <- 5, BL <- LPT №.    |AX = размер памяти
  11.               CX <- password1           |BX = тип HASP
  12.               DX <- password2           |CX = LPT к которому подключено.
  13.  

  И приводится пример программки - эмулятора таких вызовов. Но то ли я не дорюхал, то ли что, но этот путь оказался для меня тупиком. По двум причинам: 0) Я не смог подобрать 8-мь байт данных для имитации отклика хасп-ключа по совету exefoliator'а; 1) Вызов подобный тому, что приводится выше, действительно есть, но его никто не делает. То ли это забыли с давних времен win 3.11, то ли под XP заготовка.

  Однако изучить хасп может помочь замечательная утилитка haspgrab. Писана на паскале под дос и упакована, чудесно смотрится в отладчике. Все вызовы удобно идут подряд в main'е. Спасибо тому, кто ее сделал. Ниже в приложении 1, приводится выдержки из этой утилиты, которые я написал на том же паскале. А сейчас я приведу формат обмена с hasp-ключем, позволяющий получить Public Table ключа:

Код (Text):
  1.  
  2. Out: 0C 80 C6 C7 C6 80 8A 8B 8A F8 F9 F8 DA DB DA BA BB BA 94 95 94
  3. Out: C8 C9 C8 A8 A9 A8 80 81 80 92 93 92 D0 D1 D0 B0 B1 B0 8C 8D 8C
  4. Out: 9E 9F 9E DC DD DC BC BD BC
  5. Out: FE
  6. In:  7F
  7. Out: FC
  8. In:  7F
  9. Out: FA
  10. In:  5F
  11. Out: F8
  12. In:  5F
  13. ; Далее в упрощенном формате записано
  14. Out=>F6 BIn=7F Bout=F4 BIn=7F Bout=F2 BIn=7F Bout=F0 BIn=5F Bout=EE BIn=7F
  15. Bout=EC BIn=7F Bout=EA BIn=7F Bout=E8 BIn=7F Bout=E6 BIn=7F Bout=E4 BIn=7F
  16. Bout=E2 BIn=7F Bout=E0 BIn=7F Bout=DE BIn=5F Bout=DC BIn=5F Bout=DA BIn=5F
  17. Bout=D8 BIn=5F Bout=D6 BIn=7F Bout=D4 BIn=5F Bout=D2 BIn=7F Bout=D0 BIn=5F
  18. Bout=CE BIn=7F Bout=CC BIn=7F Bout=CA BIn=7F Bout=C8 BIn=7F Bout=C6 BIn=7F
  19. Bout=C4 BIn=7F Bout=C2 BIn=7F Bout=C0 BIn=7F Bout=BE BIn=7F Bout=BC BIn=7F
  20. Bout=BA BIn=5F Bout=B8 BIn=5F Bout=B6 BIn=7F Bout=B4 BIn=7F Bout=B2 BIn=7F
  21. Bout=B0 BIn=5F Bout=AE BIn=7F Bout=AC BIn=7F Bout=AA BIn=5F Bout=A8 BIn=5F
  22. Bout=A6 BIn=7F Bout=A4 BIn=7F Bout=A2 BIn=7F Bout=A0 BIn=5F Bout=9E BIn=5F
  23. Bout=9C BIn=5F Bout=9A BIn=5F Bout=98 BIn=5F Bout=96 BIn=7F Bout=94 BIn=5F
  24. Bout=92 BIn=7F Bout=90 BIn=5F Bout=8E BIn=5F Bout=8C BIn=5F Bout=8A BIn=5F
  25. Bout=88 BIn=5F Bout=86 BIn=7F Bout=84 BIn=5F Bout=82 BIn=7F Bout=80 BIn=5F
  26.  
  27. Public table :50 50 73 73 FF 50 FF 73
  28.  

  Обащаю внимание на следующие особенности формата команд (это взгялд дилетанта :smile3: ). Сначала всегда идет что-то типа сброса (инициализации) начала передачи - out base+2,0Сh, потом out base,80h, потом отсыл байта C6 в виде трех посылок: C6,C7,C6. Вообще ключевой момент формата команд - это посылка байтов тройками. Сначла посылается байт, потом байт or Bit, потом опять байт. Bit опционален и может быть и 5-м, и 6-м. В приведенном выше примере затем посылается байт 80h, а потом вот именно в формате троек вот такая строка:

Код (Text):
  1.  
  2. $8A,$F8,$DA,$BA, $94,$C8,$A8,$80, $92,$D0,$B0,$8C, $9E,$DC,$BC
  3.  

  Ответ на эту команду читается следующим образом: мы должны прочесть 64-е бита (помните статью exefoliator'а ?), но за одно чтение из порта можем читать один бит. Поэтому мы 64 раза отправляем в порт ( номер бита x 2 ) or 80h и читаем байт из base+1, бит данных окажется 5-м. Это также ключевой момент в формате обмена: данные всегда читаются один бит за одно чтение, все ответы могут быть 5F или 7F only.

  Переходим к анализу лога. Как я уже говорил, логи отличаются крайне незначитально. В первом приближении было видно, что отличия представляют собой два "пятна", один примерно в области строки ~33730 лога, другое - в области строки ~35660. Ниже приведены фрагменты 6-ти логов именно в области первого "пятна":

Код (Text):
  1.  
  2.    lg1 lg2 lg3 lg4 lg5 lg6
  3. ee =9e =9e =9e =9e =9e =9e
  4. ee =be =be =be =be =be =be
  5. ee =9e =9e =9e =9e =9e =9e
  6. ee =de =de =de =de =de =de
  7. ee =fe =fe =fe =fe =fe =fe
  8. ee =de =de =de =de =de =de
  9. ee =de =de =de =de =de =de
  10. ee =fe =fe =fe =fe =fe =fe
  11. ee =de =de =de =de =de =de
  12. ee =9e =9e =9e =9e =9e =9e
  13. ee =be =be =be =be =be =be
  14. ee =9e =9e =9e =9e =9e =9e
  15. ee =9e =9e =9e =9e =9e =9e
  16. ee =be =be =be =be =be =be
  17. ee =9e =9e =9e =9e =9e =9e
  18. ; diff started
  19. ee =9e =9e =de =de =de =9e ; write 9e or de
  20. ee =be =be =fe =fe =fe =be
  21. ee =9e =9e =de =de =de =9e
  22. ; diff
  23. ee =de =de =9e =9e =9e =de ; write 9e or de
  24. ee =fe =fe =be =be =be =fe
  25. ee =de =de =9e =9e =9e =de
  26. ; diff
  27. ee =de =de =9e =9e =9e =de ; write 9e or de
  28. ee =fe =fe =be =be =be =fe
  29. ee =de =de =9e =9e =9e =de
  30. ; diff
  31. ee =de =9e =9e =de =9e =de ; write 9e or de
  32. ee =fe =be =be =fe =be =fe
  33. ee =de =9e =9e =de =9e =de
  34. ; diff
  35. ee =9e =de =9e =de =de =de ; write 9e or de
  36. ee =be =fe =be =fe =fe =fe
  37. ee =9e =de =9e =de =de =de
  38. ; begin read
  39. ec =5f =5f =5f =5f =5f =5f
  40. ee =be =fe =be =fe =fe =fe ; write be or fe
  41. ee =9e =de =9e =de =de =de ; write 9e or de
  42. ec =5f =5f =5f =5f =5f =5f
  43. ee =be =fe =be =fe =fe =fe ; write be or fe
  44. ee =9e =de =9e =de =de =de ; write 9e or de
  45. ec =7f =7f =7f =7f =7f =7f
  46. ee =be =fe =be =fe =fe =fe ; write be or fe
  47. ee =9e =de =9e =de =de =de ; write 9e or de
  48. ec =5f =5f =5f =5f =5f =5f
  49. ee =be =fe =be =fe =fe =fe ; write be or fe
  50. ee =9e =de =9e =de =de =de ; write 9e or de
  51. ec =7f =7f =7f =7f =7f =7f
  52. ee =be =fe =be =fe =fe =fe ; write be or fe
  53. ee =9e =de =9e =de =de =de ; write 9e or de
  54. ec =5f =5f =5f =5f =5f =5f
  55. ee =be =fe =be =fe =fe =fe ; write be or fe
  56. ee =9e =de =9e =de =de =de ; write 9e or de
  57. ec =7f =7f =7f =7f =7f =7f
  58. ee =be =fe =be =fe =fe =fe ; write be or fe
  59. ee =9e =de =9e =de =de =de ; write 9e or de
  60. ec =7f =7f =7f =7f =7f =7f
  61. ee =be =fe =be =fe =fe =fe ; write be or fe
  62. ee =9e =de =9e =de =de =de ; write 9e or de
  63. ec =7f =7f =7f =7f =7f =7f
  64. ee =be =fe =be =fe =fe =fe ; write be or fe
  65. ee =9e =de =9e =de =de =de ; write 9e or de
  66. ec =5f =5f =5f =5f =5f =5f
  67. ee =be =fe =be =fe =fe =fe ; write be or fe
  68. ee =9e =de =9e =de =de =de ; write 9e or de
  69. ec =7f =7f =7f =5f =7f =7f ; read 7f or 5f
  70. ee =be =fe =be =fe =fe =fe ; write be or fe
  71. ee =9e =de =9e =de =de =de ; write 9e or de
  72. ec =7f =7f =7f =7f =5f =7f ; read 7f or 5f
  73. ee =be =fe =be =fe =fe =fe
  74. ee =9e =de =9e =de =de =de
  75. ec =5f =5f =7f =7f =7f =7f ; read 7f or 5f
  76. ee =be =fe =be =fe =fe =fe
  77. ee =9e =de =9e =de =de =de
  78. ec =7f =7f =7f =7f =5f =7f ; read 7f or 5f
  79. ee =be =fe =be =fe =fe =fe
  80. ee =9e =de =9e =de =de =de
  81. ec =7f =5f =5f =7f =7f =5f ; read 7f or 5f
  82. ee =be =fe =be =fe =fe =fe
  83. ee =9e =de =9e =de =de =de
  84. ec =5f =5f =7f =5f =5f =5f ; read 7f or 5f
  85. ee =be =fe =be =fe =fe =fe
  86. ee =9e =de =9e =de =de =de
  87. ec =5f =7f =5f =7f =5f =5f ; read 7f or 5f
  88. ee =be =fe =be =fe =fe =fe ; write be or fe
  89. ee =9e =de =9e =de =de =de ; write 9e or de
  90. ee =9c =dc =9c =dc =dc =dc
  91.  

  Начнем анализ с первых строк. Сначала во всех логах загружаются одинаковые байты (тройками):

Код (Text):
  1.  
  2. 9e,be,9e
  3. de,fe,de
  4. de,fe,de
  5. 9e,be,9e
  6. ...
  7.  

  Но далее видно, что послдение пять загружаемых байт могут отличаться:

Код (Text):
  1.  
  2. ; diff started
  3. ee =9e =9e =de =de =de =9e ; write 9e or de
  4. ee =be =be =fe =fe =fe =be
  5. ee =9e =9e =de =de =de =9e
  6. ; diff
  7. ee =de =de =9e =9e =9e =de ; write 9e or de
  8. ee =fe =fe =be =be =be =fe
  9. ee =de =de =9e =9e =9e =de
  10. ; diff
  11. ee =de =de =9e =9e =9e =de ; write 9e or de
  12. ee =fe =fe =be =be =be =fe
  13. ee =de =de =9e =9e =9e =de
  14. ; diff
  15. ee =de =9e =9e =de =9e =de ; write 9e or de
  16. ee =fe =be =be =fe =be =fe
  17. ee =de =9e =9e =de =9e =de
  18. ; diff
  19. ee =9e =de =9e =de =de =de ; write 9e or de
  20. ee =be =fe =be =fe =fe =fe
  21. ee =9e =de =9e =de =de =de
  22. ; begin read
  23. ec =5f =5f =5f =5f =5f =5f
  24.  

  И далее идет чтение отклика hasp-ключа именно тройками байт:

Код (Text):
  1.  
  2. out be,93 ; Два байта записаны
  3. in <- 5f  ; Один бит результата
  4. ...
  5.  

  Во втором приближении приложение выполняет в потоке команд записи/ чтения откликов две команды где-то в середине сценария и при этом на вход подает различные данные: от этого и логи различаются. Но ! Эти данные отличаются лишь на ... 5-ть бит. Это 32 комбинации. Это немного. Это тоже можно эмулировать.

  Детальнее проанализируем эту часть лога. Посмотрим чуть выше, где начинается эта запись. Вот ее детальный формат:

Код (Text):
  1.  
  2. ;
  3.   Data1: array[0..14] of byte= (
  4.     $C2,$F0,$D2,$FA, $B4,$C0,$AC,$C0,
  5.     $82,$C0,$F0,$84, $DE,$9C,$01); {$01-признак конца передачи}
  6.  
  7. ; Эти десять байт передаем в вышеприведенном примере в логе 1 (левый)
  8.   TestSend: array[0..9] of byte= (
  9.     $9E,$DE,$DE,$9E, $9E,$9E,$DE,$DE,
  10.     $DE,$9E);
  11.  
  12. ; Стандартный префикс: 80+80+C6x3
  13.   OutPort(PortData,$80);
  14.   OutPort(PortData,$80);
  15.   Send_Twice($C6);
  16.   OutPort(PortData,$80);
  17.  
  18.   Send_Data(Data1);
  19.   OutPort(PortData,$9E);
  20.  
  21. ; Передаем 10 бит данных, последние пять могут отличаться от сессии к сесии
  22.  
  23.   for i:=0 to sizeof(TestSend)-1 do
  24.     Send_TwiceBit5(TestSend[i]);
  25.  
  26.   { Читаем ответ }
  27.   write('Answer:');
  28.   for i:=0 to 16 do
  29.     begin
  30.       ResByte:=InPort(PortRead);
  31.       OutPort(PortData,$BE);
  32.       OutPort(PortData,$9E);
  33.       BytesToHexWithFiller(ResByte,DebStr,1);
  34.       write(DebStr);
  35.     end;
  36.  

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

  Что же до второго "пятна" в логах, то, как это ни странно, оно оказалось совершенно идентично первому :smile3: Это та же самая команда, с теми же самыми различными последними 5-мя битами.

  Таким образом в общем случае программная защита способна образовать 32x32 различных сессии, подставляя в двух случаях пять случайных бит. Возможно, это было сделано не специально ;) , а просто какая-нибудь секция .data? попадает под расшифровку. По крайней мере перевод системной даты на 5 лет вперед никак не помогает ей в этом.

  Последнее, что осталось - это привести пример (корявый) подстановщика верного отклика в этих сессиях:

Код (Text):
  1.  
  2. @@NotDebugRegs:
  3.  
  4. ; Запомнить байты инструкции
  5. ; Адрес возврата EIP
  6.   mov  ecx,[ebp+4]
  7. ; Имитируем только отклики порта LPT
  8. ; Адрес возврата CS
  9.   mov  es,word ptr [ebp+8]
  10.  
  11.   call GetFrom_LogRecord ; EDX и EAX - регистры из лога
  12.  
  13.   cmp  byte ptr es:[ecx-1],CMD_IN_AL_DX
  14.   jnz  @@SkipLogPortsCommands
  15.  
  16. ; Регистр eax меняем
  17.   mov  byte ptr [ebp-4],al
  18.  
  19. @@SkipLogPortsCommands:
  20.  
  21.   ...
  22.  
  23. ;
  24. ; Получить байты отклика из лог-буфера (EAX, EDX)
  25. GetFrom_LogRecord proc
  26. ; Запоминаем байты и значения регистров команды
  27.   mov  eax,dword ptr ds:LastLogPtr
  28.   cmp  eax,dword ptr LogPtr
  29.   jb   LogNotDone
  30.   mov  dword ptr ds:LastLogPtr,0
  31.   mov  eax,0
  32. LogNotDone:
  33.  
  34.   inc  dword ptr ds:LastLogPtr
  35.   imul eax,eax,sizeof(tLogPacket)
  36.   mov  ebx,offset32 LogPackets
  37.   add  ebx,eax
  38.   assume ebx: ptr tLogPacket
  39. ; Регистр eax
  40.   movzx eax,byte ptr [ebx].RegEAX
  41. ; Регистр dx
  42.   movzx edx,word ptr [ebx].RegDX
  43.   assume ebx:nothing
  44.  
  45.   ;; jmp  @@SkipAnalize
  46.  
  47. ; Анализируем, что отдать/получить надо
  48.   mov  ebx,dword ptr ds:LastLogPtr
  49.   xor  esi,esi
  50.   cmp  ebx,33373-1
  51.   jb   @@SkipAnalize
  52.   cmp  ebx,(33373+63)-1
  53.   jbe  @@AnalizeIt
  54.   mov  esi,35555-33373
  55.   cmp  ebx,35555-1
  56.   jb   @@SkipAnalize
  57.   cmp  ebx,(35555+63)-1
  58.   ja   @@SkipAnalize
  59.  
  60. @@AnalizeIt:
  61.  
  62. ; Безотносительно места в логе  
  63.   sub  ebx,esi
  64. ; Мы находимся в чтении ?
  65.   cmp  ebx,33388-1
  66.   jae  @@InCmds
  67.  
  68. ; Нет, в записи
  69. ; Получаем номер пакета
  70.   sub  ebx,33373-1
  71.   push eax
  72.   xor  dx,dx
  73.   mov  ax,bx
  74.   mov  bx,3
  75.   div  bx
  76.   mov  bx,dx
  77.   movzx edi,ax
  78.   pop  eax
  79.   test bx,bx
  80.   jnz  @@Next
  81. ; Номер пакета из трех байт передачи в edi (0-4)
  82. ; Записываемый байт в [ebp-4]
  83.   push ecx
  84.   push eax
  85.   mov  al,byte ptr [ebp-4]
  86.   shr  al,6
  87.   and  al,1
  88.   mov  ecx,edi
  89.   shl  al,cl
  90.   or   byte ptr ds:Variant,al
  91.   pop  eax
  92.   pop  ecx
  93.   jmp  @@Next
  94.  
  95. @@InCmds:
  96.  
  97.   cmp  ebx,33391-1
  98.   jb   @@Next
  99.   sub  ebx,33391-1
  100.  
  101. ; Номер пакета чтения
  102.   push eax
  103.   xor  dx,dx
  104.   mov  ax,bx
  105.   mov  bx,3
  106.   div  bx
  107.   mov  bx,dx
  108.   movzx edi,ax
  109.   pop  eax
  110.   test bx,bx
  111.   jnz  @@Next
  112. ; edi - номер пакета ответа (0..15)
  113.   movzx eax,byte ptr ds:Variant
  114.   shl  eax,4
  115.   mov  al,byte ptr ArtAnswers[eax+edi]
  116.   cmp  edi,15
  117.   jb   @@Next
  118. ; Сбросить Variant
  119.   mov  byte ptr ds:Variant,0
  120.  
  121. @@Next:
  122.  
  123. @@SkipAnalize:
  124.  
  125.   ret
  126. GetFrom_LogRecord endp
  127.  

  Спасибо всем прочитавшим ;)

  (C) Chingachguk /HI-TECH

Да охранит нас 道 от 惡! - прим. wasm.ru

Приложение 1. Код на паскале для работы с hasp. Выдержки из haspgrab

Код (Text):
  1.  
  2. {$G+}
  3. const
  4.   base = $0378;
  5.   PortData = 0;
  6.   PortRead = 1;
  7.   PortServ = 2;
  8.  
  9. procedure OutPort(PortAddr:word; PortData: Byte);
  10.   begin
  11.     Port[base+PortAddr]:=PortData;
  12.     {PrintByte(PortData,'Bout=');}
  13.   end;
  14. function InPort(PortAddr:word):Byte;
  15.   var
  16.     bTmp: byte;
  17.   begin
  18.     bTmp:=Port[base+PortAddr];
  19.     {PrintByte(bTmp,'BIn=');}
  20.     InPort:=bTmp;
  21.   end;
  22. Procedure Send_Twice(PData: Byte);
  23.   begin
  24.     OutPort(PortData,PData);
  25.     OutPort(PortData,PData or 1);
  26.     OutPort(PortData,PData);
  27.   end;
  28. Procedure Send_TwiceBit5(PData: Byte);
  29.   begin
  30.     OutPort(PortData,PData);
  31.     OutPort(PortData,PData or $20);
  32.     OutPort(PortData,PData);
  33.   end;
  34. const
  35.   Data0: array[0..15] of byte= (
  36.     $8A,$F8,$DA,$BA, $94,$C8,$A8,$80,
  37.     $92,$D0,$B0,$8C, $9E,$DC,$BC,$01);
  38.  
  39.   Data1: array[0..14] of byte= (
  40.     $C2,$F0,$D2,$FA, $B4,$C0,$AC,$C0,
  41.     $82,$C0,$F0,$84, $DE,$9C,$01);
  42.  
  43.   TestSend: array[0..9] of byte= (
  44.     $9E,$DE,$DE,$9E, $9E,$9E,$DE,$DE,
  45.     $DE,$9E);
  46.  
  47.   TestSend1: array[0..9] of byte= (
  48.     $9E,$DE,$DE,$9E,$9E, $9E,$9E,$9E,$9E,$9E);
  49.  
  50. Procedure Send_Data(var PData: array of byte);
  51.   var
  52.     i: word;
  53.   begin
  54.     i:=0;
  55.     while PData[i]  $01 do
  56.       begin
  57.         Send_Twice(PData[i]);
  58.         inc(i);
  59.       end;
  60.   end;
  61. Function Read_DataBit: byte;
  62.   begin
  63.     Read_DataBit:= ( (InPort(PortRead) shr 5) and 1 );
  64.   end;
  65. Procedure Read_8Bytes(var Res8Bytes: array of byte);
  66.   var
  67.     i,j: word;
  68.   begin
  69.     FillChar(Res8Bytes,8,$00);
  70.     for i:=0 to $3F do
  71.       begin
  72.         OutPort(PortData,((i shl 1) or $80));
  73.         j:=(i shr 3);
  74.         Res8Bytes[j]:=Res8Bytes[j] or (Read_DataBit shl (7-(i and $07)) );
  75.       end;
  76.   end;
  77. { Идентично предидущему, можно читать биты в обратном порядке }
  78. Procedure Read_Swap8Bytes(var Res8Bytes: array of byte);
  79.   var
  80.     i,j: word;
  81.   begin
  82.     FillChar(Res8Bytes,8,$00);
  83.     for i:=$3F downto 0 do
  84.       begin
  85.         OutPort(PortData,((i shl 1) or $80));
  86.         j:=(i shr 3);
  87.         Res8Bytes[j]:=Res8Bytes[j] or (Read_DataBit shl (7-(i and $07)) );
  88.       end;
  89.   end;
  90. {$F+}
  91. { Заполнить строку AddrHex hex-представлением Number байтов из AddrBytes, }
  92. { но байты через пробел }
  93. Procedure BytesToHexWithFiller(var AddrBytes,AddrHex; Number:Word);
  94.   Begin
  95.     Asm
  96.     pusha
  97.     push ds
  98.     push es
  99.     cld
  100.     lds  si,AddrBytes
  101.     les  di,AddrHex
  102.     xor  cx,cx
  103.     mov  al,byte ptr Number
  104.     mov  cl,al
  105.     shl  al,1
  106.     add  al,cl {len x 3}
  107.     stosb
  108.     test cx,cx
  109.     jz   @@Done
  110. @@NextByte:
  111.     lodsb
  112.     mov  ah,al
  113.     shr  al,4
  114.     cmp  al,10
  115.     sbb  al,69h
  116.     das
  117.     stosb
  118.     mov  al,ah
  119.     and  al,0Fh
  120.     cmp  al,10
  121.     sbb  al,69h
  122.     das
  123.     stosb
  124.     mov  al,' '
  125.     stosb
  126.  
  127.     loop @@NextByte
  128. @@Done:
  129.     pop  es
  130.     pop  ds
  131.     popa
  132.     End;
  133.   End;
  134. var
  135.   Res: array[0..7] of byte;
  136.   ResByte: byte;
  137.   DebStr: string;
  138.   i, variant: word;
  139. begin
  140.   writeln('Start !');
  141.   writeln('Send ini...');
  142.  
  143.   OutPort(PortServ,$0C);
  144.   OutPort(PortData,$80);
  145.   Send_Twice($C6);
  146.   OutPort(PortData,$80);
  147.  
  148.   Send_Data(Data0);
  149.  
  150.   {Read_8Bytes(Res);}
  151.   Read_Swap8Bytes(Res);
  152.  
  153.   BytesToHexWithFiller(Res,DebStr,8);
  154.  
  155.   writeln('Public table ?:',DebStr);
  156.  
  157.   exit;
  158.  
  159.   writeln('Write test:');
  160.  
  161.   OutPort(PortData,$80);
  162.   OutPort(PortData,$80);
  163.   Send_Twice($C6);
  164.   OutPort(PortData,$80);
  165.  
  166.   Send_Data(Data1);
  167.   OutPort(PortData,$9E);
  168.  
  169.   for i:=0 to sizeof(TestSend)-1 do
  170.     Send_TwiceBit5(TestSend[i]);
  171.  
  172.   { Читаем ответ }
  173.   write('Answer:');
  174.   for i:=0 to 16 do
  175.     begin
  176.       ResByte:=InPort(PortRead);
  177.       OutPort(PortData,$BE);
  178.       OutPort(PortData,$9E);
  179.       BytesToHexWithFiller(ResByte,DebStr,1);
  180.       write(DebStr);
  181.     end;
  182.  
  183.   writeln('All tests:');
  184.  
  185.   for variant:=1 to 32 do
  186.     begin
  187.  
  188.       {BytesToHexWithFiller(TestSend1,DebStr,sizeof(TestSend1));
  189.       writeln('Send:',DebStr);}
  190.  
  191.       OutPort(PortData,$80);
  192.       OutPort(PortData,$80);
  193.       Send_Twice($C6);
  194.       OutPort(PortData,$80);
  195.  
  196.       Send_Data(Data1);
  197.       OutPort(PortData,$9E);
  198.  
  199.       for i:=0 to sizeof(TestSend)-1 do Send_TwiceBit5(TestSend1[i]);
  200.  
  201.       { Читаем ответ }
  202.       write('Answer:');
  203.       for i:=0 to 16 do
  204.         begin
  205.           ResByte:=InPort(PortRead);
  206.           OutPort(PortData,$BE);
  207.           OutPort(PortData,$9E);
  208.           BytesToHexWithFiller(ResByte,DebStr,1);
  209.           asm mov  byte ptr DebStr[0],2 end;
  210.           write('0',DebStr,'h');
  211.           if i<16 then write(',');
  212.         end;
  213.       writeln;
  214.       {readln;}
  215.  
  216.       { Следующий посыл }
  217.       for i:=5 to 5+5 do
  218.         begin
  219.           if TestSend1[i] = $9E then
  220.             begin
  221.               TestSend1[i]:=$DE;
  222.               break;
  223.             end;
  224.           TestSend1[i]:=$9E;
  225.         end;
  226.     end;
  227.  
  228.   writeln('Finish ;)');
  229. end.
  230.  
© Chingachguk / HI-TECH

0 1.295
archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532