<app> has encountered a problem and needs to close
От: Аноним  
Дата: 08.12.06 08:54
Оценка:
Здрайвствуйте!

Есть у меня dll, которая инжектится во все процессы и в том числе в rundll32.exe. Инъекция идёт с помощью SetWindowsHookEx(). Уже находясь внутри процесса, перехватываю в ней две API функции путём замены первых байт на push <addr> ret. Инъекция проходит успешно, хук тоже. Но когда я например открываю свойства экрана или свойства системы, или любой другой компонент панели управления, то вызывается rundll32.exe, далее окно отображается нормально, но когда его закрываешь, например нажав Отмена, — вылезает subj. А именно окно с сообщением типа <rundll32> has encountered a problem and needs to close и кнопками Send error report и Don't send.

Во всех остальных программах такого не наблюдается.

Перед установкой хука я даже останавливаю все потоки процесса, а после — возобновляю их.

Вопросы:

1. как мне может помочь инфа из этого окна с сообщением об ошибке, в частности инфа из файла d6cd_appcompat.txt, т.е. technical information, как ей воспользоваться, чтобы понять где ошибка?
2. вообще кто сталкивался, скажите в чём может быть дело?
Re: <app> has encountered a problem and needs to close
От: Аноним  
Дата: 08.12.06 09:05
Оценка:
Здравствуйте, Аноним, Вы писали:

Хочу добавить:

Exception code: 0xC0000005 (access violation)
Flags: 0x00000000
Record: 0x0000000000000000
Address: 0x00000000<addr>
Re[2]: <app> has encountered a problem and needs to close
От: Аноним  
Дата: 08.12.06 16:42
Оценка:
Здравствуйте, Аноним, Вы писали:

Ещё дополнение:

Некоторые другие программы тоже падают с аналогичной ошибкой, но самое интересное — они падают именно во время закрытия. Исключение — Outlook Express, он падает при нажатии Send/Recieve, причём падает молча, без каких либо сообщений об ошибках.

Забыл сказать, я перехватываю следующие 4 функции: send(), WSASend(), recv(), WSARecv() из WS2_32.DLL.

Система XP SP2.

Мучая код, заметил такую штуку: если не вызывать функции работы с адресной книгой (Windows Address Book), то никаких падений не происходит, отсюда делаю вывод, что кривой код именно здесь. Суть этого кода в том, чтобы имея email получить display name. Вот эта функция:

LPWABOPEN
GetWabOpenAddress (HMODULE* phModule)
{
    bool r = false;

    char* wabdllpath = NULL;
    DWORD dwtype = REG_SZ, dwsize = MAX_BUFFER;
    HMODULE hwablib = NULL;

    __try
    {
        wabdllpath = new char [MAX_BUFFER];
        if (! wabdllpath) goto END;

        if (SHGetValue (
            HKEY_LOCAL_MACHINE,
            WAB_DLL_PATH_KEY,
            NULL,
            &dwtype,
            wabdllpath,
            &dwsize) != ERROR_SUCCESS)
        {
            goto END;
        }

        hwablib = GetModuleHandle (PathFindFileName (wabdllpath));
        if (! hwablib)
        {
            hwablib = LoadLibrary (wabdllpath);
            if (! hwablib) goto END;
        }
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
        goto END;
    }

    r = true;

END:

    if (wabdllpath) delete[] wabdllpath;

    if (! r)
    {
        if (hwablib) FreeLibrary (hwablib);
        return false;
    }
    else
    {
        if (phModule) *phModule = hwablib;
    }

    return (LPWABOPEN) GetProcAddress (hwablib, "WABOpen");
}

bool
GetEmailInfo (char* pEmail, char* pOutBuffer)
{
    bool r = false;

    if (! pEmail || ! pOutBuffer) goto END;

    LPADRBOOK lpab = NULL;
    LPWABOBJECT lpwabobj = NULL;
    WAB_PARAM wp;
    HRESULT hr;
    ULONG cbEID;
    ENTRYID* lpEID;
    LPWABOPEN lpfnWabOpen = NULL;
    LPMAPITABLE ptbl = NULL;
    LPSRowSet pRows = NULL;
    ULONG ulrc;
    ULONG ulObjType = 0;
    LPABCONT lpContainer = NULL;
    HMODULE hwabdll = NULL;

    char* email = NULL;
    char* dname = NULL;

    __try
    {
        lpfnWabOpen = GetWabOpenAddress (&hwabdll);
        if (! lpfnWabOpen) goto END;

        hr = lpfnWabOpen (&lpab, &lpwabobj, &wp, 0);
        if (FAILED (hr)) goto END;

        hr = lpab -> GetPAB (&cbEID, &lpEID);
        if (FAILED (hr)) goto END;

        hr = lpab -> OpenEntry (cbEID, (LPENTRYID) lpEID, NULL, 0, &ulObjType, (IUnknown**) &lpContainer);
        if (FAILED (hr)) goto END;

        hr = lpContainer -> GetContentsTable (0, &ptbl);
        if (FAILED (hr)) goto END;

        hr = ptbl -> GetRowCount (0, &ulrc);
        if (FAILED (hr)) goto END;

        hr = ptbl -> QueryRows (ulrc, 0, &pRows);
        if (FAILED (hr)) goto END;

        email = new char [MAX_BUFFER];
        if (! email) goto END;
        dname = new char [MAX_BUFFER];
        if (! dname) goto END;

        email [0] = '\0';
        dname [0] = '\0';

        for (ULONG i = 0; i < pRows -> cRows; i ++)
        {
            ULONG pcount = pRows [i].aRow -> cValues;
            SRow* pRow = &pRows -> aRow [i];

            for (ULONG j = 0; j < pcount; j ++)
            {
                __try
                {
                    SPropValue* pProp = &pRow -> lpProps [j];

                    switch (pProp -> ulPropTag)
                    {
                        case PR_DISPLAY_NAME:
                            lstrcpy (dname, pRows -> aRow [i].lpProps [j].Value.lpszA);
                            break;
                        case PR_EMAIL_ADDRESS:
                            lstrcpy (email, pRows -> aRow [i].lpProps [j].Value.lpszA);
                            break;
                    }
                }
                __except (EXCEPTION_EXECUTE_HANDLER)
                {
                    break;
                }
            }

            if (email [0] != '\0' &&
                dname [0] != '\0' &&
                lstrcmpi (email, pEmail) == 0)
            {
                lstrcpy (pOutBuffer, dname);

                r = true;
                break;
            }
        }
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
        goto END;
    }

END:

    if (email) delete[] email;
    if (dname) delete[] dname;

    return r;
}


Очень срочно нужно! Помогите кто знает, хоть предположения, где может быть грабля...
Re[3]: <app> has encountered a problem and needs to close
От: Аноним  
Дата: 08.12.06 17:00
Оценка:
Здравствуйте, Аноним, Вы писали:

Ещё заметил, что программы падают всегда с одной и той же ошибкой Access violation, read address at 608A2A3B — адрес тоже всегда один и тот же. Можно ли как-нибудь посмотреть, кто обращается к этому адресу и в каком модуле этот адрес, не используя тяжёлых средств вроде SoftICE ?
Re[4]: <app> has encountered a problem and needs to close
От: IID Россия  
Дата: 08.12.06 19:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>Ещё заметил, что программы падают всегда с одной и той же ошибкой Access violation, read address at 608A2A3B — адрес тоже всегда один и тот же. Можно ли как-нибудь посмотреть, кто обращается к этому адресу и в каком модуле этот адрес, не используя тяжёлых средств вроде SoftICE ?


убери патчинг, пронаблюдай падения. Если исчезнут — методом исключения проверь какой перехват приводит к падению. Запусти OE под отладчиком, с бряком на любое исключение. Может быть твой AV это кульминация целой серии резрушающих событий. Сделай логгинг вызовов своих перехватов. Ну и в заключение — покажи код патча. Мож он у тя кривой и падение происходит потому что ты все время ставишь-снимаешь патч (сталкивался и с таким)
kalsarikännit
Re[5]: <app> has encountered a problem and needs to close
От: Аноним  
Дата: 08.12.06 20:46
Оценка:
Здравствуйте, IID, Вы писали:

