Авторские статьи ..:: Взлом программы: Teleport Pro 1.29 ::..

Discussion in 'Статьи' started by KindEcstasy, 13 Oct 2006.

  1. KindEcstasy

    KindEcstasy Banned

    Joined:
    30 Sep 2006
    Messages:
    105
    Likes Received:
    64
    Reputations:
    54
    ИНФОРМАЦИЯ

    ИНФОРМАЦИЯ
    +----------------------------+
    | Цель: Teleport Pro 1.29
    | Защита: [==-----] легко
    | Версия бинарника: 1.29.2052
    | Цена: $39.95 ~ 40 баков
    +----------------------------+
    ИНСТРУМЕНТЫ
    +----------------------------+
    | Отладчик: OllyDebuger
    | Дизасмер: n/a
    | HEX'ep: n/a
    | Patcher: n/a
    +----------------------------+


    Программа Teleport Pro - очень извесный продукт. Используется для полного слива сайта из сети интернет на винчестер. Также может искать графику, архивы, и другие файлы. Но вот какая запора, незареганная прога может скачать только 500 файлов за 1 проект и воспользоваться ей можно только 40 раз! Исправим ситуацию...

    Загружаем файл pro.exe в ольку. Ставим бряк на функцию 'GetWindowText' (Подробнее про эту и другие функции читайте в статье про Perfect Keylogger). Пускаем на выполнение. Перед тем как окончательно запуститься, программа несколько раз прервётся на вашем бряке. Пропустите все это клавишей 'F9', или просто нажмите на треугольник (Run Program...). Теперь входим в Help -> Register (прога тормознётся ещё пару раз, так что F9) и в полях для имени и ключа пишите:

    Your Name: KindEcstasy | <----- (можно писать любое, но я обьясняю на примере меня =))
    |
    Reg. Code: 12345 | <----- (можно писать любоые, но главное цифры)

    Нажимаем [OK] и выподаем в отладчик. Трассируем программу пока не выпадем в программу, то есть в статусной строке отладчика не увидем 'Running'. Итак картина должна быть следующая:


    PHP:
    0042BCFF   3BF0           CMP ESI,EAX                    <------- Проверка
    0042BD01   
    59             POP ECX
    0042BD02   
    75 0F          JNZ SHORT pro.0042BD13         <------- Условный переход
    0042BD04   
    53             PUSH EBX                                
    0042BD05   
    53             PUSH EBX                                
    0042BD06   
    FF35 447B4800  PUSH DWORD PTR DS:[487B44]              
    0042BD0C   E8 D1540200    CALL pro.004511E2                       
    0042BD11   
    EB 75          JMP SHORT pro.0042BD88
    0042BD13   
    8BBF D5000000  MOV EDI,DWORD PTR DS:[EDI+D5]
    0042BD19   395F F8        CMP DWORD PTR DS:[EDI-8],EBX
    0042BD1C   
    75 0A          JNZ SHORT pro.0042BD28
    0042BD1E   
    53             PUSH EBX
    0042BD1F   
    53             PUSH EBX
    0042BD20   
    FF35 BC7B4800  PUSH DWORD PTR DS:[487BBC]              
    0042BD26   EB 1B          JMP SHORT pro.0042BD43
    0042BD28   
    57             PUSH EDI
    0042BD29   
    E8 8B090000    CALL pro.0042C6B9
    0042BD2E   
    59             POP ECX
    0042BD2F   
    85C0           TEST EAX,EAX
    0042BD31   
    53             PUSH EBX
    0042BD32   
    53             PUSH EBX
    0042BD33   
    75 08          JNZ SHORT pro.0042BD3D
    0042BD35   
    FF35 C07B4800  PUSH DWORD PTR DS:[487BC0]               
    0042BD3B   EB 06          JMP SHORT pro.0042BD43
    0042BD3D     FF35 C47B4800  PUSH DWORD PTR DS
    :[487BC4]              
    0042BD43     E8 9A540200    CALL pro.004511E2              <---- Точка вапада в программу
    Смотрим на код. Смотрите! Программа делает проверку, вернее какое-то сравнение и потом в зависимости что возвращает эта проверка, делает переход на какой-то адрес. На самом деле сравниваются два значения регистров EAX и ESI, и если они не соврадают (проверка возвратила 1), то делает переход на смещение 0042BD13. Смотрите что у вас по адресу 0042BD13! У вас в комментариях ольки должно быть следующее:

    0042BD13 > 8BBF D5000000 MOV EDI,DWORD PTR DS:[EDI+D5]

    ........
    ........ | <----- Тут идёт какой то код...
    ........

    0042BD3D > FF35 C47B4800 PUSH DWORD PTR DS:[487BC4] ; |Arg1 = 0048C468 ASCII "We're sorry! The registration number you entered appears to be invalid. Please check both your name and the registration code and try entering them again. (Your name must be spelled exactly as you spelled it when you "...

    (Жёлтым цветом я выделил коментарий отладчика)

    Мы можем догадаться что перейдя по адресу 0042BD13 программа продолжает выполнение, и дойдя то 0042BD3D, в стек засунет смещение строки с текстом о неверной регистрации и выведет MessageBox c этим текстом. Конечно же лицезреть эту табличку мы с вами не хотим, да и не будем! А теперь вспомним, почему программа перешла именно по этому адресу (0042BD13)? Правильно, потому, что по адресу 0042BCFF произошла проверка, вернувшая 1-(единицу). Вообще JNZ расшифровывается как Jump if Not Zero (перейти если не ноль). Вот прога и перешла по ненужному нам адресу, а это значит, что регистры EAX и ESI - не равны, то есть содержат разные значения. Ну теперь то резонно предположить что сравниваются введённый серийник (12345) и правильный (специальный - для имени KindEcstasy). Давайте теперь посмотрим что в этих регистрах:

    EAX 0AB4A6D9 ----> переводим в десятичную ----> 179611353
    ESI 00003039 ----> переводим в десятичную ----> 12345


    Но если 12345 ввели мы... то 179611353 сгенерила программа! Значит это и есть верный серийник! Окончательная картина ясна:

    Your Name: KindEcstasy
    Reg. Code: 179611353


    Вводим, проверяем, работает? Ну и слава богу!
    Вот и всё что я хотел рассказать в этой статье. Скоро мы с вами будем писать KeyGen по моей новой статье!

    P.S. Плюсики приветствуются =)

    Ну всё, пока!

    (c) KindEcstasy