Сейчас на форуме: 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. Мне не нужна конкретная реализация, подскажите просто в каком направлении копать. |
|
Создано: 28 октября 2009 10:20 · Личное сообщение · #2 |
|
Создано: 28 октября 2009 10:22 · Личное сообщение · #3 Пиши лоадырь,зачем тратить время зря на криптоговна .486 .model flat, stdcall option casemap :none include windows.inc include masm32.inc include user32.inc include kernel32.inc include shell32.inc includelib masm32.lib includelib user32.lib includelib kernel32.lib includelib shell32.lib .data Exe db "crome.exe",0 App db "crome.exe",0 Error1 db "Could not find crome.exe",0 .data? Sinfo STARTUPINFO <> Pinfo PROCESS_INFORMATION <> WByte DWORD ? ; байт для чтения RByte DWORD ? байт для записи Adr DWORD ? ; адрес для патча n DWORD ? ; кол-во байтов .code start: invoke CreateProcess,addr Exe,NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,addr Sinfo,addr Pinfo CMP EAX,0 JNZ PATCH INVOKE MessageBox,NULL,addr Error1,addr App,MB_ICONERROR INVOKE ExitProcess,0 PATCH: MOV Adr, 005422A5h ;патч на Professional version, остальное сам копай MOV WByte,31h ; байт для патча CALL PATCHER invoke CloseHandle,Pinfo.hThread INVOKE ExitProcess,0 ;--------------------------------- PATCHER PROC INVOKE ReadProcessMemory,Pinfo.hProcess,Adr,addr RByte,1,n INVOKE WriteProcessMemory,Pinfo.hProcess,Adr,addr WByte,1,n ;--------------------------------- RET PATCHER ENDP end start |
|
Создано: 28 октября 2009 12:03 · Личное сообщение · #4 |
|
Создано: 28 октября 2009 12:27 · Личное сообщение · #5 |
|
Создано: 28 октября 2009 12:59 · Личное сообщение · #6 fl4r3 пишет: С помощью PEiD нашел список используемых криптографических функций. Среди них пара бейз64, crc32, blowfish, LockBox и список простых чисел. Список простых чисел наверняка используется для вычисления RSA ключа. Вовсе не обязательно. Если, например, KryptoAnalyzer определяет число как большое, то это вовсе еще не значит, что оно используется для алгоритма шифрования RSA, и что он в программе вообще присутствует. Может быть это какие-то заготовки (текстовые константы) для предварительной обработки регданных, а может используются для хеширования или вообще не относятся к алгоритму генерации ключа. В первую очередь, надо проверить являются ли числа простыми и юзается ли скажем библиотека Miracle или какая-то другая для работы с большими числами. Потом пытаться локализовать алгоритм и определить используемые функции по работе с большими числами. Если очень хочешь сделать именно кейген, то в конечном итоге все зависит от реализации алгоритма. Если алгоритм построен таким образом, что на основании введенного имени генерируется ключ-эталон, а затем он сравнивается с ключом введенным, тогда дело обстоит значительно проще. Пример таких программ с алгоритмом RSA мне приходят в голову программ от www.aone-soft.com/ и от www.ivideosoft.com/ И там, и там юзается RSA, но введенный ключ сравнивается с предварительно сгенерированным. Для A-one RSA-384, а для Absolute software -> RSA-100. То есть можно за пару минут вытащить ключ без всяких напрягов, но с кейгеном несколько сложнее дело будет обстоять. ----- Программист SkyNet |
|
Создано: 28 октября 2009 13:21 · Личное сообщение · #7 зачем выкладывать на фтп и айфолдырь, если есть родной установщик? Пароль к установщику: 'pgmfi.org' ----- EnJoy! |
|
Создано: 28 октября 2009 14:58 · Поправил: fl4r3 · Личное сообщение · #8 Jupiter Дело в размере, зачем вам качать лишнее. У меня версия 1.5.0, не знал что вышла новая. Теперь буду мучать новую. Алгоритм защиты не менялся с версии 1.1.11h. FrenFolio Миракл не используется. Подключаемых библиотек нет, кроме системных. Кейген писать не надо, есть строка в программе SerialID = C0408876D-046866-004754-06553524-061659 (для каждого компьютера своя) и нужно ввести Reg String. Имя пользователя и название компании не заполняется. Дело пока даже не в самом алгоритме шифрования этого ключа, а в невозможности изменения даже одного бита в exe. Ara Софт называется Crome - утилита для тюнинга ODB1 блоков управления двигателем Honda. Задача для меня на сегодня: 1) разобратся почему только OllyDbg смог отлаживать программу (антиотладочные приемы) 2) почему программа при старте сразу выбрасывает ексепшн (в деббаге он отлавливается и спрашивает передавать ли программе, если не передать программа не стартует) 3) как снять защиту на изменение исходного файла P.S. При удачной регистрации введенный нами Reg String сохраняется в папке с Crome под названием register без расширения в оригинальном введенном нами виде. |
|
Создано: 28 октября 2009 15:18 · Поправил: ToBad · Личное сообщение · #9 fl4r3 пишет: Взял исходный exe опять и заменил в конце файла один байт в строке с копирайтами (с 2003 года заменил на 2004). Запустил. Не работает. Так проверка целостности файла значит. Lampik лоадер сделал, память на целостность не проверяется значит, ставь бряк на CreateFile и ReadFile и смотри где подсчёт, либо иди путём лоадера... Думаю, если изначально планировал переход подправить, то следует этим путём идти, а лезть в дебри крипто врядле есть смысл. Вот кстати дока на русском если нужна. www.turboborisov.com/Statji/Elektrika/CROME--Rukovodstvo-dlja-nachinajushikh.html |
|
Создано: 28 октября 2009 16:00 · Личное сообщение · #10 |
|
Создано: 28 октября 2009 16:28 · Поправил: fl4r3 · Личное сообщение · #11 Vovan666 Оу. Упустил. Спасибо большое. И лоадер теперь не нужен. Теперь попробую поправить переходы чтобы она считала себя полнофункциональной Pro версией, а не урезанной обычной. Связыватся с серийниками и всем остальным нет смысла я думаю, поэтому надо отлавливать ReadFile при старте программы, когда она пытается найти файл register с исходным ключом. |
|
Создано: 29 октября 2009 06:24 · Поправил: fl4r3 · Личное сообщение · #12 Так. Новая проблема. Не могу дойти даже до алгоритма генерации ключа из введенной Reg String, потому что постоянно в отладчике вижу ексепшн который хендлится самой программой Invalid Block Size. Такую же самую ошибку я видел в Ninja CrackMe от барта, но там они ломали полностью криптосистему RSA с брутфорсом и разложением на простые множители. Знать бы хотя бы формат вводимой Reg String. Сейчас буду разбиратся дальше... |
|
Создано: 29 октября 2009 06:44 · Поправил: fl4r3 · Личное сообщение · #13 Формат выяснил. Это строка вида aTZP4RIMFAzjUPwo1wUepq6nw++Fo935HdLRi2zQ2mU. При вводе, часть кода расшифровывается с ее помощью. И у меня эта часть кода естественно превращается в мусор. Стоит хендл в самой программе на ексепшн, если ошибка в выполнении инструкции = неверный регстринг. В файле crome.ini лежит странная строка: [Most Recently Used] ID=sfiWab5Dzyu1/KdciXL6Gw== Очень похоже если убрать последние два знака равенства на First или Second Prime. Впрочем это не так важно, лучше знать Modulus (N), чем один из праймов. Ведь зная N всегда можно вычислить P и Q за достаточное время. Знание одного из праймов просто ускоряет перебор. Если кто-то нашел Modulus (N) в исходнике файла, сообщите его пожалуйста... |
|
Создано: 29 октября 2009 07:32 · Поправил: Hugo Chaves · Личное сообщение · #14 fl4r3 А нельзя поискать этот компонент от Turbo Power где-нибудь ? Насколько я знаю компания сия прекратила свое существование и вроде бы выложила все свои работы в паблик. Изучив исходники можно найти характерные места защиты и вперёд ... Ну так и есть . Выложено всё на sourceforge: h**p://sourceforge.net/projects/tplockbox/files/tplockbox/2.07/tplockb ox_2_07.zip/download |
|
Создано: 29 октября 2009 17:19 · Личное сообщение · #15 |
|
Создано: 29 октября 2009 18:24 · Поправил: fl4r3 · Личное сообщение · #16 Update: Что то не дает мне покоя 64 битные праймы(видимо они все таки не 64 битные)... Если с помощью них вычислить модулус N, то при попытке зашифровать наш месседж (серийный номер = C0408876D-046866-004754-06553524-061659) мы получим ошибку что сообщение для шифрования больше N. Если этот номер шифруется по блокам (допустим - это разделители блока) то тем более странно, ведь первый блок больше второго третьего и пятого, а первый и четвертый разного размера)... Update2: не правильно я все понял видимо, да и вообще если честно уже запутался... Вот пример похожей защиты если это поможет: eoda.by.ru/Data/Solutions/xt_ninja/ninja_sol.htm |
|
Создано: 30 октября 2009 00:23 · Поправил: zeppe1in · Личное сообщение · #17 |
|
Создано: 30 октября 2009 06:33 · Поправил: fl4r3 · Личное сообщение · #18 zeppe1in Я писал немного выше что если ввести Reg String вида aTZP4RIMFAzjUPwo1wUepq6nw++Fo935HdLRi2zQ2mU то процедура расшифровки начинается, но из кода который расшифровывается с ее помощью получается мусор. Что это Base64 я знаю Просто праймы то скорее всего или модулус хранятся в файле в виде HEX, а потом уже шифруются в бейз64 для нужд RSA. Надо это все проверить, но код достаточно запутан, хотя вроде и получилось локализовать защиту. Сегодня попозже, после обеда, скину сюда конкретные процедуры, подумаем вместе |
|
Создано: 30 октября 2009 11:48 · Поправил: DMD · Личное сообщение · #19 fl4r3 в TP LockBox 2.07 перед непосредственным использованием ключи (экспоненты и модули) представлены в виде неких контекстов. (и как обычно для Bignum'ом все в перевернутом виде) как пример: экспанента: 00402180 34 31 44 37 43 42 33 37 41 32 31 46 37 37 39 35 41D7CB37A21F7795 00402190 43 37 31 35 32 30 34 41 36 35 31 43 39 34 43 44 C715204A651C94CD 004021A0 34 31 31 46 46 38 33 36 34 31 33 45 37 31 36 31 411FF836413E7161 004021B0 33 42 41 39 44 46 41 46 30 37 34 39 36 33 35 30 3BA9DFAF07496350 контекст: 00B10A90 6C B7 1A 00 01 00 00 00 00 00 00 00 A8 0A B1 00 00B10AA0 E4 0A B1 00 1A 00 00 00 58 78 1A 00 01 00 00 00 00B10AB0 00 20 00 00 00 C0 0A B1 00 00 00 00 26 00 00 00 00B10AC0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00B10AD0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00B10AE0 1A 00 00 00 58 78 1A 00 01 20 00 00 00 20 00 00 00B10AF0 00 FC 0A B1 00 00 00 00 26 00 00 00 41 D7 CB 37 00B10B00 A2 1F 77 95 C7 15 20 4A 65 1C 94 CD 41 1F F8 36 00B10B10 41 3E 71 61 3B A9 DF AF 07 49 63 50 00 00 00 00 00B10B20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 те. сначала идет создание контекстов, их загрузка: RSASetPrivateKey или RSASetPublicKey (в принципе есть еще пара функций для загрузки котекстов) а уж потом само RSA создание контекстов ключей ловится на AllocMem (если не путаю.. давно это было,,,) поскольку RSA восстанавливает код, использоваться функции: DecryptRSAEx или RSADecryptString (в зависимости от фантазии девелоперов... ) можно попробовать по кодам начала этих функций поискать совпадение в таргете ну и надеяться получить экспоненту и модуль. потом все будет определяться размерностью... ps/ кстати, такой вот стринг: ASCII "OutBlock size too small" есть в начале TPLbRSA.DecryptRSAEx TPLbRSA.EncryptRSAEx (остальные функции RSA не проверял.. ) |
|
Создано: 30 октября 2009 14:33 · Личное сообщение · #20 |
|
Создано: 30 октября 2009 14:50 · Личное сообщение · #21 |
|
Создано: 30 октября 2009 15:02 · Поправил: fl4r3 · Личное сообщение · #22 Проверка на правильность введенной Reg String (насколько я понимаю) Code:
|
|
Создано: 30 октября 2009 15:23 · Личное сообщение · #23 |
|
Создано: 30 октября 2009 15:37 · Личное сообщение · #24 |
|
Создано: 30 октября 2009 16:11 · Поправил: DMD · Личное сообщение · #25 zeppe1in сорцы же есть, нужно сигнатуры сделать, тогда всё станет на много проще. никто не подскажет как сделать сиги? именно потому что в сорцах это сделать невозможно. fl4r3 Проверка на правильность введенной Reg String (насколько я понимаю) нет, не правильно. (формат fasm) invoke DecryptRSAEx, [addr_PublicKey], buff_Encrypt, buff_Decrypt invoke RSAEncryptString, _RSA_TLbRSA, _Message, _out_A, 80h invoke RSADecryptString, _RSA_TLbRSA, _out_A, _out_B, 80h и судя по тому что имеем всего три параметра - у нас DecryptRSAEx => знаем адрес контекста PublicKey. и => знаем Public экспоненту и модуль. так что внимательно смотри указатели на что передаются... |
|
Создано: 30 октября 2009 16:16 · Личное сообщение · #26 |
|
Создано: 30 октября 2009 16:19 · Поправил: DMD · Личное сообщение · #27 хотя... вот что странно: это начало DecryptRSAEx (точно.. с гарантией ) Code:
но это не совсем совпадает с приведенным ТС кодом из ИДЫ... но если предположить, что код ТС все же DecryptRSAEx.. то проверив передаваемые аргументы можно многое для себя проянить |
|
Создано: 30 октября 2009 16:30 · Личное сообщение · #28 zeppe1in а смысл? нужно точно "угадать" чем работаю аффторы... иначе сигны просто не сработают.. ps/ если не путаю, на wasm была короткая статься по изготовлению сигн для иды... да и на сайте самой иды все вполне внятно описано если уж все так по-взрослому - я могу дать коды начала основных функций.. а там сигнатурный поиск по длинным hex-стрингам должен помочь |
|
Создано: 30 октября 2009 16:36 · Личное сообщение · #29 |
|
Создано: 30 октября 2009 16:41 · Поправил: DMD · Личное сообщение · #30 |
. 1 . 2 . 3 . >> |
eXeL@B —› Крэки, обсуждения —› Взлом программы с RSA шифрованием написанной на Delphi с использованием Turbo Power LockBox |