Товарищи, вот есть у меня демо-программа с триальной 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): 01C10000 Main JMP SHORT 01C10005 , а в другом - Код (Text): 01C10000 Main JMP SHORT 01C10004 !!! Я бы понял, - будь здесь регистр... или адрес памяти... Но тут конкретный EIP. А отсюда программа шустро бежит в разные стороны... Объясните, если возможно, как это получается? ЗЫ Олька почему-то показывает разные переходы от начала процедуры 01С10000 в окне CPU - то JMP SHORT 01C10005, то JMP SHORT 01C10004...
Поставь аппаратную точку останова на запись в байт по адресу 01C10001. Вероятно, самомодификация. А вообще, если программа явно говорит, сколько ей жить осталось и перестает работать по истечению срока, то это отличный ключ к тому, чтобы заставить ее одуматься .
Ну, я ж не просто так тискаю эту триальную dll-ку Но пока не очень, честно говоря... Триальный предел, кстати, - 24 дня, - удаляется TrashReg'ом. Вечный триал... Тоже повод приглядеться. Да, процедура 01C10000 генерится динамически - на Hardware BP -> Access - это хорошо видно. А какой в этом смысл?
Если посмотреть на параметры возвращаемые GetInterface(), то видно что в !0x194AC возвращается указатель на переменную, содержащую указатель на массив обработчиков. Если этот адрес tgsdk!0x5ADD8 вручную загрузить, без вызова GetInterface() приложение запуститься, но не полностью фунциклировать будет, вероятно там какаято инициализация не проходит. А по быстрому триал продляется удалением ключа аспака из реестра.