SHARE
TWEET

Untitled

CryptoMaN Mar 31st, 2015 97 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.    Хотя я и сам считаю себя новичком, но, если хочешь, могу дать некоторые рекомендации.
  2.    Можешь для начала почитать статьи с http://www.wasm.ru/wault в разделе "Исследование программ", особенно "Теоретические основы крэкинга" и "Введение в крэкинг с нуля, используя OllyDbg". А вообще, лучший способ обучения в этом деле - практика.
  3.    В каждом конкретном случае нужен свой подход. Например, в программах, написанных на Delphi (вроде DelinvFile), можно начать с анализа кода в IDR и создания map-файла. Это на порядок упрощает задачу исследования asm-кода. Из обработчика кнопки регистрации уже не трудно выйти на основную функцию проверки. А дальше собственно и начинается основная часть работы.
  4.    Если в процессе анализа встречается функция, которая вызывается из множества мест, то зачастую её можно не разбирать, а определить её предназначение по тому, какие она параметры принимает и какой возвращает результат. Если её действие по-прежнему непонятно, то, возможно, это какая-то несущественная функция и её можно смело пропустить. Стоит обращать внимание на функции, которые вызываются всего из 1-2 мест, особенно, если им передаются рег. данные. По мере накопления опыта ненужные функции довольно быстро отсеиваются.
  5.    Не стоит зацикливаться на трудных местах. Смотри на код в целом, старайся создать общую картину, понять логику, которой руководствовались разработчики. В любом случае, анализ всегда проще, чем синтез. Разобрать чужую защиту гораздо легче, чем изобрести свою.
  6.    Помимо настроя и терпения, желательно также иметь опыт программирования, без этого, по крайней мере, не получится сделать сам кейген. К тому же, это помогает выделять в asm-коде стандартные структуры (if, for, case и пр.). Для более трудных защит придётся изучить криптографические алгоритмы: CRC, хеш-функции (MD5, SHA), симметричное (см. Панасенко С.П. - Алгоритмы шифрования) и ассиметричное (RSA, ECC) шифрование, цифровые подписи (DSA, ECDSA) и пр. В особенно тяжёлых случаях защита может быть многоуровневой, проверки запускаются только при случайных событиях, есть шифрованные и обфусцированные куски кода, часть верификации вынесена в VM, модифицированы стандартные криптогр. алгоритмы (как, например, модифицированные MD5 и RSA в Total Commander) и т.д. Здесь всё ограничено лишь изобретательностью программиста.
  7.    Для меня мотивацией поначалу было исследование программ, которые я использую в повседневной работе. Наличие к некоторым из них в сети уже готовых кейгенов, ещё больше подталкивало к их анализу, т.к. в этом случае была уверенность, что такая задача заведомо разрешима. К тому же, далеко не всегда готовый кейген даёт возможность тонкой настройки лицензии, что также является дополнительным стимулом к его улучшению.
  8.    В общем, тут главное начать, и не бойся трудностей, которые непременно встретятся в начале пути.
  9.  
  10.    В качестве примера, приведу вкратце разбор защиты DelinvFile:
  11. 1. После анализа в IDR выходим на функцию TDelinvRegDlg.RegItBtnClick (00614F4C)
  12. 2. В ней сначала получается введённый ключ (00614F75), затем он переводится в верхний регистр (00614F80), далее из него удаляются все символы кроме цифр и загл. лат. букв (00614F8B). Потом идёт замена некот. символов (00614FA1: 'L', 'I' -> '1', 'O' -> '0').
  13. 3. Далее идёт важная функция 006148E0, т.к. ей передаётся преобразов. ключ. Заходим в неё.
  14. 4. В ней единственный интересующий нас вызов: 006147CC. Это и есть основная функция проверки.
  15. 5. Далее формируется ключ для блочного шифра:
  16.         00671B25 - указатель на встроенный массив из 16 байт
  17.         005F26A0 - вычисляет CRC от строки 'DELINVF' (Res = $08A0E3E6)
  18.         005F27B4 - xor-ит побайтово полученный CRC и массив. На выходе ключ для бл. шифра:
  19.                 9E AD E7 49 8C A7 B8 6D 72 15 17 47 61 B9 36 B2
  20. 6. 005F220C - переводит пользовательский ключ из hex-строки в байты (результат д.б. 8 байт)
  21. 7. 005F2988 - производит расшифровку. В ней вызывается основная процедура блочного шифрования 8-ми байт (005F257C). Разобраться в этой процедуре не так сложно, как может показаться на первый взгляд. Перед этим можешь почитать статью о сетях Фейстеля на википедии. Производится 4-ре раунда преобразований над 8-ми байтовым входом на основе 16-ти байтового ключа. После выхода из этой процедуры первые 2 байта расшифр. рез-та д.б. $3C69.
  22. 8. Затем проверяются последние 4-ре байта результата. Это, скорее всего, идентификатор лицензии (LicId). Он должен быть в диапазоне [10001..15999].
  23. 9. Наконец, процедура 005F29B4 проверяет вторые 2 байта результата. Из кода процедуры нетрудно понять, что они определяют дату истечения срока лицензии. При этом 0 соответствует дате 01.01.9999, т.е. неограниченной лицензии.
  24. 10. В процедуре 00612DE4 LicId проверяется на принадлежность чёрным спискам.
  25.  
  26. P.S. Также эта программа поддерживает сайтовые лицензии в  виде обычного ini-файла. На их проверку можно выйти по строке 'DelInvFile.LIC' (0061420A). Здесь в ключе вместо $3C69 используется $9C5B, и LicID = 2014. При желании в качестве упражнения можешь сделать генератор лиц. файлов сайтовых лицензий.
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top