![]() |
eXeL@B —› Вопросы новичков —› Помогите разобраться с прогой |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 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 ![]() |
|
Создано: 18 февраля 2007 00:48 · Личное сообщение · #2 |
|
Создано: 19 февраля 2007 03:44 · Личное сообщение · #3 |
|
Создано: 20 февраля 2007 05:42 · Личное сообщение · #4 Да , прога написана с использованием MFC (MFC80U.dll) - но мне это ничего не дает,я в MFC не разбираюсь. А с класом окон ничего не путаю - именно Afx:00400000:8:00010011:00000010:00000000 - что панели, что меню, что основное окно проги( смотрел разными SPY++). Заблокированы основные пункты меню - "открыть" и т.д и связанные с пунктами кнопки на панели и акселераторы. С разблокировкой кнопок панли ничего не вышло - не нашел как изменять их св-ва для даного класа. Для меню попроще - стандартные API - EnableMenuItem - разблокировать можно - но при нажатии на них ничего не происходит (гдето проверяется что-то?). А разобраться со значениями параметров EnableMenuItem пока не получилось, там много переходов на разные процедуры, повторяющиеся неоднократно ![]() ![]() |
|
Создано: 21 февраля 2007 01:29 · Личное сообщение · #5 |
|
Создано: 22 февраля 2007 11:09 · Личное сообщение · #6 Функции DeviceIoControl для общения с ключем я нашел.Но сами вызовы завуалированы в куче кода со множеством переходов, а так как самого ключа у меня нет то и разобраться где в конечном итоге происходит определение, что ключа нет, у меня не выходит, очень мало опыта ![]() Как я понял, для ломки прог с HASP нужно иметь сам ключик. С другой стороны - в даной проге (если смотреть предыдущие версии) толку от такой защиты мало, так как снимается она изменением 5 байт в программе.Просто в даной версии нововведение - по умолчанию прога запускается в неактивном режиме(все функции деактивированы), а в предыдущих версиях - по дефолту все нормально и активно. Хотя как именно сделана прога - изначально сделана неактивной и активируется только при наличии ключа или изначально активна но при отсутствии ключа деактивируется я не понял, а от этого зависит направление поиска. Как можно это определить? ![]() |
|
Создано: 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 ![]() |
|
Создано: 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
Входной буфер при этом забит нулями. Если вернуться по дереву вызовов , видим интересные строки: 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 мы только убирали переходы на выходы из программы (ключ не эмулировали) и прога отлично работала. Не думаю, что защита сильно изменилась (только стало все неактивно). С другой стороны, если что пошифровано - то без люча - полный пипец? ![]() |
|
Создано: 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 ![]() |
|
Создано: 24 февраля 2007 05:56 · Личное сообщение · #10 При обычном запуске обращается 2 раза: 7C801625 CALL to DeviceIoControl from TFlex.0041CE08
в обоих случаях буферы забиты нулями ( может 0 - функция инициализации?) после считывания ключа и преобразовний до ret (см. код выше) получается что все байты в буфере кроме первых 8 преобразуются в #FE -первый ответ 00074EA0 F0 9F 07 00 80 A0 06 00 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.оюоюоюою
Наверно надо искать далее обращение к этим 8 байтам и смотреть что там происходит. ![]() |
|
Создано: 24 февраля 2007 06:13 · Поправил: Tolkin · Личное сообщение · #11 Хотя я ошибся, это действие функции LocalFree После получения ответа проверяем ESP+С ( у меня =0) и на выход 0041CE1B |. 837C24 0C 08 CMP DWORD PTR SS:[ESP+C],8
могут параметры в стеке после DeviceIoControl интерпретироваться как какойто ответ от ключа? ![]() |
|
Создано: 24 февраля 2007 07:09 · Личное сообщение · #12 |
|
Создано: 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 ![]() |
|
Создано: 24 февраля 2007 22:01 · Личное сообщение · #14 |
|
Создано: 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 файл для эмулятора могу предоставить, если надо. ![]() |
|
Создано: 25 февраля 2007 13:05 · Личное сообщение · #16 |
|
Создано: 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 Наверное, это ничего не значит... Надо смотреть использование и/или образование запроса, возможно там еще один алго дешифровки. Завтра напишу подробнее. ![]() ----- The one derivative you manage is the one I abhore (c) Slipknot ![]() |
|
Создано: 26 февраля 2007 07:14 · Личное сообщение · #18 Да, верно, первые вызовы до вызова с буфером 0х100 получают сведения о версии драйвера , именно поэтому не работал эмулятор от глаши и в нем ничего не отображалось, т.к. в нем используются дрова от HASP4, в котором по видимому первое обращение с буфером 0х200 не срабатывало (возвращались одни нули). Наверно новый драйвер от HASP HL поддерживает новые функции кстати, есть ли инфа о новых API в HASP HL, и способах их вызова(параметры), ничего не сменилось? на даный момент первые ответы я сэмулировал как для нового драйвера, так что эмулятор от глаши теперь работает и хоть можно просмотреть логи запросов к ключу (если в параметрах функций ничего не поменялось - то можно доверять), логи выложу. Не знает ли кто, есть ли дрова для эмулятора от глаши для HASP HL? или другие эмуляторы с поддержкой HASP HL? ![]() |
|
Создано: 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..
затем 00069D10 03 55 00 00 00 00 04 00 6B 42 00 00 81 69 00 00 U.....kB..Ѓi..
а потом до вызова DeviceIoControl преобразуются и не один раз в хрень, каждый раз разную. ясно видно пассы ключа 426B:6981 ![]() |
|
Создано: 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..
Еще раз повторюсь, что эмулятор работает только как с HASP4 ![]() |
|
Создано: 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 значения вызовов теже ![]() |
|
Создано: 26 февраля 2007 10:49 · Поправил: Chingachguk · Личное сообщение · #22 |
|
Создано: 26 февраля 2007 12:08 · Поправил: Tolkin · Личное сообщение · #23 |
|
Создано: 26 февраля 2007 12:59 · Личное сообщение · #24 |
|
Создано: 26 февраля 2007 13:24 · Поправил: Tolkin · Личное сообщение · #25 Спасибо, надыбал. Но маловато инфы. Интересно все же, то что у меня отображается в эмуле для HASP4 - полная эрунда? Но если глянуть на буфер даных до и после вызова (те что не зашифрованы) то видно, что структура такаяже как и до вызова, добавляется несколько байт.Т.е можно предполагать, что оно все же эмулируется? ![]() |
|
Создано: 26 февраля 2007 23:32 · Личное сообщение · #26 Полагаю, все функи кроме новых эмуляцца нормально. Но это только гипотеза. Обычно если нет ключа но есть корректный драйвер, то все заканчивается на 2-3 вызове (например на 5-ой функе) - приложению этого достаточно чтобы сделать "выводы". Однако раз после какой-то функи все обрывается, то отсюда может следовать что все же чего-то ему в конце-концофф не понравилось. Мое имхо счас - тип (поколение) ключа. ps check PM ----- The one derivative you manage is the one I abhore (c) Slipknot ![]() |
|
Создано: 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). Именно так я и попробую сломать свою прогу ![]() ![]() ![]() |
|
Создано: 28 февраля 2007 07:37 · Личное сообщение · #28 Справочник по HASP HL API (выдержки) ![]() ![]() |
|
Создано: 28 февраля 2007 11:53 · Поправил: Chingachguk · Личное сообщение · #29 > и необходимо физически эмулировать все HASP API На самом деле число API для приложения часто более has diversity чем число функций ключа А скажи еще раз plz самые последние данные по тому, какие функи вызываюцца у твоего приложения. ----- The one derivative you manage is the one I abhore (c) Slipknot ![]() |
|
Создано: 28 февраля 2007 22:06 · Поправил: Tolkin · Личное сообщение · #30 |
. 1 . 2 . >> |
![]() |
eXeL@B —› Вопросы новичков —› Помогите разобраться с прогой |