Re[3]: Блокировка Int3
От: McQwerty Россия  
Дата: 16.02.11 13:36
Оценка:
Здравствуйте, OmegaDelta, Вы писали:

OD>Здравствуйте, McQwerty, Вы писали:

MQ>>Очень похоже на работу assert'a внутри CRT при разрушении внутренней структуры кучи.
OD>Возможно,если учесть что DLL писалась на С++.
MQ>>Боюсь, что просто продолжением работы после этого можно сделать ещё хуже.
OD>Как не странно, этого не происходит.При возникновении прерывания выводится окошко Windows с выбором действия
OD>(завершить, отладить) и отладчик без проблем дает сигнал на продолжение работы.
MQ>>Нужно смотреть на выходы за границы выделенной памяти, двойное освобождение участков памяти, использование памяти после освобождения.
OD>Исходников DLL нет в природе.

Тогда попробовать что-то типа такого (инструкцию "int 3" таким образом можно обойти):
#include "stdafx.h"

void dll_func ()
{
    printf ("--- f.1 ---\n");
    RaiseException (EXCEPTION_BREAKPOINT, 0, 0, 0);
    printf ("--- f.2---\n");
} // dll_func

int main(int argc, char* argv[])
{
    printf ("--- 1 ---\n");

    __try
    {
        printf ("--- 2 ---\n");
        dll_func ();
        printf ("--- 3 ---\n");
    }
    __except
    (
        GetExceptionCode () == EXCEPTION_BREAKPOINT ?
            (
                (GetExceptionInformation ()) -> ContextRecord -> Eip ++,
                EXCEPTION_CONTINUE_EXECUTION
            ) :
            EXCEPTION_CONTINUE_SEARCH
    )
    {
        printf ("--- 4 ---\n");
    }

    printf ("--- 5 ---\n");

    return 0;
}


Выхлоп:

--- 1 ---
--- 2 ---
--- f.1 ---
--- f.2---
--- 3 ---
--- 5 ---


PS: Винда, интел, 32 бит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.