Сейчас на форуме: _MBK_, vsv1 (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Помогите разобраться с прогой
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 14 февраля 2007 11:52 · Поправил: Tolkin
· Личное сообщение · #1

Есть прога T-FLEX CAD 10. написана на VC++. ничем не упакована.
Защищена ключем HASP HL.

Суть в том , что от ключа толку мало,т.к. например в версии 9.015 достаточно было сделать retn в процедурах выхода (PostQuitMessage) и прога нормально работала!

В последующих версиях эта оплошность была немного исправлена. В даной 10 версии например, если сделать retn на вызовах PostQuitMessage прога продолжает работать, но только все кнопки на панелях заблокированы(неактивны). А вот блокированы они изначально или после проверки наличия ключа, я не знаю. Проблема еще и в том, что класс всех панелей - Afx:00400000:8:00010011:00000010:00000000 и стандартные сообщения для работы с кнопками как для ToolBar они не используют.

Подскажите в каком направлении надо двигаться, на что ставить бряки или что искать в проге?
Как в даном классе окон происходит работа с кнопками панелей, может кто знает?

прога здесь: ftp://ftp.topsystems.ru/T-FLEX ftp://ftp.topsystems.ru/T-FLEX 10/T-FLEX CAD 10.zip
login: support ; password: eligarf1002



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 18 февраля 2007 00:48
· Личное сообщение · #2

Может вопрос не в тот форум?
Что, никаких намеков?



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

Создано: 19 февраля 2007 03:44
· Личное сообщение · #3

Tolkin пишет:
Проблема еще и в том, что класс всех панелей

Название класса не может ":" содержать - ты что-то путаешь. Afx по моему связан с MFC - посмотри список DLL.



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 20 февраля 2007 05:42
· Личное сообщение · #4

Да , прога написана с использованием MFC (MFC80U.dll) - но мне это ничего не дает,я в MFC не разбираюсь.
А с класом окон ничего не путаю - именно Afx:00400000:8:00010011:00000010:00000000 - что панели, что меню, что основное окно проги( смотрел разными SPY++).
Заблокированы основные пункты меню - "открыть" и т.д и связанные с пунктами кнопки на панели и акселераторы.
С разблокировкой кнопок панли ничего не вышло - не нашел как изменять их св-ва для даного класа.
Для меню попроще - стандартные API - EnableMenuItem - разблокировать можно - но при нажатии на них ничего не происходит (гдето проверяется что-то?). А разобраться со значениями параметров EnableMenuItem пока не получилось, там много переходов на разные процедуры, повторяющиеся неоднократно Но попробую это сделать(только ручками трудно пока мне все это делать), раз других направлений действий никто не подсказывает.




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 21 февраля 2007 01:29
· Личное сообщение · #5

Tolkin

Ты еще бодаешься с ней? Если что - next hint: попробуй снять лог запросов к ключу: какие именно функции она использует (DeviceIoControl). Возможно, будет проще перейти на другой уровень.

-----
The one derivative you manage is the one I abhore (c) Slipknot




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 22 февраля 2007 11:09
· Личное сообщение · #6

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

Как я понял, для ломки прог с HASP нужно иметь сам ключик. С другой стороны - в даной проге (если смотреть предыдущие версии) толку от такой защиты мало, так как снимается она изменением 5 байт в программе.Просто в даной версии нововведение - по умолчанию прога запускается в неактивном режиме(все функции деактивированы), а в предыдущих версиях - по дефолту все нормально и активно.

Хотя как именно сделана прога - изначально сделана неактивной и активируется только при наличии ключа или изначально активна но при отсутствии ключа деактивируется я не понял, а от этого зависит направление поиска. Как можно это определить?




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 23 февраля 2007 05:53
· Личное сообщение · #7

> Функции DeviceIoControl для общения с ключем я нашел

Отлично, разбери какие именно функции ключа (у ключа есть функции - например):

/*
* Services common to All Local keys. HASP3, MEMOHASP, TIMEHASP.
*/
LOCALHASP_ISHASP = 1,
LOCALHASP_HASPCODE = 2,
LOCALHASP_HASPSTATUS = 5,
HASPAPI_VERSION = 5,

Примерный формат вызова:

void HASPAPI hasp( int service,
int seed,
int lptnum,
int pass1,
int pass2,
int HASP_FAR* p1,
int HASP_FAR* p2,
int HASP_FAR* p3,
int HASP_FAR* p4 );

Исследуя какие именно функи вызываются и с какими параметрами - можно
задумацца о муляции.

> Как я понял, для ломки прог с HASP нужно иметь сам ключик.

Не всегда. Допустим, если используется содержимое памяти ключа - нужно понять
зачем она проге: для явного сравнения или на вход какой-то CRC-подобной
функции подаюцца...

Искать использование ответов ключа удобнее (имхо) искать через bpm (break
on memory access).

> Хотя как именно сделана прога [...]

Уверен - когда "ключ" ответит правильно хотя бы на пару первых
запросов - логика программы станет ГОРАЗДО яснее. Обычно первые
запросы - типа "IsHaspHere?" самые простые для муляции.

-----
The one derivative you manage is the one I abhore (c) Slipknot




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 23 февраля 2007 23:42
· Личное сообщение · #8

То что ты описываешь, было реализовано в 8 версии проги где использовался HASP4. Причем все логи отлично отображались в эмуляторе HASP от brstudio поэтому там было полегче.

В 9 и 10 версиях используется HASP HL usb- формата (зеленого цвета - глянул на сайте -
вроде HASP HL Max : - Защита до 112 локальных приложений или модулей на один ключ.
- Защищенная память (4,096 байт).
- Уникальный ID номер.
- Высокий уровень защиты (алгоритм AES/128).)

Эмулятор от BRSTUDIO настроен наверно только на LPT ключи, поэтому с этими ключами ничего не отображается

В 9 и 10 первый же вызо ключа такой:

0041CDCE |. 6A 00 PUSH 0 ; /hTemplateFile = NULL
0041CDD0 |. 6A 00 PUSH 0 ; |Attributes = 0
0041CDD2 |. 6A 03 PUSH 3 ; |Mode = OPEN_EXISTING
0041CDD4 |. 6A 00 PUSH 0 ; |pSecurity = NULL
0041CDD6 |. 6A 03 PUSH 3 ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0041CDD8 |. 68 000000C0 PUSH C0000000 ; |Access = GENERIC_READ|GENERIC_WRITE
0041CDDD |. 50 PUSH EAX ; |FileName => "\.FEnteDev"
0041CDDE |. FF15 00D24F00 CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; CreateFileA
0041CDE4 |. 8BF0 MOV ESI,EAX
0041CDE6 |. 83FE FF CMP ESI,-1
0041CDE9 |. 0F84 8E000000 JE TFlex.0041CE7D
0041CDEF |. 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C]
0041CDF3 |. 6A 00 PUSH 0 ; /pOverlapped = NULL
0041CDF5 |. 51 PUSH ECX ; |pBytesReturned
0041CDF6 |. 68 00200000 PUSH 2000 ; |OutBufferSize = 2000 (8192.)
0041CDFB |. 57 PUSH EDI ; |OutBuffer
0041CDFC |. 68 00200000 PUSH 2000 ; |InBufferSize = 2000 (8192.)
0041CE01 |. 57 PUSH EDI ; |InBuffer
0041CE02 |. 68 A824409C PUSH 9C4024A8 ; |IoControlCode = 9C4024A8
0041CE07 |. 56 PUSH ESI ; |hDevice
0041CE08 |. FF15 04D24F00 CALL DWORD PTR DS:[<&KERNEL32.DeviceIoCo>; DeviceIoControl
0041CE0E |. 56 PUSH ESI ; /hObject
0041CE0F |. 8BD8 MOV EBX,EAX ; |
0041CE11 |. FF15 20D14F00 CALL DWORD PTR DS:[<&KERNEL32.CloseHandl>; CloseHandle
0041CE17 |. 85DB TEST EBX,EBX
0041CE19 |. 74 62 JE SHORT TFlex.0041CE7D
0041CE1B |. 837C24 0C 08 CMP DWORD PTR SS:[ESP+C],8
0041CE20 |. 72 5B JB SHORT TFlex.0041CE7D
0041CE22 |. 8B0F MOV ECX,DWORD PTR DS:[EDI]
0041CE24 |. 33DB XOR EBX,EBX
0041CE26 |. 85C9 TEST ECX,ECX
0041CE28 |. 55 PUSH EBP
0041CE29 |. 8D47 08 LEA EAX,DWORD PTR DS:[EDI+8]
0041CE2C |. 76 42 JBE SHORT TFlex.0041CE70
0041CE2E |. 8B4C24 20 MOV ECX,DWORD PTR SS:[ESP+20]
0041CE32 |. 8B7424 1C MOV ESI,DWORD PTR SS:[ESP+1C]
0041CE36 |> 83FB 0A /CMP EBX,0A
0041CE39 |. 73 35 |JNB SHORT TFlex.0041CE70
0041CE3B |. 8B68 04 |MOV EBP,DWORD PTR DS:[EAX+4]
0041CE3E |. 8B10 |MOV EDX,DWORD PTR DS:[EAX]
0041CE40 |. 85ED |TEST EBP,EBP
0041CE42 |. 77 25 |JA SHORT TFlex.0041CE69
0041CE44 |. 72 08 |JB SHORT TFlex.0041CE4E
0041CE46 |. 81FA FFFF0000 |CMP EDX,0FFFF
0041CE4C |. 77 1B |JA SHORT TFlex.0041CE69
0041CE4E |> 8B29 |MOV EBP,DWORD PTR DS:[ECX]
0041CE50 |. 66:8914AE |MOV WORD PTR DS:[ESI+EBP*4],DX
0041CE54 |. 8B50 08 |MOV EDX,DWORD PTR DS:[EAX+8]
0041CE57 |. 8B29 |MOV EBP,DWORD PTR DS:[ECX]
0041CE59 |. C1EA 10 |SHR EDX,10
0041CE5C |. 66:8954AE 02 |MOV WORD PTR DS:[ESI+EBP*4+2],DX
0041CE61 |. 8B29 |MOV EBP,DWORD PTR DS:[ECX]
0041CE63 |. 45 |INC EBP
0041CE64 |. 83C0 10 |ADD EAX,10
0041CE67 |. 8929 |MOV DWORD PTR DS:[ECX],EBP
0041CE69 |> 8B17 |MOV EDX,DWORD PTR DS:[EDI]
0041CE6B |. 43 |INC EBX
0041CE6C |. 3BDA |CMP EBX,EDX
0041CE6E |.^72 C6 JB SHORT TFlex.0041CE36
0041CE70 |> 57 PUSH EDI ; /hMemory
0041CE71 |. FF15 08D24F00 CALL DWORD PTR DS:[<&KERNEL32.LocalFree>>; LocalFree
0041CE77 |. 5D POP EBP
0041CE78 |. 5F POP EDI
0041CE79 |. 5E POP ESI
0041CE7A |. 5B POP EBX
0041CE7B |. 59 POP ECX
0041CE7C |. C3 RETN
0041CE7D |> 57 PUSH EDI ; /hMemory
0041CE7E |. FF15 08D24F00 CALL DWORD PTR DS:[<&KERNEL32.LocalFree>>; LocalFree
0041CE84 |> 5F POP EDI
0041CE85 |. 5E POP ESI
0041CE86 |. 5B POP EBX
0041CE87 |. 59 POP ECX
0041CE88 . C3 RETN


Входной буфер при этом забит нулями.

Если вернуться по дереву вызовов , видим интересные строки:

0040D070 |. 68 740C5D00 PUSH TFlex.005D0C74
0040D075 |. 68 481B5000 PUSH TFlex.00501B48 ; ASCII "ghIpRlTDffgUg/ZNFWXTHOk1Y0aiiAb59AcMk4WlYN/FxJ9XobUaABmqmLeARH3Q7rGws p8C9jQRez/FGZkPalFFLfjq5lgqt1jA413oonZJ23WHrKVMWi7D/z52gVI+wWHmaJ1G3vz gNZTdDMkjOn+2fja7yH7EV7GsL2t6NsLb/rvWI4JsEGxrjQo1KU8zUxyb3vmdT1VUt3+xl u2zpV9Vkzo9zv3F+O5kufQKcZNah"...
0040D07A |. 68 0040FFFF PUSH FFFF4000
0040D07F |. E8 ECE60000 CALL TFlex.0041B770
0040D084 |. 83F8 0B CMP EAX,0B
0040D087 |. 0F84 86020000 JE TFlex.0040D313
0040D08D |. 33FF XOR EDI,EDI
0040D08F |. 3BC7 CMP EAX,EDI
0040D091 |. 75 3C JNZ SHORT TFlex.0040D0CF

Не похож ли один из входных параметров на ключ расшифровки AES ?
Хотя входной буфер пуст - просто читаем память ключа?

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

С другой стороны, если что пошифровано - то без люча - полный пипец?




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 24 февраля 2007 00:56
· Личное сообщение · #9

> Входной буфер при этом забит нулями

Не могу в это поверить... Вот тут:

...
0041CDF6 |. 68 00200000 PUSH 2000 ; |OutBufferSize = 2000 (8192.)
0041CDFB |. 57 PUSH EDI ; |OutBuffer
0041CDFC |. 68 00200000 PUSH 2000 ; |InBufferSize = 2000 (8192.)
0041CE01 |. 57 PUSH EDI ; |InBuffer
0041CE02 |. 68 A824409C PUSH 9C4024A8 ; |IoControlCode = 9C4024A8
0041CE07 |. 56 PUSH ESI ; |hDevice
0041CE08 |. FF15 04D24F00 CALL DWORD PTR DS:[<&KERNEL32

На что указывают ОБА указателя до и после вызова? По идее - это пакет в драйвер, там должны быть как минимум пассы. Потом размер - 2000 - можешь сдампить все? Пакет может быть шифрован (xor AA+rol).

> Не похож ли один из входных параметров на ключ расшифровки AES ?

Мне кажецца - base64. С HL вообще не работал, но возможно ты прав. Возможно это "вендор id" - типа пасса на доступ к глючу(!)/совсем не те старые два по 16 бит.

> Хотя входной буфер пуст - просто читаем память ключа?

Обязательно надо нарыть номер функции, оно в пакете.

> С другой стороны, если что пошифровано - то без люча - полный пипец?

Для тех кто не знает (я, etc) что в ключе... но AES'а скорее всего (99,8) в нем нет.

-----
The one derivative you manage is the one I abhore (c) Slipknot




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 24 февраля 2007 05:56
· Личное сообщение · #10

При обычном запуске обращается 2 раза:

7C801625 CALL to DeviceIoControl from TFlex.0041CE08
hDevice = 00000170 (window)
IoControlCode = 9C4024A8
InBuffer = 00074EA0
InBufferSize = 2000 (8192.)
OutBuffer = 00074EA0
OutBufferSize = 2000 (8192.)
pBytesReturned = 00FEF854
pOverlapped = NULL
7C801625 Breakpoint at kernel32.DeviceIoControl

7C801625 CALL to DeviceIoControl from TFlex.0041CE08
hDevice = 000002B8
IoControlCode = 9C4024A8
InBuffer = 00075A70
InBufferSize = 2000 (8192.)
OutBuffer = 00075A70
OutBufferSize = 2000 (8192.)
pBytesReturned = 00FEF644
pOverlapped = NULL
7C801625 Breakpoint at kernel32.DeviceIoControl


в обоих случаях буферы забиты нулями ( может 0 - функция инициализации?)

после считывания ключа и преобразовний до ret (см. код выше) получается что все байты в буфере кроме первых 8 преобразуются в #FE

-первый ответ

00074EA0 F0 9F 07 00 80 A0 06 00 EE FE EE FE EE FE EE FE рџ.Ђ .оюоюоюою
00074EB0 EE FE EE FE EE FE EE FE EE FE EE FE EE FE EE FE оюоюоюоюоюоюоюою
00074EC0 EE FE EE FE EE FE EE FE EE FE EE FE EE FE EE FE оюоюоюоюоюоюоюою


-второй ответ
00075A70 08 E0 07 00 78 01 05 00 EE FE EE FE EE FE EE FE а.x.оюоюоюою
00075A80 EE FE EE FE EE FE EE FE EE FE EE FE EE FE EE FE оюоюоюоюоюоюоюою
00075A90 EE FE EE FE EE FE EE FE EE FE EE FE EE FE EE FE оюоюоюоюоюоюоюою


Наверно надо искать далее обращение к этим 8 байтам и смотреть что там происходит.



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 24 февраля 2007 06:13 · Поправил: Tolkin
· Личное сообщение · #11

Хотя я ошибся, это действие функции LocalFree

После получения ответа проверяем ESP+С ( у меня =0) и на выход

0041CE1B |. 837C24 0C 08 CMP DWORD PTR SS:[ESP+C],8
0041CE20 |. 72 5B JB SHORT TFlex.0041CE7D

0041CE7D |> 57 PUSH EDI ; /hMemory = 00074EA0
0041CE7E |. FF15 08D24F00 CALL DWORD PTR DS:[<&KERNEL32.LocalFree>] ; LocalFree
0041CE84 |> 5F POP EDI
0041CE85 |. 5E POP ESI
0041CE86 |. 5B POP EBX
0041CE87 |. 59 POP ECX
0041CE88 . C3 RETN



могут параметры в стеке после DeviceIoControl интерпретироваться как какойто ответ от ключа?



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 24 февраля 2007 07:09
· Личное сообщение · #12

Сори,неувязочка.
Снес эмулятор и поставил заново дрова на HASP

Теперь немного изменилось.

ESP+C --> это ( pBytesReturned = 00FEF854) теперь не равно нулю - драйвер без ключа чтото возвращает, так что надо проверить все заново




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 24 февраля 2007 12:39
· Личное сообщение · #13

Первый кусок мне нравился больше

Немного странно что пакет такой huge (0x2000), но если это точно так, а еще бы я еще раз проверил что это DeviceIo с хэндлом от открытого FEnteDev или Hardlock, то, my humble op, там точно должны валяцца ненулевые чиселки...

Про шифрование я уже писал выше:

xor AAh + ror 4,

но это было в хазп4.

> могут параметры в стеке после DeviceIoControl интерпретироваться как какойто ответ от ключа?

Я такого не видел, вряд ли. Как правило пуляют на вход inBuff=OutBuff одинакого размера (как у тебя в первом примере). Перед входом в DeviceIo - по этим указателям пакет запроса, первая часть открыта (небольшая), потом пошифровано (выше).

> Наверно надо искать далее обращение к этим 8 байтам и смотреть что там происходит.

I would do so. Я бы юзал bpm, скорее всего лучше - как ты говоришь - на "интересные" байты.

PS Еще можно посмотреть память процесса ("s" в сайсе) на предмет пассов глюча (пассы к твоей проге можно попытацца найти на сайте MeteO/ru-board/etc).

-----
The one derivative you manage is the one I abhore (c) Slipknot




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 24 февраля 2007 22:01
· Личное сообщение · #14

С первым вызовом вроде разобрался
Этот код лежит в свободном доступе, входной буфер забит нулями - это не что иное , как определение версии драйвера (IoControlCode = 9C4024A8), остальные вызовы попрятаны в коде, позже выложу лог обращений.

Пассы ключа я знаю: 426B:6981



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 25 февраля 2007 04:08
· Личное сообщение · #15

Следующие обращения к ключу:

7C801625 CALL to DeviceIoControl
hDevice = 0000016C
IoControlCode = 9C402450
InBuffer = 00FEF664
InBufferSize = 6
OutBuffer = 00FEF664
OutBufferSize = 6
pBytesReturned = 00FEF66C
pOverlapped = NULL
7C801625 Breakpoint at kernel32.DeviceIoControl


00FEF664 01 00 00 00 03 00 .... (вход)

00FEF664 01 00 FA FA 57 03 .ъъW (выход)


7C801625 CALL to DeviceIoControl
hDevice = 0000016C
IoControlCode = 9C4024A0
InBuffer = 00FEF66C
InBufferSize = 4
OutBuffer = 00FEF66C
OutBufferSize = 4
pBytesReturned = 00FEF668
pOverlapped = NULL
7C801625 Breakpoint at kernel32.DeviceIoControl

00FEF66C B2 BA EF BE Ієпѕ

00FEF66C BE BA FE 2A ѕєю*

7C801625 CALL to DeviceIoControl
hDevice = 0000016C
IoControlCode = 9C402450
InBuffer = 00FEF618
InBufferSize = 6
OutBuffer = 00FEF618
OutBufferSize = 6
pBytesReturned = 00FEF620
pOverlapped = NULL
7C801625 Breakpoint at kernel32.DeviceIoControl

00FEF618 00 00 00 00 10 9D ....ќ

00FEF618 00 00 FA FA 28 03 ..ъъ(

7C801625 CALL to DeviceIoControl from TFlex.004506DA
hDevice = 0000016C
IoControlCode = 9C402458
InBuffer = 00069D10
InBufferSize = 100 (256.)
OutBuffer = 00069D10
OutBufferSize = 100 (256.)
pBytesReturned = 00FEF688
pOverlapped = NULL
7C801625 Breakpoint at kernel32.DeviceIoControl

00069D10 23 18 6E 52 D8 75 7C CF E5 C8 F0 DF D6 59 E4 EF #nRШu|ПеИрЯЦYдп
00069D20 72 1D AE E6 BC 5D 41 84 0E 61 D0 26 5C 06 C1 ED r®жј]A„aР&Бн
00069D30 6D 88 01 DC 6E 21 F1 DE BA F7 46 79 AE 4C 5F 2D m€Ьn!сЮєчFy®L_-
00069D40 ED 48 19 C0 CD 06 B2 66 8C B1 11 2E 91 F8 E0 21 нHАНІfЊ±.‘ша!
00069D50 4A 06 6D 6B 14 EA C6 B8 3B 75 CA C4 5C 04 69 BE JmkкЖё;uКДiѕ
00069D60 BF 0F 0A 04 2E 3B 80 50 5B DF 2E 78 5C 49 0F 5E ї..;ЂP[Я.xI^
00069D70 B7 50 2C 75 3E 8E 9C AA F4 BA 11 17 D0 4F 85 45 ·P,u>ЋњЄфєРO…E
00069D80 54 51 A9 26 76 3D 85 69 07 E4 7E 4F C1 1B 28 51 TQ©&v=…iд~OБ(Q
00069D90 CC A5 9A 5F D8 92 07 40 69 A2 CB 09 45 73 9B D5 МҐљ_Ш’@iўЛ.Es›Х
00069DA0 06 2D 52 99 DE 2A 4E 7A BE 0E 40 5E B0 EE 25 4C -R™Ю*Nzѕ@^°о%L
00069DB0 7F DA F5 51 6F CF F1 4A 67 BC 21 78 DB FE 6A D2 ЪхQoПсJgј!xЫюjТ
00069DC0 E6 37 AA FB 6F C5 D9 04 17 3F 02 00 62 7F 01 05 ж7ЄыoЕЩ?.b
00069DD0 8E 0A 89 05 86 0A 89 05 8E 1A A9 35 B6 3A C9 D5 Ћ.‰†.‰Ћ©5¶:ЙХ
00069DE0 DE FC 19 B6 52 6D 70 89 04 7E A5 1E CC DB 07 8D Юь¶Rmp‰~ҐМЫЌ
00069DF0 1C 94 09 81 F8 2F F2 2A E6 19 A2 58 5D 68 AB 72 ”.Ѓш/т*жўX]h«r
00069E00 AA 5C 6F A4 55 6F A9 59 6C AB 6C AC 6A A9 F7 89 Єo¤Uo©Yl«l¬j©ч‰

00069D10 23 1A 6A 50 D5 7C 83 D4 E6 CB F7 EC DF 74 F7 08 #jPХ|ѓФжЛчмЯtч
00069D20 80 0B 7E D9 CC 50 2D 7B 26 6C F1 3B AB 35 1A 83 Ђ~ЩМP-{&lс;«5ѓ
00069D30 F6 17 9B 80 1B 8D 2B 25 46 39 9F E8 23 B2 F3 F1 ц›ЂЌ+%F9џи#Іус
00069D40 A1 05 DF 90 C6 06 B9 70 B1 2E 81 84 9B 1A CB E6 ЎЯђЖ№p±.Ѓ„›Лж
00069D50 20 66 54 5C 08 DB 9A F0 43 D4 05 24 75 35 D8 6A fTЫљрCФ$u5Шj
00069D60 20 8E BF 15 9E 06 6D 02 A9 C6 1F C5 B7 50 60 4F Ћїћm©ЖЕ·P`O
00069D70 C7 DC F2 F9 FD 06 4F 18 56 12 4F 1E 1D 6C 15 0D ЗЬтщэOVOl.
00069D80 E2 35 87 FB 23 78 6B 43 DC 9D E1 B1 24 7C 82 95 в5‡ы#xkCЬќб±$|‚•
00069D90 CC D9 02 FC A1 93 3F A9 09 79 E7 47 AB 15 7B E7 МЩьЎ“?©.yзG«{з
00069DA0 4D A7 FF 7A F5 70 E5 3E BD 3C BD 3A BD 40 8D EE M§яzхpе>Ѕ<Ѕ:Ѕ@Ќо
00069DB0 54 9E E4 6B F8 7B 02 48 88 D8 29 BA 4B 9A E5 69 Tћдkш{H€Ш)єKљеi
00069DC0 F7 8F CB 06 41 74 0F 4F 8F 14 02 00 50 62 43 74 чЏЛAtOЏ.PbCt
00069DD0 32 86 D9 AE 08 5D 39 8D EA CF B7 10 64 3D AA 10 2†Щ®]9ЌкП·d=Є
00069DE0 65 37 AD 00 56 51 48 1D 9C 20 77 6F 5B 61 39 BF e7­.VQHњ wo[a9ї
00069DF0 52 2A C0 95 EF 0D 6F 8E EF 14 6B 91 E7 03 5B 40 R*А•п.oЋпk‘з[@
00069E00 13 86 D8 CC A1 35 F2 26 C6 95 09 6A 8C F4 BB A7 †ШМЎ5т&Ж•.jЊф»§

В последнем вызове входные данные каждый раз разные. Далее происходит исключение 6D9.

Указанные 4 вызова образуют HASP API 01 - IsHasp (смотрел аналогию с 8 версией)

Что делать дальше? Куда можно применить указанную тобой шифровку и как?

Ключи для T-Flex высших версий поддерживают и низшие версии, так что думаю шифроваться должно одинаково для совместимости (Верно?)
Если это так, то можно попробовать данные из 10 расшифровать с помощью 8 с эмулятором?
Но входные данные каждый раз меняются, нужна процедура преобразования (на Delfi например) с использованием структуры EDStruct издампа для эмулятора.

Просмотрев логи обращений в 8 я увидел, что IoControlCode = 9C402458 используется для всех вызовов HASP API - 05,06, 32, 3D -- т.е. выходит все данные обмена шифруются?

REG файл для эмулятора могу предоставить, если надо.



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 25 февраля 2007 13:05
· Личное сообщение · #16

Нашел в программе начальный вызов API HASP (только он немного изменен), там и пассы ключа есть, и в буфере входные данные нормальные (незашифрованные еще). Попробую в этом месте поковырять.




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 25 февраля 2007 14:17
· Личное сообщение · #17

Я посмотрел твои первые вызовы. Первые 3 вроде бы действительно "проходные", а вот с буфером длиной 0x100 - действительно чудной. Возможно это тот самый vendor id, мне рассказывали про него. Дешифровка ничего не дала (xorAA/ror 4), калькулятор на всякий случай приложил. Единственное что странновато: если проксорить ответ на запрос, то получаецца:

23 18 6E 52 D8 75 7C CF E5 C8 F0 DF D6 59 E4 EF
^
23 1A 6A 50 D5 7C 83 D4 E6 CB F7 EC DF 74 F7 08
=
00 02 04 02 0D 09 FF 1B 01 03 07 33 09 2D 13 E7

Наверное, это ничего не значит... Надо смотреть использование и/или образование запроса, возможно там еще один алго дешифровки.

Завтра напишу подробнее.

dfaa_25.02.2007_CRACKLAB.rU.tgz - xorAA.rar

-----
The one derivative you manage is the one I abhore (c) Slipknot




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 26 февраля 2007 07:14
· Личное сообщение · #18

Да, верно, первые вызовы до вызова с буфером 0х100 получают сведения о версии драйвера , именно поэтому не работал эмулятор от глаши и в нем ничего не отображалось, т.к. в нем используются дрова от HASP4, в котором по видимому первое обращение с буфером 0х200 не срабатывало (возвращались одни нули). Наверно новый драйвер от HASP HL поддерживает новые функции

кстати, есть ли инфа о новых API в HASP HL, и способах их вызова(параметры), ничего не сменилось?

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

Не знает ли кто, есть ли дрова для эмулятора от глаши для HASP HL? или другие эмуляторы с поддержкой HASP HL?



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 26 февраля 2007 07:26 · Поправил: Tolkin
· Личное сообщение · #19

значения исходно буфера 0х100 до всяких преобразований:
сначала:
00069D10 00 00 00 00 00 00 04 00 6B 42 00 00 81 69 00 00 .......kB..Ѓi..
00069D20 00 00 00 00 00 00 00 00 00 00 00 00 01 00 78 03 .............x
00069D30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00069D40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00069D50 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 ...............
00069D60 00 00 48 00 00 00 00 00 00 00 00 00 00 00 00 00


затем
00069D10 03 55 00 00 00 00 04 00 6B 42 00 00 81 69 00 00 U.....kB..Ѓi..
00069D20 00 00 00 00 00 00 00 00 00 00 00 00 01 00 78 03 .............x
00069D30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00069D40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00069D50 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 ...............
00069D60 00 00 48 00 00 00 00 00 00 00 00 00 00 00 00 00


а потом до вызова DeviceIoControl преобразуются и не один раз в хрень, каждый раз разную.

ясно видно пассы ключа 426B:6981



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 26 февраля 2007 07:48 · Поправил: Tolkin
· Личное сообщение · #20

Этот вызов в эмуляторе отображается как команда 00, значение регистров возврата
AX 0000 BX 13A7 CX 001D DX 3892

выходной буфер после всех преобразований
00069D10 03 55 00 00 00 00 04 00 6B 42 00 00 81 69 00 00 U.....kB..Ѓi..
00069D20 00 00 00 00 00 00 00 00 00 00 00 00 01 00 78 03 .............x
00069D30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00069D40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00069D50 00 00 00 00 00 00 74 54 D5 B3 00 00 81 00 00 00 ......tTХі..Ѓ...
00069D60 00 00 48 00 00 00 00 00 00 00 00 00 00 00 00 00 ..H.............


Еще раз повторюсь, что эмулятор работает только как с HASP4



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 26 февраля 2007 07:52 · Поправил: Tolkin
· Личное сообщение · #21

Для HASP4
Service1=Service 0 (00h) : (It is not documentary)
Description1=Initialize HASP key.

Как проверить, верно ли он все вернул, и не надо ли в этом вызове что-нить изменять?

Номера остальных команд: 08, 06, 05, 4Е в эмуляторе

Service1=Service 8 (08h) : CheckHaspGeneration
Description1=Checks if connected key is a HASP4 generation key.

Service1=Service 6 (06h) : HaspID
Description1=Determine the HASP ID number.

Service1=Service 5 (05h) : HaspStatus
Description1=Check the type of HASP connected to the computer. Also check to which

Service1=Service 78 (4Eh) : HaspID
Description1=Determine the Time HASP ID number.

Не уверен что для HASP HL значения вызовов теже




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 26 февраля 2007 10:49 · Поправил: Chingachguk
· Личное сообщение · #22

> Номера остальных команд: 08, 06, 05, 4Е в эмуляторе

Ты хочешь сказать что видишь как прога зовет эти функи?

ps На ru-board AlexVel сегодня изложил достаточно интересную вводную информацию по этому поводу, втч про пакет 0x100.

-----
The one derivative you manage is the one I abhore (c) Slipknot




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 26 февраля 2007 12:08 · Поправил: Tolkin
· Личное сообщение · #23

да, именно эти номера отображаются в эмуляторе
а в проге на DeviceIoControl для всех этих команд один размер пакета 0х100 и
один номер IoControlCode = 9C402458

не нашел что-то я инфы, скинь ссылку плиз




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 26 февраля 2007 12:59
· Личное сообщение · #24

forum.ru-board.com,
регистрация нужна,
затем в "андеграунд->варезник",
отселектировать темы по "hasp"

-----
The one derivative you manage is the one I abhore (c) Slipknot




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 26 февраля 2007 13:24 · Поправил: Tolkin
· Личное сообщение · #25

Спасибо, надыбал.
Но маловато инфы. Интересно все же, то что у меня отображается в эмуле для HASP4 - полная эрунда?

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




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 26 февраля 2007 23:32
· Личное сообщение · #26

Полагаю, все функи кроме новых эмуляцца нормально. Но это только гипотеза. Обычно если нет ключа но есть корректный драйвер, то все заканчивается на 2-3 вызове (например на 5-ой функе) - приложению этого достаточно чтобы сделать "выводы".

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

ps check PM

-----
The one derivative you manage is the one I abhore (c) Slipknot




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 28 февраля 2007 06:30 · Поправил: Tolkin
· Личное сообщение · #27

=== ЧИТАТЬ ВСЕМ (новичкам) ===

Я около 2х недель топтался на месте с этой прогой а на путь истинный меня так и не направили ( спасибо хоть Chingachguk откликнулся).

И вот за один вечер я прозрел и решил выложить свои мыслишки.
А все началось с того, что от нехватки информации я пошел на ... сайт Алладина и там нашел ответы на почти все свои вопросы

Итак, что я там нашел:
- HASP_HL_Guide_RU.zip - руководство пользователя HASP HL на русском языке, где описаны все новые функции (20 штук) параметры их вызовов, возвращаемые данные и коды ошибок.(в аттач не влезает)

-две dll с HASP API для HASP4 и HASP hl.

Проанализировав свою прогу я увидел, что вней код HASP API , такой же как и код в DLL, т.е. теперь поиск HASP API в программах становиться тривиальной задачей и может быть автоматизирован (по сигнатурам например).

Порывшись в инете я публичных эмуляторов для HASP HL не нашел

И тут меня осенило: почему все питаются писать эмуляторы в виде драйверов - это и сложно, и необходимо физически эмулировать все HASP API (а для HASP HL функции hasp_decrypt() Дешифрует буфер с помощью алгоритма AES и hasp_encrypt() Шифрует буфер с помощью алгоритма AES реализовать можно только табличным способом наверно), что для меня лично невероятно сложно.

Но зачем все так усложнять?
Ведь тот же логгер, дампер и эмулятор достаточно просто реализовать даже начинающему в RING 3, перехватывая сами HASP API !

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


Именно так я и попробую сломать свою прогу



5cd8_28.02.2007_CRACKLAB.rU.tgz - dll.rar



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 28 февраля 2007 07:37
· Личное сообщение · #28

Справочник по HASP HL API (выдержки)

aae5_28.02.2007_CRACKLAB.rU.tgz - Справочник по HASP HL API.txt




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 28 февраля 2007 11:53 · Поправил: Chingachguk
· Личное сообщение · #29

> и необходимо физически эмулировать все HASP API

На самом деле число API для приложения часто более has diversity чем число функций ключа

А скажи еще раз plz самые последние данные по тому, какие функи вызываюцца у твоего приложения.

-----
The one derivative you manage is the one I abhore (c) Slipknot




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 28 февраля 2007 22:06 · Поправил: Tolkin
· Личное сообщение · #30

Достал ключик к проге только для 9 версии
вручную вызовы HASP API проверю и логи выложу.


. 1 . 2 . >>
 eXeL@B —› Вопросы новичков —› Помогите разобраться с прогой
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати