Помогите понять и найти сбойное место в программе..

Тема в разделе "WASM.RESEARCH", создана пользователем Morgan, 23 июн 2009.

  1. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Morgan
    Берёшь файл <ntstatus.h>. Находишь в нём код исключения – 0xC0000005. Читаешь описание: STATUS_ACCESS_VIOLATION. Ака "нарушение доступа". Ага, теперь берёшь IDA Pro. Открываешь ntdll.dll. Кликаешь меню "Jump - Jump to Address (CTRL+G)". Вписываешь смещение ошибки: +0x3e13d. IDA переходит на строчку, при выполнении которой произошло исключение. Медитируешь:
    Код (Text):
    1. .text:77F0E0BB 8B 75 08             mov  esi, [ebp+arg_0]
    2. <..>
    3. .text:77F0E136 8B 06                mov  eax, [esi]
    4. .text:77F0E138 83 F8 FF             cmp  eax, 0FFFFFFFFh
    5. .text:77F0E13B 74 04                jz   short loc_77F0E141
    6. .text:77F0E13D 83 40 14 01          add  dword ptr [eax+14h], 1
    7. .text:77F0E141
    8. .text:77F0E141                      loc_77F0E141:
    Понимаешь, что esi содержит указатель на критическую секцию, а eax – указатель на дебажную её инфу. Смотришь описание крысекции и дебажной инфы:
    Код (Text):
    1. // <winnt.h>
    2. typedef struct _RTL_CRITICAL_SECTION {
    3.     PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
    4.  
    5.     LONG LockCount;
    6.     LONG RecursionCount;
    7.     HANDLE OwningThread;        // from the thread's ClientId->UniqueThread
    8.     HANDLE LockSemaphore;
    9.     ULONG_PTR SpinCount;
    10. } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
    11.  
    12.  
    13.  
    14. typedef struct _RTL_CRITICAL_SECTION_DEBUG {
    15.     WORD   Type;
    16.     WORD   CreatorBackTraceIndex;
    17.     struct _RTL_CRITICAL_SECTION *CriticalSection;
    18.     LIST_ENTRY ProcessLocksList;
    19.     DWORD EntryCount;
    20.     DWORD ContentionCount;
    21.     DWORD Flags;
    22.     WORD   CreatorBackTraceIndexHigh;
    23.     WORD   SpareWORD  ;
    24. } RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;
    Понимаешь, что строка, вызвавшая исключение – add dword ptr [eax+14h], 1 – просто увеличивает какое-то поле Flags внутри дебажной инфы. Также понимаешь, что кто-то неверно заполнил поле DebugInfo в крысекции.

    Quick'n'dirty метод решения:
    Написать лоадер, который будет загружать сбойную программу, проверять версию ntdll.dll и, используя WriteProcessMemory, записывать в сбойную программу по адресу ntdll!3e13d четыре байта: 90h, 90h, 90h, 90h. Почему это будет работать? Потому что строка "add dword ptr [eax+14h], 1" не нужна для функционирования, но используется только для отладки.
     
  2. Morgan

    Morgan New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    35
    Sol_Ksacap
    Спасибо.... а если удастся найти исходники всей программы где раскопать причину её такого падения?
     
  3. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Morgan
    Работает у нас без особой настройки.

    Да собственно так же, как и без исходников – найти, где вручную инициализируются критические секции. Вероятно, там специальный класс для этого создан. Так вот, его полностью переделать: заменить всякую кастомизированную гречиху на вызов InitializeCriticalSection и всё такое.

    Один должен учитывать, что это с самого начала лишь теория, построенная на минимальном количестве входных данных. Возможно, причина падения не в неправильной ручной инициализации крысекции.

    Окей, удачного ресерча.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Morgan
    Дельфе гуан полнейший, пишите на нормальном языке си/асм и такие проблемы не возникнут.
     
  5. Morgan

    Morgan New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    35
    class function TEncoding.GetUTF8: TEncoding;
    var
    LEncoding: TEncoding;
    begin
    if FUTF8Encoding = nil then
    begin
    LEncoding := TUTF8Encoding.Create;
    if InterlockedCompareExchangePointer(Pointer(FUTF8Encoding), LEncoding, nil) <> nil then <<<<< падает внутри
    LEncoding.Free;
    end;
    Result := FUTF8Encoding;
    end;

    Валится здесь на InterlockedCompareExchangePointer (Дельфя 9)
     
  6. Morgan

    Morgan New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    35
    PS но не всегда при непонятных стечених обстоятельств специально не повторить....
     
  7. Morgan

    Morgan New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    35
    [​IMG]
    Приэтом выдает следующую ошибку на экран..
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Судя по class function, переменная FUTF8Encoding является глобальная (статической) и соотв-но при правильной передаче ее адреса в InterlockedCompareExchange ошибки быть быть не должно.
    Правда в дельфях есть дурная привычка при объявлении ф-й АПИ "на шару" заменять указатели на var-параметры - где-то заменяют, где-то нет. Данный вариант вызова с передачей Pointer(FUTF8Encoding) как раз соответствует var-параметру и если по какой-то причине в функции он объявлен не var, а просто как pPointer (как в оригинале), то ес-но будет облом. Но в этом сл. облом д.б. при первом же вызове Interlocked..

    Странно в начале было AV, а теперь какой-то дескриптор окна, да еще в какой-то tipet.dll ?! Проверь, что за dll - может какой левый перехватчик цепляется
     
  9. Morgan

    Morgan New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    35
    leo
    dll своя... не левая..
     
  10. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Morgan
    Ну так что там с InterlockedCompareExchangePointer? Как она была объявлена? А с критическими секциями – наша догадка подтвердилась? (Статистическое собирание).
     
  11. Morgan

    Morgan New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    35
    Sol_Ksacap
    InterlockedCompareExchangePointer - компанент дельфей в нем ничего не исправить.. а что там в нутри мне не пойсатьотладчик ни звавесит не берет Оля перехватывает и показывает пустые окна.
     
  12. Morgan

    Morgan New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    35
    Так ошибка перестала выскакивать кто может логически объяснить расказываю что и как

    на машине в системе стоит версия *.ocx flash рлэйера от adobe версии 10.0.22.87

    в приложении активно используется тоже в каталоге программы *.ocx но старой версии

    после удаления в системе с помощью утилиты от adobe flash плэйера и подмены файла в каталоге программы на туже версию что и в системе глюки не повторяются.. почему кто нить может грамотно ответить?
     
  13. Morgan

    Morgan New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    35
    PS - старой версии был файл ocx в каталоге программы- 10.0.12.36
     
  14. Morgan

    Morgan New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    35
    У кого какие будут предположения? заранее спасибо