Есть dll. Установлено ограничение на 30 дней. В течение этого периода появляется (из ресурсов) диалог предупреждения. По истечение установленного срока диалог не дает работать больше 30 сек. TerminateProcess, при этом последние 10 сек сопровождаются MessageBeep'ом. Защита строится на обработке исключений. Нашёл обработчик, в нем отслеживаются операции по биканью и удалению процесса. Заблокировал. Есть два момента, которые не дают уверенности, что нашёл всё. (хотя и проверял перестановкой системной даты) Первый: В реестре дата окончания срока записана практически открытым текстом: REG_SZ "50025001" - т.е. читая наоборот 10 мая 2005г. Второй: Диалог грузится не через API, а через MFC, либо #6197, либо, если этот ординал заблокирован/пропатчен, через #6215. Т.е. отслеживается отсутствие диалога и происходит вызов другим способом. Нет полной уверенности, что нашёл всё, и где-нибудь не вылезет ещё какой диалог Поэтому хотелось бы отследить самое начало, откуда программа попадает в обработчик исключения и по какому условию. Пытался посмотреть в отладчике - не могу найти. Можно ли это вообще определить? И как?
cresta Ты посещаешь WASM.RU? Сейчас там самая свежая статья Обработка исключений Win32 для программистов на ассемблере[Jeremy Gordon / пер. Oleg_SK].
cresta Обработчик получает в качестве 3го параметра указатель на структуру CONTEXT (определение есть в windows.inc), в которой прописаны значения всех регистров на момент исключения. Среди регистров есть EIP, т.е. адрес инструкции вызвавшей исключение.
q_q Эта статья ещё больше запутала меня В отладчике вижу такое: Код (Text): 10064130 6A FF PUSH -1 10064132 68 88FE0610 PUSH CO85D1~1.1006FE88 10064137 64:A1 00000000 MOV EAX,DWORD PTR FS:[0] 1006413D 50 PUSH EAX 1006413E 64:8925 00000000 MOV DWORD PTR FS:[0],ESP 10064145 81EC 30010000 SUB ESP,130 ;тут происходят все безобразия ; 100643CF 8B8C24 3C010000 MOV ECX,DWORD PTR SS:[ESP+13C] 100643D6 5F POP EDI 100643D7 8BC3 MOV EAX,EBX 100643D9 5E POP ESI 100643DA 5B POP EBX 100643DB 64:890D 00000000 MOV DWORD PTR FS:[0],ECX 100643E2 81C4 3C010000 ADD ESP,13C 100643E8 C3 RETN Как я понял это внутрипоточный обработчик. Если на 10064130 поставить брейкпоинт, то состояние регистров такое: Код (Text): EAX 1008B110 CO85D1~1.1008B110 ECX 1008B110 CO85D1~1.1008B110 EDX 1007C7F0 CO85D1~1.1007C7F0 EBX 005A0444 ESP 0012F438 EBP 0012F464 ESI 73D98E75 MFC42.#1130 EDI 00000000 EIP 10064130 CO85D1~1.10064130 Пытался ставить брейки на все эти адреса, но только погряз в user32, и всё Quantum Если обработчик - финальный, то я знаю как достать адрес, по которому было исключение из CONTEXT'а, а в случае внутрипоточного эта структура ведь недоступна? Или её можно заполучить?
cresta Так вот он - обработчик по адресу CO85D1~1.1006FE88. На него и бряк ставить или подождать исключения и пропустить его (SHIFT - F7 в Olly) или вообще в Debugging Options - Exceptions отключить перехватывание исключений (это для Olly). 3й параметр (esp + 12) содержит указатель на CONTEXT! Это справедливо именно для внутрипоточного обработчика. Пример: Код (Text): seh_handler: mov eax,[esp + 12] mov eax,[eax + CONTEXT.regEip] ; В EAX имеем значение EIP