Крекінг - це мистецтво дослідження ассемблерного коду з метою пошуку уразливого місця, з подальшим його аналізуванням і зломом

Введення в крекінг

початок

Крекінг - це мистецтво дослідження ассемблерного коду з метою пошуку уразливого місця, з подальшим його аналізуванням і зломом.
Засмучу тих хто думає, що зайнятися крекингом можна просто так без певних знань, навичок, завзятості. Чи не вийде просто взяти завантажити потрібний для злому софт і зламати програму. Не думай, що програма ламається за 5 хвилин (хоча якщо вже є досвід, і захист програми на 1 то це можливо навіть ще й за більш короткий проміжок часу).
Отже, якщо ти загорівся бажанням навчиться крекінгу, готовий прочитати безліч документів, витратити багато часу то це стаття для тебе.
Для початку тобі потрібно вивчити основи асемблера, навіть не обов'язково вчитися писати на ньому програми просто потрібно знати значення функцій і команд, потрібно вміти читати код. Як ти думаєш чи зможеш ти читати книгу на іспанською мовою не знаючи його? З матеріалу по Асму раджу почитати: розсилку Калашникова (http://www.Kalashnikoff.ru), "Асемблер IBM PC" Юрова, зі статей "Асемблер для Cracker ' ів "від Dr.Golova і" Cracking для карапузів "від Crack.
Освоївши матеріал, ти повинен знати призначення функцій, трохи розбиратися в ассемблерском коді програми. Зрозуміти, що будь-яка програма, написана на будь-якій мові програмування, передається для обробки процесору в вигляді машинного коду, для подальшої обробки і виконання закладених в неї функцій. Машинний код для того, щоб він був читабельним перетворюється в асемблер. Його то ми і можемо переглянути, змінити за допомогою спеціальних програм. Але зміни не можливі якщо програма упакована.Упаковка програми проводиться для того, щоб зменшити її розмір і захистити від злому (наприклад, UPX, Aspack і багато інших).

Різновиди і призначення програм

