Сейчас на форуме: Magister Yoda, johnniewalker, Kybyx, vsv1, r0lka, -Sanchez-, testrev1337 (+3 невидимых) |
eXeL@B —› Крэки, обсуждения —› Взлом программы с RSA шифрованием написанной на Delphi с использованием Turbo Power LockBox |
<< . 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 28 октября 2009 07:12 · Поправил: fl4r3 · Личное сообщение · #1 Добрый день. Вчера мне потребовалось взломать программу для личного пользования и взявшись за IDA Pro я начал исследование. После поиска по GetWindowTextA и кросс референсам были найдены процедуры выводящие итог регистрации (удачная\неудачная). Потрейсив код немного выше были найдены и сами процедуры. После этого я открыл Hiew, нашел данные строки и попробовал изменить один условный переход. Но при запуске программы я получал ошибку и вываливался в отладчик (Microsoft Visual Studio 2008), который напрочь зависал при передаче ему управления. Ага, опять продукт микрософта подумал я, и решил попробовать что нибудь другое. Перешел в IDA Pro и там попробовал дебажить. IDA тоже не справился. Я начал подумывать что может заменил неправильно переход и каким нибудь образом стек становился несбалансированным и из-за этого программа вылетала. Взял исходный exe опять и заменил в конце файла один байт в строке с копирайтами (с 2003 года заменил на 2004). Запустил. Не работает. Тут я начал подумывать о том что файл упакован. Но при ручном осмотре и автоматическом различными анпакерами это не подтвердилось. Значит дело в другом. С помощью PEiD нашел список используемых криптографических функций. Среди них пара бейз64, crc32, blowfish, LockBox и список простых чисел. Список простых чисел наверняка используется для вычисления RSA ключа. Переходя по разным адресам где располагаются функции LockBox (например RsaEncryptFile) я начал исследование самой защиты. Я знал что можно будет написать брутфорсер зная числа p, q, e. Но в данном конкретном случае ничего не вышло. Ребята, посмотрите пожалуйста данный exe - достаточно интересная защита. Ссылка на exe: ifolder: P.S. Мне не нужна конкретная реализация, подскажите просто в каком направлении копать. |
|
Создано: 30 октября 2009 20:38 · Поправил: fl4r3 · Личное сообщение · #2 Проверяю я передаваемые аргументы. Например, что вот это такое: add esp, 0FFFFFFF4h А что вот это movzx esi, ds:word_592B4C[eax*2] если word по этому адресу равен 10h (мое предположение, что это размер модулуса 10h = 16 символов) movzx edi, ds:word_592B58[eax*2] а по этому просто 5. Слишком много несовсем понятных констант и аргументов. P.S. Ткните меня носом в модулус N и паблик экспоненту и я буду Вам премного благодарен. |
|
Создано: 31 октября 2009 03:31 · Поправил: fl4r3 · Личное сообщение · #3 Функция дешифрования в Дельфи для 256 битного ключа: function DecryptRSA256(PrivateKey : TLbRSAKey; const InBlock : TRSACipherBlock256; var OutBlock : TRSAPlainBlock256) : Longint; { decrypt ciphertext block with 256-bit RSA private key } begin if (PrivateKey.KeySize <> aks256) then raise Exception.Create(sRSABlockSize256Err); Result := DecryptRSAEx(PrivateKey, @InBlock, @OutBlock); end; |
|
Создано: 31 октября 2009 09:03 · Личное сообщение · #4 |
|
Создано: 31 октября 2009 09:49 · Поправил: fl4r3 · Личное сообщение · #5 Hugo Chaves Ну попробуй найди все функции компонента в exe файле... Ты думаешь ты просто возьмешь в ИДЕ в окне Names введешь DecryptRSAEx, или aDecryptRSAEx и получишь результат? Там просто таких функций нет. Приходится искать по XRef-ам и Cross-Ref-ам... Если так просто и дело 10 минут, напиши сюда значение модулуса (N), которое есть в самом exe. На самом деле просто попробуй потрейсить код немного и ты поймешь причины столь долгий прений... |
|
Создано: 31 октября 2009 10:21 · Личное сообщение · #6 |
|
Создано: 31 октября 2009 10:32 · Личное сообщение · #7 Ок. Возьмем конкретный пример. Инициализация программы. Есть три варианта: 1) Ей нужно вывести версия 1.5.0 2) Ей нужно вывести Professional Version: 1.5.0 3) Ей нужно вывести Dealer Version: 1.5.0 Функция проверки: Code:
Вопрос: Ну не понимаю я где оно проверяет и по каким параметрам что выводить... По тому call выше call sub_4EB21C вообще библиотечная функция GetTickCount, какое отношение она имеет к проверке на зареганность - хз. Я же на форум за помощью обратился. Пытаюсь разобратся. Может не хватает знаний, но сюда люди за этим и приходят. |
|
Создано: 31 октября 2009 10:35 · Личное сообщение · #8 |
|
Создано: 31 октября 2009 10:47 · Личное сообщение · #9 fl4r3 пишет: Вопрос: Ну не понимаю я где оно проверяет и по каким параметрам что выводить... По тому call выше call sub_4EB21C вообще библиотечная функция GetTickCount, какое отношение она имеет к проверке на зареганность - хз. Я же на форум за помощью обратился. Пытаюсь разобратся. Может не хватает знаний, но сюда люди за этим и приходят. Там есть 004EB239 |> \8A43 25 MOV AL,BYTE PTR DS:[EBX+25] 004EB23C |. 8A53 24 MOV DL,BYTE PTR DS:[EBX+24] которые при правильном серийнике пишутся вроде тут 004EB033 . 8856 24 MOV BYTE PTR DS:[ESI+24],DL 004EB036 . 8856 25 MOV BYTE PTR DS:[ESI+25],DL если BYTE PTR DS:[EBX+25] и BYTE PTR DS:[EBX+24] = 02h, то про версия, если 03h то дилер |
|
Создано: 31 октября 2009 11:06 · Поправил: Hugo Chaves · Личное сообщение · #10 fl4r3 CODE:004E9554 RSAFormatBlock CODE:004E9618 RSAEncryptBigInt CODE:004E9754 GenerateRSAKeysEx CODE:004E9990 EncryptRSAEx CODE:004E9A70 DecryptRSAEx Вот тебе для начала . Далее смотри исходники . Из каждой из выше перечисленных функций вызываются ещё функции компонента. Я думаю теперь ты восстановишь всю картину. Add-On Ну и вот тебе функция CODE:004E6D48 PowerAndMod как её назвали разработчики и её параметрами являются Key.Exponent и Key.Modulus |
|
Создано: 31 октября 2009 11:23 · Поправил: fl4r3 · Личное сообщение · #11 |
|
Создано: 31 октября 2009 17:10 · Поправил: crypto · Личное сообщение · #12 fl4r3 Попробуй моим IDR просканить, много чего интересного увидишь (например, классы с именами FA250CD052 или TOgProtectExe). По крайней мере проанализируешь дерево классов и все модули, к которым у тебя интерес (LbCipher, LbAsym, LbRSA...) Да, и тебе достаточно скачать базу знаний для Дельфи 7 (файл kb7.bin, остальные kb*.bin тебе не нужны). |
|
Создано: 01 ноября 2009 12:30 · Поправил: fl4r3 · Личное сообщение · #13 Hugo Chaves У меня по адресу 004E6D48 в ИДЕ что-то явно другое... Ты какую версию смотришь? С оф. сайта или с айфолдера? P.S. И эти все функции: CODE:004E9554 RSAFormatBlock CODE:004E9618 RSAEncryptBigInt CODE:004E9754 GenerateRSAKeysEx CODE:004E9990 EncryptRSAEx CODE:004E9A70 DecryptRSAEx у меня не совпадают. У меня по этим адресам что-то другое, но не они... |
|
Создано: 01 ноября 2009 20:01 · Личное сообщение · #14 |
|
Создано: 02 ноября 2009 10:09 · Поправил: DMD · Личное сообщение · #15 Hugo Chaves пишет: Найдёшь функции , в отладчике в конце концов поставишь бряк куда надо и поймаешь свой modulus ... есть шанс что не поможет... поскольку ТС не озвучил какая схема регистрации применена в таргета. имя + е-mail + SN? или вводится только один какой-то стринг (не важно в каком формате) ? если вариант 1) - то есть шанс при декрипто SN (обычно это делается для верификации name+e-mail+SN) выловить и Public модуль и Public экспоненту, определить размерность RSA ну и если все будет благоприятно - заняться факторизацией. если вариант 2) - ловить нечего. т.е если для регистрации вводится только один какой-то стринг (не важно в каком формате) и по нему идет декрипто кода. в этом случае по DecryptRSAEx можно узнать только Public модуль ... а Public экспонента все равно будет неверна, поскольку вводится как SN. so, согласен - дискуссия явно "ушла" не туда,,, а посему, нужно вернуться к истокам... для начала: - какова схема регистрации? - не плохо было бы посмотреть на параметры DecryptRSAEx и дампы памяти по этим адресам (в Олли!) + желательно копия экрана кода в округе второго параметра DecryptRSAEx fl4r3 пишет: Функция дешифрования в Дельфи для 256 битного ключа я бы не советовал делать преждевременные выводы о размерности примененного RSA... DecryptRSAEx (как функция) сама определяет используемую размерность ключей - по полям размерности экспоненты и модуля в контексте PublicKey. Просто в компоненте есть обвертки под "стандартные размеры". |
|
Создано: 02 ноября 2009 10:21 · Поправил: fl4r3 · Личное сообщение · #16 DMD Схема регистрации такова: вводится только одна строка неизвестных размеров. Интересный момент в том, что на основе введенного стринга видимо как то находятся Name и Company, потому что изначально они для ввода не доступны. Ниже в аттаче картинка с регистрационным окном. crypto По Citadel нашел только скудный сайт авторов и ничего больше. Насколько я понимаю это что то типа обфускатора кода. Программа очень активно использует SEH (Structured Exception Handling) в своём механизме защиты. То есть нет "неправильных" переходов. Есть только "неправильные" ексепшены 4919_01.11.2009_CRACKLAB.rU.tgz - crome_reg.JPG |
|
Создано: 02 ноября 2009 10:48 · Поправил: DMD · Личное сообщение · #17 fl4r3 пишет: Схема регистрации такова: вводится только одна строка неизвестных размеров. Интересный момент в том, что на основе введенного стринга видимо как то находятся Name и Company, потому что изначально они для ввода не доступны. Ниже в аттаче картинка с регистрационным окном. уже неплохо... очевидно, что введенный стринг (его формат пока не обсуждаем) должен быть подвергнут Decrypto.. в результате должны получить Name, Company ну и может быть ID... => должно быть DecryptRSAEx => (еще раз повторюсь) знаем контекст PublicKey => знаем Public модуль и экспоненту + размерность. и вот что важно: пока что нет ни одного намека на декрипт кода - возможно это следующий вызов DecryptRSAEx (если таковой вызов вообще имеет место быть) поэтому я и говорил об тщательном осмотре вокруг места куда пишется декриптованный блока: код это или данные? скорее всего - данные => должно быть какое-то сравнение с ID... если его нет => в рег.стринге только Name + Company (хотя это не совсем логично) но и они как-то адресуются относительно начала декриптованного блока. кстати, сейчас проверю, позволяет ли DecryptRSAEx переписывать блоки сами в себя ps да, согласен, чего чего а SEH в компонете в достатке |
|
Создано: 02 ноября 2009 11:09 · Поправил: DMD · Личное сообщение · #18 да, DecryptRSAEx позволяет так делать: ключи 256 бит Message 00402000 31 32 33 34 35 36 37 38 00 12345678. Cipher 00402070 C3 97 A0 92 ED 2A 80 B1 A6 3F C4 77 72 9E BA 3B 00402080 8B 40 A3 15 AB 09 9B E1 2F 7C 9B 99 C9 0A E2 6F Message after Decrypto 00402070 31 32 33 34 35 36 37 38 A6 3F C4 77 72 9E BA 3B 12345678 00402080 8B 40 A3 15 AB 09 9B E1 2F 7C 9B 99 C9 0A E2 6F |
|
Создано: 02 ноября 2009 14:40 · Личное сообщение · #19 |
|
Создано: 02 ноября 2009 16:52 · Личное сообщение · #20 fl4r3 пишет: Кажется, мои старания будут безрезультатны, потому что я не знаю что делать дальше. Вот так вот сразу hende hoch und Gitler kaput ? Если начинка регистрационного кода известна , то как минимум есть 2 варианта решения: 1) брутфорс RSA 2) просто вырубить дешифрацию регистрационного кода и подставлять "голый" текст Если начинка неизвестна , то всё равно думаю как-то можно определить что там должно быть ... |
|
Создано: 02 ноября 2009 17:00 · Поправил: DMD · Личное сообщение · #21 ну почему же?! все не так уж и плохо... во-первых, версия с оффсайта допускает исправления кода, по крайней мере то что я поправил в exe на запуске не отразилось. так что контроль кода может и есть... но кусками во-вторых, схема регистрации стала немного понятнее... хотя есть и темные места. в-третьих, поскольку софт скажем так, не стандартный - нужно понять/узнать самое главное: Какие ограничения присутствуют в не зарегистрированной версии? что-то я там открыл.. построились какие-то графики.. экспорт чего-то там в файл выполнился.. и что дальше?! ps/ теоретически, если допустить что я прав и в софте имеем дело с RSA 320 bit, можно попробовать факторизовать экспоненту (это она в перевернутом виде, конечно) 69 95 59 0B 94 EF 44 FB 13 E3 8B A8 4A 1E CB 79 47 45 39 38 42 99 D1 2D E3 EF DF 90 BF 5E 26 86 1A и поэкспериментировать с созданием рег.стринга. но это совсем не комильфо - угадайка... почти ничем не подкрепленная мысль, одни предположения.. pps/ а вот если в доступности есть рабочий комплект любой версии - вот это было бы интересно. отписаться можно в РМ |
|
Создано: 02 ноября 2009 17:02 · Поправил: DMD · Личное сообщение · #22 |
|
Создано: 02 ноября 2009 22:34 · Личное сообщение · #23 В Pro или Dealer версии открываются функции даталогинга (Datalogging). Есть уже взломанная дилерская версия 1.1.11h. Могу выложить куда-нибудь. Но анализируя ее я ничего полезного не вынес для себя, даже екзешники различаются очень сильно по размеру: версия 1.1.11h - 1.3 мегабайта, 1.5.0 - 1.7 мегабайта. Но функции шифрования RSA есть... Разницу в функционале можно увидеть если запустить 1.1.11h, потом меню Файл и там Settings там должен быть сверху таб Tuner Logging. |
|
Создано: 02 ноября 2009 22:46 · Личное сообщение · #24 Так. Продвижение. Со мной поделились рег стрингом для серийного номера: Crome Serial ID: C027103DA-057191-026405-065535FD-063746 Reg String: rNK6yLAHJAJ4QZcfv/kidmtzruXSSW/fAjbXQdePDUwjoOmIjEyHf3DAobW0201d4B8ji9 wrZ2OOMrkzxO7DgoLHtMiFt48sgVj8vqJU40Ab24QlsHa2XLm92t8itYYteWDkrJmrqova gpY87pNaKltiDxp/xvkJnRgJ/UhGlCmlhEAJMRCBNL2sb1qcWEoRz7qu6HgXPF/Yf6yQu/ S9PJa1Lr24DpKb0GZjpFU6xGtzSQUqopp/Ch1MuTzVGyh5 |
|
Создано: 02 ноября 2009 23:15 · Поправил: fl4r3 · Личное сообщение · #25 Всё. Поломал Делается все просто Я был прав насчет функции GetTickCount. Патчим начиная с адреса 0x004EB21C 8 байт: B804000000C39090 Запускаем. Получаем дилерскую версию Можно патчить и на B803000000C39090, тогда получим Pro версию. Как кто-то писал выше 03h - про, 04h - дилер. Всем спасибо за поддержку и подсказки. |
|
Создано: 03 ноября 2009 08:16 · Личное сообщение · #26 |
|
Создано: 03 ноября 2009 09:31 · Поправил: fl4r3 · Личное сообщение · #27 Hugo Chaves Я бы с удовольствием поставил бы брутфорсер раскладывать модуль на праймы, узнал бы их, экспоненту публичную и т.д. Но время поджимает - раз. Второе - я тупо не могу их найти в коде, я вообще был в тупике до того времени как DMD не вмешался в дискуссию и потом мне не прислали рег стринг для другого компа. Если у него будет желание мне помочь, то я впринципе готов этим занятся, т.к. самому интересно. |
|
Создано: 03 ноября 2009 15:12 · Поправил: DMD · Личное сообщение · #28 как обычно есть два пути: - превратить текущую версию (1.5.3) в нечто подобное что в аттачменте. (работоспособность не проверял ибо неизвестно как это делать ) (serial id уже так сказать засвечен, поэтому картинка никому не должна повредить ) - серъезно подойти к проблеме: те. разобраться с декрипто, получить public экспоненту и модуль, факторизовать по мере сил и возможностей, ну и потом (если повезет) собрать reg.string.. то что reg.string должен быть прикрыт base64 - это пока не суть. фактически, reg.string должен в себе скрывать нечто подобное: (ASCII) ххххххххххх.zzzz.AAAAAAAAAA.BBBBBBBBBBB.2.2009-02-11.1. xxxxxxxxxxx - код привязки к компу zzzz - аналогично потом пара произвольных текстовых стрингов типа название, адрес.. 2- код версии dealer/pro дата 1- хз! p/s "." equ 0x0D декрипто выполняемся из reg.string приведенного в hex вид кусками по 5 байт вот здесь... Code:
serial id - скорее всего какая-то свертка/самопальный хеш для передачи кодов привязки к компу автору для генерации reg.string. коды привязки к компу можно получить при трэйсинге на двух остановах. pps/ "Datalogging" такого во всех меню я не нашел... или не там искал?! 47f3_03.11.2009_CRACKLAB.rU.tgz - !_Crome_1.5.3_pro_.jpg |
|
Создано: 03 ноября 2009 19:09 · Личное сообщение · #29 |
|
Создано: 03 ноября 2009 21:49 · Поправил: zeppe1in · Личное сообщение · #30 PublicKey.Exponent D73E собственно вот декодер/енкодер лицензий. осталось подобрать конечный рег стринг и оформить кейген) ----- zzz |
|
Создано: 03 ноября 2009 22:56 · Личное сообщение · #31 |
<< . 1 . 2 . 3 . >> |
eXeL@B —› Крэки, обсуждения —› Взлом программы с RSA шифрованием написанной на Delphi с использованием Turbo Power LockBox |