Там, где кончается триал

Тема в разделе "WASM.RESEARCH", создана пользователем Tihon, 20 авг 2009.

  1. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Товарищи, вот есть у меня демо-программа с триальной dll.
    И есть два куска листингов трассировки, полученных Olly при почти одинаковых условиях: разница только та, что программа выполнялась сначала при живом триале (24 дня), а потом, - при просроченном (искусственно, переносом даты на месяц вперед).

    В длл-ке присутвует некая функция GetInterface, внутри которой программа выкидывает окно сообщения - либо количество дней до конца, либо - "Trial expired".
    После загрузки dll делаем бряк, переходим на просмотр той самой dll, а потом в ней ставим останов на начало GetInterface.
    Теперь от бряка начинаю трассировать с записью лога, имея в виду получить те самые листинги, считая, что к бряку оба раза приходим одинаково. Ну, или почти одинаково...

    Конечно же, до того самого окошка трассировка не добежала, - полные логи - по 60 мб...
    Но где-то они начнут разбегаться?
    Эти листниги начинаю сравнивать на предмет узнать, где же она "сходит с ума"?

    Вот начальные фрагменты - приаттачены. Я отметил отличия.
    http://www.filehoster.ru/files/dh8703
    http://www.filehoster.ru/files/dh8711
    Маленькая разница начинается на строке 143...
    Кто посмотрит - скажите, что она означает?

    БОЛЬШАЯ разница - на строке 173. Здесь я припух.. Для меня ниоткуда не следует, что в одном случае -
    Код (Text):
    1. 01C10000 Main     JMP SHORT 01C10005
    , а в другом -
    Код (Text):
    1. 01C10000 Main     JMP SHORT 01C10004
    !!! Я бы понял, - будь здесь регистр... или адрес памяти...
    Но тут конкретный EIP. А отсюда программа шустро бежит в разные стороны...

    Объясните, если возможно, как это получается? :)

    ЗЫ Олька почему-то показывает разные переходы от начала процедуры 01С10000 в окне CPU - то JMP SHORT 01C10005, то JMP SHORT 01C10004...
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Поставь аппаратную точку останова на запись в байт по адресу 01C10001. Вероятно, самомодификация.

    А вообще, если программа явно говорит, сколько ей жить осталось и перестает работать по истечению срока, то это отличный ключ к тому, чтобы заставить ее одуматься :).
     
  3. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Ну, я ж не просто так тискаю эту триальную dll-ку:) Но пока не очень, честно говоря...
    Триальный предел, кстати, - 24 дня, - удаляется TrashReg'ом. Вечный триал... Тоже повод приглядеться.

    Да, процедура 01C10000 генерится динамически - на Hardware BP -> Access - это хорошо видно. А какой в этом смысл?
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Смысл -- запутать, усложнить анализ, например.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Если посмотреть на параметры возвращаемые GetInterface(), то видно что в !0x194AC возвращается указатель на переменную, содержащую указатель на массив обработчиков. Если этот адрес tgsdk!0x5ADD8 вручную загрузить, без вызова GetInterface() приложение запуститься, но не полностью фунциклировать будет, вероятно там какаято инициализация не проходит. А по быстрому триал продляется удалением ключа аспака из реестра.