Авторские статьи Туториалы про крякми фантома (для начинающих и не только)

Discussion in 'Статьи' started by Ra$cal, 28 Aug 2006.

  1. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    Позвольте представить Вам серию статей (если получитсяи потребуется) для новичков. Рассматриваться здесь будут крякми от фантома. Инструменты: OllyDbg - основной, остальное что понадобится будем добавлять по мере необходимости. В этих статьях будут описаны: теоритические данные, необходимые для понимания работы программы, основные принципы построения защит и соответственно способы их обхода. Все материалы предназначены только чтобы Вы понимали, как не стоит делать.

    Начнём мы с первого крякми фантома.
    Линк: http://rascalspb.narod.ru/fantom/1.zip (4Kb)
    Он Вам покажется знакомым с крякми одного товарища, но отличается размером - 4 килобайта ;) Советую для удобства добавить ярлык на OllyDbg добавить в папку SendTo. Теперь открываем крякми в отладчике. Запускаем (F9) и смотрим на него. Видим поле ввода и кнопку. Из поля ввода текст может читаться с помощью апи GetWindowTextA(W), GetDlgItemA(W), SendMessageA(W) с сообщением WM_GETTEXT. Нас интересуют только первые 2 апи. Ставим туда бряки. Это можно сдеать следующим образом: или написав в командной строке bp GetDlgItemA или поискав все апи (в окне дизасма ПКМ->Search for->All intermodular calls) и ставимть на них бряки, или Control+G->GetDlgItemTextA и двойной клик в столбце Hex Dump. Как видим вариантов много. Теперь плюсы и минусы: когда бряк ставится в программе на call API не стоитт забывать про вызовы апи через GetProcAddress, call eax. Поэтому я считаю верным ставить точку останова в начало апи. так и сделали. Не забудьте про GetWindowTextA. Теперь пишем в поле что угодно и смотрим.

    Остановились примерно здесь.
    Code:
    77D8AC26 U>  8BFF               MOV EDI,EDI
    77D8AC28     55                 PUSH EBP
    77D8AC29     8BEC               MOV EBP,ESP
    77D8AC2B     FF75 0C            PUSH DWORD PTR SS:[EBP+C]
    
    Это начало функции GetDlgItemTextA (смотрим регистр EIP). А нам надо попасть в код програмы. Смотрим в стек (справа внизу).

    Code:
    0012FC64   00401287   /CALL to GetDlgItemTextA from CRACKME1.00401282
    0012FC68   000D056C   |hWnd = 000D056C ('FaNt0m's Crackme #1',class='DLGCLASS')
    0012FC6C   000003E8   |ControlID = 3E8 (1000.)
    0012FC70   0040309C   |Buffer = CRACKME1.0040309C
    0012FC74   00000100   \Count = 100 (256.)
    На вершине стека лежит адрес, попадающий в пределы программы. Так же видим адрес на буфер, куда попадёт прочитаный текст. На нём жмём ПКМ->Follow in dump. Теперь жмём Control+F9. Остановились на GetWindowTextA. Как видите GetDlgItemTextA использует для получения текста эту апи. Чтобы выйти обратно в код программы жмём Ctrl+F9 и затем ещё раз (сначала остановимся на выходе из GetWindowTextA, в слдеующий раз на GetDlgItemTextA). Теперь F8 и мы в коде программы. В дампе введённый нами текст. Стоим здесь:

    Code:
    00401287   |.  68 9C304000      PUSH CRACKME1.0040309C                     ; /String2 = "tratata"
    0040128C   |.  68 29304000      PUSH CRACKME1.00403029                     ; |String1 = "m0tNaF-EmKCARc"
    00401291   |.  E8 BC000000      CALL <JMP.&KERNEL32.lstrcmpA>              ; \lstrcmpA
    00401296   |.  83F8 00          CMP EAX,0
    00401299   |.  74 15            JE SHORT CRACKME1.004012B0
    0040129B   |.  6A 30            PUSH 30                                    ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
    0040129D   |.  68 38304000      PUSH CRACKME1.00403038                     ; |Title = "Check Status"
    004012A2   |.  68 45304000      PUSH CRACKME1.00403045                     ; |Text = "Wrong Password! Keep trying, you'll get it!"
    004012A7   |.  6A 00            PUSH 0                                     ; |hOwner = NULL
    004012A9   |.  E8 5C000000      CALL <JMP.&USER32.MessageBoxA>             ; \MessageBoxA
    004012AE   |.  EB 13            JMP SHORT CRACKME1.004012C3
    004012B0   |>  6A 40            PUSH 40                                    ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
    004012B2   |.  68 38304000      PUSH CRACKME1.00403038                     ; |Title = "Check Status"
    004012B7   |.  68 71304000      PUSH CRACKME1.00403071                     ; |Text = "You got it! Your now a cracker! :)"
    004012BC   |.  6A 00            PUSH 0                                     ; |hOwner = NULL
    004012BE   |.  E8 47000000      CALL <JMP.&USER32.MessageBoxA>             ; \MessageBoxA
    Это, как Вы надеюсь уже заметили, есть проверка. Проверка простая - сравнение строк. Если мы ввели строку m0tNaF-EmKCARc, то увидим поздравление. Иначе нет. Текст этот, если Вы опять же заметили, есть повёрнутый текст Crackme-Fantom.

    Задание для самостоятельной работы - сделайте, чтобы на любой текст было сообщение о правильном пароле, замените пароль на более простой. Причём интересны вВаши решения этих вопросов. Все решения постите - за оригинальные и интересны +
     
    #1 Ra$cal, 28 Aug 2006
    Last edited: 28 Aug 2006
    2 people like this.
  2. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    респект! хорошая статейка - многим на4инающим должна помо4ь. дерЖи +
     
  3. bul.666

    bul.666 булка

    Joined:
    6 Jun 2006
    Messages:
    719
    Likes Received:
    425
    Reputations:
    140
    Добавлю, что многие, даже не знают, что такое "Бряки"... Бряки или BreakPoints Устанавливаются на фуекции, тоесть когда программа переходит на них, то она останавливается и выводит эту область... Помойму хреново объяснил =)
     
  4. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    Брекпоинт, это например опкод 0xCC, когда программа наступает на него она вызывает исключение и управление берёт на себя отладчик. Есть отладчики, которые обрабатывают все int 3 (опкод 0xCC). А OllyDbg проверяет, чтобы он входил в заданные Вами точки останова. Ибо есть такой способ запалить отладчик, вызвав исключение и не обработав, т.к. такой отладчик обработает его сам
     
  5. bul.666

    bul.666 булка

    Joined:
    6 Jun 2006
    Messages:
    719
    Likes Received:
    425
    Reputations:
    140
    ГЫ... Это и имел ввиду =)