| 
  
    | 
        | Автор: | FEUERRADER [AHTeam] |  | Уровень: | Для начинающих |  | Программа: | Active Phone Server 9.18 |  | Размер: | 70 Кб |  | Язык: | C++ |  | Тип защиты: | Имя/код |  | Инструменты: | TRW2000 1.2? или SoftIce, Sign 0f Misery (необязательно) |  Предисловие: эта статья основана на туториале Vallkor'а "Исследование Active Phone Server", где рассказывается, как взломать этот продукт. Ниже будут приведены выдержки из этой статьи.
 
 Начнём: Запускаем программу, открываем окно "О программе", вводим имя и РН (наугад) ставим bpx GetDlgItemTextA и нажимаем кнопку "Ввести", выскакиваем в SI (или TRW2k), жмем 2 раза F12, чтобы вернуться из системной библиотеки, мы тут:
 
 Эти инструкции нам ни о чем ни говрят. Попробуем зайти с другой стороны. Заметьте: oкно с сообщением о неверном РН выдается не сразу, а спустя несколько секунд (для понта наверное). Значит используется, скорее всего сообщение WM_TIMER. Проскролим несколько десятков строк вверх от адреса 100171E5....016F:100171E5  CALL     `KERNEL32!FindCloseChangeNotification`
 016F:100171EB  POP      EBX
 016F:100171EC  POP      EDI
 016F:100171ED  MOV      EAX,01
 016F:100171F2  POP      ESI
 016F:100171F3  ADD      ESP,0C08
 016F:100171F9  RET
 016F:100171FA  POP      EDI
 016F:100171FB  XOR      EAX,EAX
 016F:100171FD  POP      ESI
 016F:100171FE  ADD      ESP,0C08
 ...
 О, то что нам нужно! Ставим бряк bpx 10016FC1. Прервемся и зайдем по F8 в CALL 10017070, далее трассируем по F10. Вскоре увидим:...016F:10016FBA  CALL     `USER32!KillTimer`
 016F:10016FC0  PUSH     ESI
 016F:10016FC1  CALL     10017070            //Интересная функция
 016F:10016FC6  ADD      ESP,BYTE +04
 016F:10016FC9  TEST     EAX,EAX             //Сравним результат
 016F:10016FCB  JZ       10016FDB            //Прагаем, если 0
 016F:10016FCD  PUSH     BYTE +40
 016F:10016FCF  PUSH     DWORD 10022B50
 016F:10016FD4  PUSH     DWORD 10022B34
 016F:10016FD9  JMP      SHORT 10016FFC
 016F:10016FDB  MOV      EAX,[100260B4]
 016F:10016FE0  PUSH     BYTE +10
 016F:10016FE2  TEST     EAX,EAX
 016F:10016FE4  JZ       10016FF2
 ...
 В статье Vallkor'а сказано: "Нужно изменить флаг Z на противоположный, чтобы не прыгнуть, а посмотреть, что же будет делать программка, если наш и правильный РН окажутся одинаковыми. После того, как мы это изменили, посмотрим, что же делает дальше программка:...016F:100170F2  CALL     10016D50            //процедура проверяющая
 016F:100170F7  ADD      ESP,BYTE +08        //РН с правильным, кому интересно,
 016F:100170FA  TEST     EAX,EAX             //загляните.
 016F:100170FC  JZ       NEAR 100171FA       //Прыгаем, если флаг Z=0,т.е если РН=ERR0R!
 ...
 Потом в файл делается две записи, которые xorятся со смещением +3"....поскипано не нужное...015F:10016DAE  52                  PUSH      EDX <--в edx имя файла:
 c:\Program Files\Apserver\xxxxxxxx.key
 015F:10016DAF  FF15FCD00110        CALL      [KERNEL32!CreateFileA] <--создаём файл
 с таким именем
 ...поскипано...
 015F:10016DBD  8B1D2CD10110        MOV       EBX,[KERNEL32!WriteFile] <--загоняем
 в ebx адрес функции записи в файл
 Тогда все просто. Заменим условный переход
 
 на противоположный. Прога будет думать, что РН верный и зарегится. Файл xxxxxxxx.key на каждом компе хххххххх будет разным. Введем d 100170FC и видим 0F84.....016F:100170FC JZ NEAR 100171FAЗаменять надо 0F84 на 0F85. Итак, такой патч:
 Патч: aon.exe запакован UPX 0.72. И как говорит сам UPX: packed by obsolete version of UPX. Cannot unpack. Сам файл нам не распаковать и не пропатчить (хотя это спорный вопрос). Тогда будем ломать его в памяти. Тут поможет Sign 0f Misery - мощная система для помощи кракеру. Можно достать тут. Создадим скрипт со следующими инструкциями:
 
 Заключение: мы получили не loader для файла, а кряк! Его можно запускать всего один раз, он пропатчит прогу, а мы введем всякую ерунду в Имя и РН. Будем зарегистрированы. Теперь этот сrack нам больше не нужен.Установиить максимальное время работы скрипта                         3,0 сек.      N/AЗапустить программу                                                   Aon.exe       N/A
 Изменить значение байта в адресном пространстве открытого процесса    #100170FD     133
 Завершить скрипт                                                      N/A           N/A
 |  |