Как прога попадает в обработчик исключений?

Тема в разделе "WASM.RESEARCH", создана пользователем cresta, 11 апр 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Есть dll. Установлено ограничение на 30 дней. В течение этого периода появляется (из ресурсов) диалог предупреждения. По истечение установленного срока диалог не дает работать больше 30 сек. TerminateProcess, при этом последние 10 сек сопровождаются MessageBeep'ом. Защита строится на обработке исключений. Нашёл обработчик, в нем отслеживаются операции по биканью и удалению процесса. Заблокировал. Есть два момента, которые не дают уверенности, что нашёл всё. (хотя и проверял перестановкой системной даты)

    Первый: В реестре дата окончания срока записана практически открытым текстом: REG_SZ "50025001" - т.е. читая наоборот 10 мая 2005г.

    Второй: Диалог грузится не через API, а через MFC, либо #6197, либо, если этот ординал заблокирован/пропатчен, через #6215. Т.е. отслеживается отсутствие диалога и происходит вызов другим способом. Нет полной уверенности, что нашёл всё, и где-нибудь не вылезет ещё какой диалог:dntknw:

    Поэтому хотелось бы отследить самое начало, откуда программа попадает в обработчик исключения и по какому условию. Пытался посмотреть в отладчике - не могу найти. Можно ли это вообще определить? И как?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    cresta

    Обработчик получает в качестве 3го параметра указатель на структуру CONTEXT (определение есть в windows.inc), в которой прописаны значения всех регистров на момент исключения. Среди регистров есть EIP, т.е. адрес инструкции вызвавшей исключение.
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    q_q

    Эта статья ещё больше запутала меня :dntknw:



    В отладчике вижу такое:


    Код (Text):
    1. 10064130   6A FF            PUSH -1
    2. 10064132   68 88FE0610      PUSH CO85D1~1.1006FE88
    3. 10064137   64:A1 00000000   MOV EAX,DWORD PTR FS:[0]
    4. 1006413D   50               PUSH EAX
    5. 1006413E   64:8925 00000000 MOV DWORD PTR FS:[0],ESP
    6. 10064145   81EC 30010000    SUB ESP,130
    7. ;тут происходят все безобразия
    8. ;
    9. 100643CF   8B8C24 3C010000  MOV ECX,DWORD PTR SS:[ESP+13C]
    10. 100643D6   5F               POP EDI
    11. 100643D7   8BC3             MOV EAX,EBX
    12. 100643D9   5E               POP ESI
    13. 100643DA   5B               POP EBX
    14. 100643DB   64:890D 00000000 MOV DWORD PTR FS:[0],ECX
    15. 100643E2   81C4 3C010000    ADD ESP,13C
    16. 100643E8   C3               RETN




    Как я понял это внутрипоточный обработчик. Если на 10064130 поставить брейкпоинт, то состояние регистров такое:
    Код (Text):
    1. EAX 1008B110 CO85D1~1.1008B110
    2. ECX 1008B110 CO85D1~1.1008B110
    3. EDX 1007C7F0 CO85D1~1.1007C7F0
    4. EBX 005A0444
    5. ESP 0012F438
    6. EBP 0012F464
    7. ESI 73D98E75 MFC42.#1130
    8. EDI 00000000
    9. EIP 10064130 CO85D1~1.10064130




    Пытался ставить брейки на все эти адреса, но только погряз в user32, и всё:dntknw:



    Quantum

    Если обработчик - финальный, то я знаю как достать адрес, по которому было исключение из CONTEXT'а, а в случае

    внутрипоточного эта структура ведь недоступна? Или её можно заполучить?
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    cresta



    Так вот он - обработчик по адресу CO85D1~1.1006FE88. На него и бряк ставить или подождать исключения и пропустить его (SHIFT - F7 в Olly) или вообще в Debugging Options - Exceptions отключить перехватывание исключений (это для Olly).





    3й параметр (esp + 12) содержит указатель на CONTEXT! Это справедливо именно для внутрипоточного обработчика. Пример:
    Код (Text):
    1. seh_handler:
    2. mov eax,[esp + 12]
    3. mov eax,[eax + CONTEXT.regEip]
    4. ; В EAX имеем значение EIP
    5.  
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    1006FE88 - смотрел, может что-то упустил, пойду ещё раз смотреть. Ок.