Просування далі не можливо без спеціального софту, нам потрібні:
  • Дебагер / відладчик - служить для налагодження програмного коду, трасування, установки брейкпоинтов і ін.
    (OllyDBG)
  • Дізассемблер - програма яка з машинного коду отримує вихідний код на асемблері
    (KWdsm)
  • Аналізатор - аналізує програмний файл і повідомляє ніж він запакований. (Якщо він запакований :) br> (PEiD)
  • Анпакер - розпакує запакований файл.
    (QUnpack)
  • Патчер - програма за допомогою, якої можна замінити ассемблерскій код файлу з подальшим збереженням змін.
    (Hiew)
  • Патчмейкер - знадобиться тим у кого немає можливості написати кряк / патч самому. Принцип роботи програми простий, після того, як у нас є вже пропатченний програма за допомогою (hiew) і не пропатченний, патчмейкер обчислює зміни в програму, після створює exe файл-патч.
    (Tpe)
    Весь цей софт можна завантажувати окремо, але є і комбінований варіант, називається він CrackersKit (версія на час написання статті: 1.1, вага: 7 мб) скачати його можна з cracklab.ru майже всі перераховані вище програми там є (або їх аналоги). після того, як ми маємо початкові знання в цій області, і у нас є потрібний для дослідження софт розберемося в видах ПО:
    shareware - умовно-безкоштовне ПЗ
    freeware - безкоштовне ПО
    adware - рекламно оплачувані програми
    commercialware - Платити!
    donation ware - плата при бажанні
    Мета - програми типу shareware, ad ware і commercial ware.

    Панель інструментів в Olly і DASM

    запускаємо Olly
    Думаю ви вже маєте хоч якийсь досвід роботи з оллі (якщо немає можете почитати статтю Olly Debugger від А до Я cracklab.ru)
    Нагадаю функції відладчика, з якими ми будемо працювати:

  • M - Memory map (Карта Пам'яті)
  • C - CPU головне вікно олли
  • / - Patches патчі, тобто пропатченний місця програми
  • B - Breakpoints брейкпоінт
  • R - referenced text string посилальна текстовий рядок
    Завжди на увазі повинні бути CPU (головне вікно олли), Breakpoints і Patches.
    Вікно CPU:

    запускаємо kWdsm
    Розберемося в призначенні найосновніших функцій дасма.
  • Open file to disassambler - відкрити файл в дизассемблера
  • Project Files and and Comments - зберегти лістинг в ASCII файл
  • Find Text - пошук тексту
  • Goto Code Start - переміститися на початок коду
  • Goto Program Entry point - точка входу програми
  • Goto Page - перейти на сторінку
  • Execute JMP - виконати перехід
  • Return From Last Jmp - повернення з последнеднего переходу
  • Execute Call - здійснити телефонний дзвінок
  • Return From Call - повернення з останнього дзвінка
    Для того, щоб аналізувати код захисту для початку його потрібно знайти.

    Способи пошуку коду перевірки (за допомогою OllyDGB і kWdsm)


    Мета пошуку - розшук і довільне зміну коду, або знаходження Валіного серійного номера. Пошук коду перевірки обов'язковий для злому програми.
    Основне призначення цього коду:
    1 звірити валідність серійного номера (введених даних у формі введення СН)
    2 перейти за адресою, якщо він вірний / невірний
    3 повідомити про НЕ / коректної реєстрації

    Основні способи знаходження коду перевірки:
    1 брейкпоінт (Intermodular call)
    2 Referenced
    3 пошук по засобам вікна (дампа) пам'яті
    4 пошук в стеці
    5 пошук з помощю kWdsm
    | 1 |
    Брейкпоінт - точка переривання функції.
    Поставити брейкпоінт можна або через
    _командную рядок, наприклад:
    bpx MessageBoxA
    bpx - команда точки переривання
    MessageBoxA - функція, на яку встановлюється брейкпоінт
    про призначеннях функцій можна дізнатися з довідкової з WinAPI (cracklab.ru)
    або через
    _поіск міжмодульних викликів (Intermodular calls) наприклад:
    знаходимо функцію MessageBoxA натискаємо правою кнопкою і вибираємо Set breakpoint on every call MessageBoxA
    | 2 |
    Пошук по посилальної текстовому рядку (referenced text string).
    При такому вигляді пошуку використовується фраза яка виводиться наприклад при введенні некоректного серійного номера. Запускаємо програму, вводимо СН, програма лається що СН не вірний (наприклад так: Wrong SN! Trying again) => для пошуку і буде використовуватися дана фраза, далі йдемо в All referenced text string (котора у вкладці Search for) і шукаємо цю фразу .
    | 3 |
    Запускаємо програму, заповнюємо вікна реєстрації, натискаєте в букву M (Memory Window) У вікні DUMP натискаємо правою кнопкою, і вводимо введені нами дані в поле пароль. Після того як програма знайшла шматок пам'яті, де збереглися введені нами дані, ставимо брейкпоінт на рядок з паролем (клік правою кнопкою брейкпоінт -> Меморі аксес) знову намагаємося зареєструвати програму. Вводимо дані і вона зупиняється на шматку коду в якому був знайдений введений нами пароль. Знімаємо брейкпоінт з пам'яті і продовжуємо дослідження.
    | 4 |
    Пошук в стеці проводитися наступним чином, клік в вікні стека правою кнопкою миші Search For -> Binary Sting і шукаємо по фразі яка виводиться при неправильному введенні СН.Дальше знайшовши цю фразу дивимося лівіше в поле Dissambly бачимо там команду, копіюємо її йдемо в головне вікно (CPU) натискаємо правою кнопкою миші Serach for -> Command
    | 5 |
    Пошук з помощю kWdsm.Поіск з помощю kWdsm дуже простий, для того, щоб знайти код перевірки потрібно або ввести фразу виводиться при некоректної реєстрації, або шукати по рядку Possible StringData Ref from Code Obj -> "

    Приклад злому програм з різними типами захистів

    Для того щоб навчиться крекінгу, потрібно досліджувати якнайбільше програм, з різною за ступенем складності захистом, тому перейдемо до справи. У цій статті я розгляну тільки 2 типу захистів (так як вони найпоширеніші):
    1 форма введення СН
    2 напис в програмі (наприклад, Unregistered)
    Програми для дослідження беремо або з журнальних болванок (ПЛ, хакер, ігроманія), або з сайтів типу softodrom.ru, і ін (шукаємо там шарованний софт (тобто вид shareware) і досліджуємо).
    Теоретичний план злому:
  • пошук коду перевірки
  • аналіз функцій коду
  • знаходження СН або правка виведення функцій
  • патчінга програми, або введення знайденого СН
    Почнемо безпосередньо сам процес пошуку коду і його злому, я покажу вам ці операції на прикладі EscapeClosePro
    Всі перелічені нижче дії рекомендую виконувати разом зі мною, так як це важко сприймається тільки шляхом прочитання матеріалу. Якщо ти поки не розумієш як це у мене вийшло потренуйся на крякмісах можна від фантома і крафта (ngh.void.ru/soft/d/crackme.rar; ngh.void.ru/soft/d/craft1.rar)
    EscapeClosePro

    Метод захисту: СН, напис Unregistered у вікні програми
    Пакер / протектор: відсутній (а дізналися ми це завдяки PEiD, а якби програми була запакована, то просто потрібно було б знайти під неї анпакер)
    Вартість: 100 руб :)
    Злом шляхом пошуку СН:
    Цей спосіб злому характеризується тим, що завдання полягає в тому щоб знайти код перевірки це може бути шляхом установки брейкпоінта на потрібну команду, або переглядом посилальної текстового рядка, або просто переглядом дізассемблерного коду програми і пошуку валидного серійного номера.
    1
    Ставимо брейкпоінт bpx MessageBoxA (спосіб знаходження коду перевірки № 1) .Запускаем вікно реєстрації, вводимо дані:
    ім'я vizor
    СН vizor
    програма зупинилася на адресу 0040262E за цією адресою знаходиться команда call за допомогою цієї команди виводиться (в нашому випадку) текст: Неправильний код! .Зверніть увагу на вікно дампа пам'яті (в головне вікно CPU), спробуємо знайти цікаві речі шляхом просто перегляду коду, Скрол вгору і бачимо за адресою 0012F3D0 якісь цифри більше 10 цифр на погляд: 56C520AE713B563D5119 виникає підозра на СН, тестів і облом.
    ніхто не забороняв використовувати кілька (хоч все) способи пошуку відразу
    Тепер встановлюємо брейкпоінт не на саме повідомлення, а на команду вилучення фрази (Неправильний код!) Тобто на push.Снова заповнюємо форми введення, ок, програма зупинилася за адресою 00402620 (там де PUSH 0) .Снова звертаємо свій погляд на дамп пам'яті і бачимо там:
     0012F438 004088E8 ASCII "9B2BC2C55272E0C32B44" << підозра на СН 0012F43C 0012F518 << тут наш бряк 0012F440 00402200 EscapeCl.00402200 
    Тестуємо ще 1 знайдений нами СН на валідність. (Ім'я vizor sn 9B2BC2C55272E0C32B44) і Дякую за реєстрацію!
    2
    Спробуємо ще раз але трохи іншим способом, знову повертаємося на адресу 00402620 (хто забув це push) і починаємо шукати щось цікаве в головному вікні .. Скрол вище .. і натикаємося на адресу 00402598 в якому бачимо в відкритому вигляді вже знайомий нам СН ) 9B2BC2C55272E0C32B44. (можете ще раз перевірити його валідність :)
    3
    Йдемо в Search For -> All referenced text string і бачимо просто страшні речі :) Дійсний СН у відкритому вигляді стречаются раз 10 в посилальної текстовому рядку.
    Зміна виведення функції:
    Зміна виведення функції в свою чергу характеризується пошуком коду перевірки, довільним зміною його на циклічний тобто на такій який за будь-яких введених даних буде вважати себе зареєстрованим.
    Знову ж встановлюємо брейкпоінт на MessageBoxA як і раніше, вводимо теже самі дані в поле ім'я, СН, зупиняємося там же. Тільки тепер рухаємося вище в пошуку переходу (джампа, стрибка) .По шляху нагору аналізуємо всі переходи. А вгору просування проводиться тому, як, якщо наприклад функція виведення повідомлення знаходиться грубо кажучи на адресу 5, то її тестування відбувається вище цієї адреси, так як тестування відбувається завжди вище результату (поняття стека).
    Скрол вище бачимо:
     004025CD> 85C0 TEST EAX, EAX
     004025CF.  A3 58AF4000 MOV DWORD PTR DS: [40AF58], EAX
     004025D4 74 4A JNE SHORT EscapeCl.00402620 
    
    Аналізуючи JNE 00402620 перехід, звертаємо увагу в першу чергу на адресу джампа тобто 00402620.Смотрім що знаходиться за цією адресою, бачимо що висновок повідомлення про те що програма незарегістрірованна.Теперь якщо ми змінимо перехід JNE (jump if not equal тобто стрибок якщо не дорівнює) на JE (jump if equal тобто стрибок якщо одно) .Двойним кліком лівої кнопки миші натискаємо на:
     004025D4 74 4A JNE SHORT EscapeCl.00402620 
    
    і міняємо JNE на JE.Теперь будь введений СН програма вважає за вірний (звичайно крім справжнього СН :) , А відбувається це через те, що її висновок функції змінений таким чином, щоб програма завжди повертала позитивний результат при будь-яких введених даних.
    Але це її не все, не варто поспішати і бігти патчить 1 висновок цієї програми. Згадаймо, який ще спосіб захисту використовує програма? вірно, проста на перший погляд напис Unregistered у вікні програми. Просто після перезапуску програми, вона дивиться була змінена це напис на щось інше і якщо це так то вона вважає себе зареєстрованої, але у нас такого не було тому ще не все зроблено рухаємося далі.
    Встановлюємо брейкпоінт на вже досить набридла MessageBoxA.
    Починаємо міркувати якщо програма незареєстрований то у неї видно напис Unregistered отже десь в коді програми вона повинна бить.Начінаем пошук, але перед цим просто проскролім код і подивимося його .. Скрол вниз і бачимо:
      0040265F.  85C0 TEST EAX, EAX << порівняння даних в регістрах
     00402661 74 23 JE SHORT EscapeCl.00402686 << перехід
     00402663.  8B5424 70 MOV EDX, DWORD PTR SS: [ESP + 70]
     00402667.  68 64724000 PUSH EscapeCl.00407264;  / Text = "Unregistered version!"
     ...
     00402686> 8B7424 70 MOV ESI, DWORD PTR SS: [ESP + 70]
     0040268A.  8B3D 70714000 MOV EDI, DWORD PTR DS: [<& USER32.SetDlgIte>;  USER32.SetDlgItemTextA
     00402690.  68 54724000 PUSH EscapeCl.00407254;  / Text = "Registered to:"
    
    "SetDlgItemTextA - функція заголовка або тексту в вікні"
    А ось і це повідомлення. Починаємо аналіз коду. Бачимо стандартну конструкцію перевірки вмісту регістрів і функцію джампа. JE 00402686 - JE - перехід далі за кодом. Дивимося що знаходиться за адресою 00402686 а там знаходиться повідомлення про те, що програма RegiRegistered to: => якщо змінити JE на JNZ програма при людом розкладі вважає себе зареєстрованої і пише про це в своєму головному вікні.
    Таким чином змінивши ці 2 функції програма завжди буде зареєстрована і все це балгодаря всьому 2-м байтам зміненим в коді.
    патчінга:
    Патчінга програми проводиться безпосередньо після злому програми.
    Для того, щоб пропатчити нашу піддослідну програму потрібно змінити:
     адреса функція і зміна
      адреса функції
    	  переходу
     004025D4 JNE 00402620 JE
     00402661 JE 00402686 JNE
    
    Для патчінга будемо використовувати hiew, про командах hiew'a можна дізнатися з моєї статті (ngh.void.ru/lec/crack.html).
    До того, як ми будемо виробляти патчінга програми потрібно створити папку (де зручніше, можна в корені диска) і скопіювати туди exe файл EscapeClosePro, на той випадок якщо ми щось зробили неправильно. Після того, як ми його скопіювали, запускаємо hiew знаходимо і відкриваємо в ній наш файл (EscapeClosePro.exe) .На цьому місці я хотів би трохи розповісти про основні опціях hiew'a.В цьому меню вибираємо Decode.
    меню вибору відображення коду

    Головна панель hiew'a:

  • Help - функція хелпа (F1)
  • Edit - редагування (F3)
  • Mode - режим перегляду тексту (F4)
  • Goto - пошук за адресою (F5)
  • Search - пошук по тексту (F7)
  • Files - сохраніеніе змін (F9)
    Завантажуємо наш файл, EscapeClosePro.exe в hiew, шукаємо або по фразі (F7), або за адресою (F5) .Я б радив шукати по фразі, тому натискаємо F7 і вводимо Registered to :, після знаходження цієї фрази, згадаємо які висновки нам потрібно патчить:
     004025D4 JNE 00402620 JE
     00402661 JE 00402686 JNE
    
    Патчим. Після пропатчіванія, (пам'ятаєш я говорив нам потрібно скопіювати ехе файл програми і патчить його) дак ось після того, як ми його пропатчити перемінуем його наприклад в p.exe і скопіюємо незмінені файл програми, тобто тепер у нас в папці 2 файли, 1 пропатчіний, а інший дефлотовий програмний.Ето нам потрібно для того, щоб зробити патч з помощю патчмейкера tpe:

    Для того, щоб створити патч потрібно в цьому вікні в формі Original file (оригінальний, тобто незмінений / непропатченних) потрібно вибрати непропатченних файл, а в вікні Patched File відповідно пропатченний файл.После в головному вікні tpe заповнити форми, хто творець патча, і його сайт.І у вкладці File вибрати створення патча.После зберегти під потрібним ім'ям і все патч готовий!
    Сподіваюся це стаття допомогла тобі в освоєнні основ крекерского мистецтва, відповіли на деякі твої вопроси.Дальше все буде набагато цікавіше, більше практика, читайте і у вас все обов'язково вийде.
    ps до цієї статті є додаток у вигляді веде-роликів злому програми EscapeClosePro різними способами.
    ps величезне спасибі Armiоlu за те що наштовхнув мене не вірний шлях, допоміг в освоєнні незрозумілих для мене речей)
    By Rel4nium (ngh.void.ru)