Проблемы с самописным обработчиком скриптов

Тема в разделе "WASM.WIN32", создана пользователем dev, 23 янв 2011.

  1. dev

    dev New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    39
    Здравствуйте!
    Все по порядку. Необходимо было сделалать обработчик скриптов (Script Engine) для Windows XP и выше, смысл его просто в том, чтобы пропускать через себя все запущенные скрипты (JS,VB и т.д.) и передавать скрипт оригинальному обработчику без изменений (например в случае с JS - jscript.dll). Насколько я понимаю именно так делают антивирусы для анализа вредоносных скриптов.
    Обработчик сделан - это COM-объект с реализацией интерфейсов IActiveScript, IActiveScriptParse, IObjectSafety. Этот обработчик прописывается в реестре на место оригинального. При вызове самописного обработчика он определяет оригинальный обработчик и из него вызывает интерфейсы IActiveScript, IActiveScriptParse:
    Код (Text):
    1. ...
    2. (*realModule) = LoadLibrary( "jscript.dll" );
    3.  
    4.   if ( NULL != (*realModule) )
    5.   {
    6.     pfnDllGetClassObject = ( m_PFNDLLGETCLASSOBJECT )GetProcAddress( (*realModule), "DllGetClassObject" );
    7.  
    8.     if ( NULL != pfnDllGetClassObject )
    9.     {
    10.       pfnDllGetClassObject( scriptEngineCLSID, IID_IClassFactory, ( void** )&pFactory );
    11.  
    12.       if ( NULL != pFactory )
    13.       {
    14.         hr = pFactory->CreateInstance( NULL, IID_IActiveScript, ( void** )realScriptEngine );
    15.         pFactory->Release();
    16.  
    17.         if ( FAILED( hr ) )
    18.         {
    19.           goto FreeRes;
    20.         }
    21.  
    22.         hr = (*realScriptEngine)->QueryInterface( IID_IActiveScriptParse, ( void** )realScriptParser );
    23.  
    24. ...
    Далее в самописном обработчике в реализации методов интерфейсов IActiveScript, IActiveScriptParse просто вызываются методы интерфейсов из оригинального обработчика:

    Код (Text):
    1. ...
    2. STDMETHODIMP CScriptEngineCOM::GetScriptSite( REFIID riid, void** ppv )
    3. {
    4.   return m_gpRealScriptEngine->GetScriptSite( riid, ppv );
    5. }
    6.  
    7.   return E_FAIL;
    8. }
    9. ...
    Тоесть просто идет проброс параметров в методы оригинального обработчика.

    Данный самописный обработчик работает исправно, если вызывать "внешние" скрипты, то есть, например, файлы *.JS со скриптом.
    Проблемы начинаются тогда, когда скрипты обрабатываются, например, в IE (тестировалась версия 8). Некоторые скрипты обрабатываются нормально, а некоторые валят IE (а точнее mshtml.dll). Причем по отладке видно, что скрипт перехватился моим обработчиком, а когда начинается выгрузка COM-a, то освобождаются ресурсы после чего идет падение.
    Пример информации о падении:
    Код (Text):
    1. Сигнатура проблемы:
    2.   Имя события проблемы:   APPCRASH
    3.   Имя приложения:  iexplore.exe
    4.   Версия приложения:    8.0.7600.16385
    5.   Отметка времени приложения:   4a5bc69e
    6.   Имя модуля с ошибкой:    mshtml.dll
    7.   Версия модуля с ошибкой:  8.0.7600.16385
    8.   Отметка времени модуля с ошибкой: 4a5bda8a
    9.   Код исключения:  c0000005
    10.   Смещение исключения:    0017d347
    11.   Версия ОС:    6.1.7600.2.0.0.256.1
    12.   Код языка:    1049
    13.   Дополнительные сведения 1:  0a9e
    14.   Дополнительные сведения 2:  0a9e372d3b4ad19135b953a78882e789
    15.   Дополнительные сведения 3:  0a9e
    16.   Дополнительные сведения 4:  0a9e372d3b4ad19135b953a78882e789
    Может кто-нибудь сталкивался с подобными ситуациями, в чем может быть дело?
    И если есть примеры реализации обработчиков скриптов, то очень буду благодарен!

    Спасибо.