У компилятора была паранойя?

Тема в разделе "WASM.BEGINNERS", создана пользователем Dmitry_Milk, 23 дек 2007.

  1. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Не могу понять, либо я сошел с ума, либо компилятор, которым клепали программу, дизассемблируемую мной.

    По всему тексту программы напихан код, вызывающий определенную функцию в случае провала проверки на допустимость каких-либо значений (границы массивов там, диапазоны значений в таблицах switch-case, нулевые указатели перед их разадресацией или просто значения, которые никак не должны быть в текущей ситуации).

    что-то типа такого:
    Код (Text):
    1. test     edi,edi
    2. jnz     qwer
    3. push    0F6h
    4. push    0Bh
    5. call    TraceError
    6. add     esp, 8
    7. qwer:
    8. mov     eax,[edi]
    Саму TraceError не привожу, но суть там сразу видно - она в зависимости от состояния глобальной переменной либо вызывает прерывание отладчика либо выводит сообщение об невозможности продолжения выполнения программы. В любом случае вызов этой функции - ненормальная ситуация, которая вообще не должна возникать если в проге все в порядке.

    С этим все понятно, самоконтроль программы - дело нужное. Но вот это я вообще понять не могу:
    Код (Text):
    1. .text:1006ADF9                 mov     al, byte ptr [esi+Element.field_330]
    2. .text:1006ADFF                 test    al, 2
    3. .text:1006AE01                 jz      short loc_1006AE1F
    4. .text:1006AE03                 test    al, 2
    5. .text:1006AE05                 jnz     short loc_1006AE16
    6. .text:1006AE07                 push    105h
    7. .text:1006AE0C                 push    0Bh
    8. .text:1006AE0E                 call    TraceError
    9. .text:1006AE13                 add     esp, 8
    10. .text:1006AE16
    11. .text:1006AE16 loc_1006AE16:                           ; CODE XREF: UpdateCtrl+15j
    12. .text:1006AE16                 test    byte ptr [esi+Element.field_330], 1
    13. .text:1006AE1D                 jz      short loc_1006AE2E
    14. .text:1006AE1F
    15. .text:1006AE1F loc_1006AE1F:                           ; CODE XREF: UpdateCtrl+11j
    16. .text:1006AE1F                 push    53Eh
    17. .text:1006AE24                 push    19h
    18. .text:1006AE26                 call    TraceError
    19. .text:1006AE2B                 add     esp, 8
    20. .text:1006AE2E
    21. .text:1006AE2E loc_1006AE2E:                           ; CODE XREF: UpdateCtrl+2Dj
    22. .text:1006AE2E                 test    byte ptr [esi+Element.field_330], 2
    23. .text:1006AE35                 jnz     short loc_1006AE46
    24. .text:1006AE37                 push    0F6h
    25. .text:1006AE3C                 push    0Bh
    26. .text:1006AE3E                 call    TraceError
    27. .text:1006AE43                 add     esp, 8
    28. .text:1006AE46
    29. .text:1006AE46 loc_1006AE46:                           ; CODE XREF: UpdateCtrl+45j
    30. .text:1006AE46                 test    byte ptr [esi+Element.field_330], 1
    31. .text:1006AE4D                 mov     eax, [esi+Element.ptrOrigValue]
    32. .text:1006AE53                 jnz     short loc_1006AE60
    33. .text:1006AE55                 test    eax, eax
    34. .text:1006AE57                 jnz     short loc_1006AE76
    35. .text:1006AE59                 push    0F9h
    36. .text:1006AE5E                 jmp     short loc_1006AE6C
    37. .text:1006AE60 ; ---------------------------------------------------------------------------
    38. .text:1006AE60
    39. .text:1006AE60 loc_1006AE60:                           ; CODE XREF: UpdateCtrl+63j
    40. .text:1006AE60                 cmp     eax, 81h
    41. .text:1006AE65                 jnz     short loc_1006AE76
    42. .text:1006AE67                 push    0FDh
    43. .text:1006AE6C
    44. .text:1006AE6C loc_1006AE6C:                           ; CODE XREF: UpdateCtrl+6Ej
    45. .text:1006AE6C                 push    0Bh
    46. .text:1006AE6E                 call    TraceError
    47. .text:1006AE73                 add     esp, 8
    48. .text:1006AE76
    49. .text:1006AE76 loc_1006AE76:                           ; CODE XREF: UpdateCtrl+67j
    50. .text:1006AE76                                         ; UpdateCtrl+75j
    Суть - весь этот код сплошные вызовы вызовы TraceError, но прикол в том, что он одни и те же вещи проверяет многократно, причем аж умудрился проверить дважды "test al, 2" чуть ли не подряд (.text:1006ADFF). Зачем он это делает?

    Это у компилятора паранойя случилась или я чего-то не понимаю? Можно ли как то опознать компилятор по этим вызовам (если, например, такой вызов отладки униккален для какого-то компилятора)?
     
  2. HuXTUS

    HuXTUS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2007
    Сообщения:
    240
    Ни разу не сталкивался с подобным. Может это антиотладка? или просто мусорный код, чтобы отвлечь твое внимание и напугать тебя?

    Много полезного не скажу, но что говорит peid(или аналоги)? Впрочем, ты наверное догадался посмотреть, и там "Nothing found *"

    Известные мне способы узнать компилятор:
    - глянуть размер файла. для асма несколько килобайт. для delphi 300кб и более.
    - открой редактором ресурсов(ResHack) exe-шник. если есть RCData, то Borland
    - поищи такие referenced text string: borland, microsoft
    - глянь к каким библиотекам обращается
     
  3. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    подобный код может генерить msvc в дебаг-билд (или с полностью отключенной оптимизацией)
     
  4. zoool

    zoool New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2007
    Сообщения:
    412
    Вероятнее всего отладочная версия
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    zoool
    Вы nitrotoluol, он же BioMechanik?
     
  6. zoool

    zoool New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2007
    Сообщения:
    412
    нет
    но с MagnumGT (он же толуол) знаком
     
  7. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Ага, эта версия кажется наиболее правдоподобной (правда непонятно, почему автор не отключил дебаг, прога та сильно критичная и прожорливая в плане процессорного времени).

    Но вот это все равно остается непонятным, как такое компилятор мог сваять:
    Код (Text):
    1. .text:1006ADFF                 test    al, 2
    2. .text:1006AE01                 jz      short loc_1006AE1F
    3. .text:1006AE03                 test    al, 2
    Сразу вспоминается анекдот про два jmp подряд, на случай, если первый не сработает :)

    Собственно, вопрос задал с той целью, что хочу это место зачистить и использовать под нужды патчинга, поскольку в конце сгмента кода места тоже не очень много, а поправить много хочется. Изменять PE-заголовок пока не умею. Или проще научиться модифицировать PE и не возиться с подобными зачистками? Профессиональным хакерством заниматься не собираюсь, у меня просто возникла острая необходимость кое-что изменить в имеющемся софте.
     
  8. neiromatik

    neiromatik New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2007
    Сообщения:
    21
    2Dmitry_Milk На всякий случай посмотри нет ли jampов куда нибудь на средину инструкции :dntknw:недавно с таким сталкивался и исследуемый код был примерно такого же "качества" и кстати что за прога? Также код может быть закриптован что вероятнее, точнее по отрывку не скажешь
     
  9. neiromatik

    neiromatik New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2007
    Сообщения:
    21
    упс... инет глючит
     
  10. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    А, все спасибо, уже разобрался. Все таки это были проверки. Убрал безболезненно.

    http://www.mtu-net.ru/syncmodular/ , исследую sm.dll, собственно, там вся логика.