IID>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Аноним, Вы писали:


А>>Ещё заметил, что программы падают всегда с одной и той же ошибкой Access violation, read address at 608A2A3B — адрес тоже всегда один и тот же. Можно ли как-нибудь посмотреть, кто обращается к этому адресу и в каком модуле этот адрес, не используя тяжёлых средств вроде SoftICE ?


IID>убери патчинг, пронаблюдай падения. Если исчезнут — методом исключения проверь какой перехват приводит к падению. Запусти OE под отладчиком, с бряком на любое исключение. Может быть твой AV это кульминация целой серии резрушающих событий. Сделай логгинг вызовов своих перехватов. Ну и в заключение — покажи код патча. Мож он у тя кривой и падение происходит потому что ты все время ставишь-снимаешь патч (сталкивался и с таким)


Нечто похожее наблюдал с инжектом на вин98.
Re[5]: <app> has encountered a problem and needs to close
От: Аноним  
Дата: 11.12.06 07:22
Оценка:
Здравствуйте, IID, Вы писали:

IID>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Аноним, Вы писали:


А>>Ещё заметил, что программы падают всегда с одной и той же ошибкой Access violation, read address at 608A2A3B — адрес тоже всегда один и тот же. Можно ли как-нибудь посмотреть, кто обращается к этому адресу и в каком модуле этот адрес, не используя тяжёлых средств вроде SoftICE ?


IID>убери патчинг, пронаблюдай падения. Если исчезнут — методом исключения проверь какой перехват приводит к падению. Запусти OE под отладчиком, с бряком на любое исключение. Может быть твой AV это кульминация целой серии резрушающих событий. Сделай логгинг вызовов своих перехватов. Ну и в заключение — покажи код патча. Мож он у тя кривой и падение происходит потому что ты все время ставишь-снимаешь патч (сталкивался и с таким)


Антивируса никакого не установленно.
Да, я довольно часто ставлю-снимаю патч, а именно внутри вызова моей new-функции, перед вызовом оригинальной функции — снимаю (возвращаю старые байты), после — устанавливаю патч опять. Возможно это и есть слабое место. Код патча такой:

bool UninstallHook (LPVOID origfaddr, CODE* poldcode)
{
    __try
    {
        SIZE_T szt;
        if (! WriteProcessMemory (
            GetCurrentProcess (),        // process to write to
            origfaddr,                    // entry point of function to write to
            poldcode,                    // original function code
            sizeof (CODE),                // number of bytes to write
            &szt))                        // number of bytes written
        {
            return false;
        }
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
#ifdef _DEBUG
        MessageBox (0, "exception in UninstallHook", "error", MB_ICONEXCLAMATION);
#endif

        return false;
    }

    return true;
}

bool
InstallHook (LPVOID origfaddr, LPVOID newfaddr, CODE* poldcode)
{
    __try
    {
        // reading original bytes
        CODE code = *(CODE*) origfaddr;

        // saving original bytes
        *poldcode = code;

        // preparing new code
        //
        // push newfaddr
        // ret
        //
        code.push = 0x68;
        code.push_arg = (DWORD) newfaddr;
        code.ret = 0xC3;

        // writting new code to beginning of original function
        SIZE_T szt;
        if (! WriteProcessMemory (
            GetCurrentProcess (),        // process to write to
            origfaddr,                    // function entry point to write to
            &code,                        // new function startup code
            sizeof (CODE),                // number of bytes to write
            &szt))                        // number of bytes written
        {
            return false;
        }
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
#ifdef _DEBUG
        MessageBox (0, "exception in InstallHook", "error", MB_ICONEXCLAMATION);
#endif

        return false;
    }

    return true;
}
Re[6]: <app> has encountered a problem and needs to close
От: dialex  
Дата: 11.12.06 13:09
Оценка:
А>Да, я довольно часто ставлю-снимаю патч, а именно внутри вызова моей new-функции, перед вызовом оригинальной функции — снимаю (возвращаю старые байты), после — устанавливаю патч опять. Возможно это и есть слабое место. Код патча такой:

http://wasm.ru/article.php?article=apihook_1
Не произноси ложного свидетельства на ближнего твоего.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.