Five bytes F*ing code Q

Тема в разделе "WASM.RESEARCH", создана пользователем gazlan, 14 сен 2007.

  1. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    В сотнях программ встречаю этот код (иногда, десятки раз, в нескольких секциях). Явных ссылок на него, обычно, нет.
    Код (Text):
    1. 00000EF4:   55                push ebp
    2. 00000EF5:   8BEC          mov  ebp,esp
    3. 00000EF7:   5D               pop  ebp
    4. 00000EF8:   C3               retn
    В чем тут сермяжный смысл ?
     
  2. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    пардон, я не так понял :)
     
  3. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    GCC без оптимизации, обычно.
     
  4. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Пустая функция
     
  5. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    MSVC/Delphi/BCPPB

    Гм. Десятки/сотни раз в секции?

    Ex:

    Код (Text):
    1.    
    2.    15   00069152   .03069D52   5DEC8B55    EBP: Debugger Trap
    3.    16   00084529   .03085129   5DEC8B55     EBP: Debugger Trap
    4.    17   00084537   .03085137   5DEC8B55     EBP: Debugger Trap
    5.    .....................................................................................................................
    6.   127   0008FDB9   .030909B9   5DEC8B55  EBP: Debugger Trap
    7.   128   0008FDD8   .030909D8   5DEC8B55  EBP: Debugger Trap
    8.   129   0008FDF7   .030909F7   5DEC8B55   EBP: Debugger Trap
     
  6. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    чтото типа nullsub =) неоптимизорованная пустая функция.
     
  7. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Обычно, для выравнивания, компилятор пишет стандартные заглушки, ничего общего с полноценными функциями не имеющие. IDA их распознает и помечает как alignment. Эта
    функция может (не) /присутствовать одновременно со стандартными заглушками. Эти 5 байт можно было бы залить и CC и еще чем-либо, так что предположительно, какой -то смысл в этом мог бы быть, поэтому и пытаюсь его найти :)
     
  8. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Просто программист на будущее написал что-то вроде :
    void MySuperFunc(){};
    чтобы, когда у него будет время, дописать ее таки, а компилятор без оптимизации сделал код как ему подсунули в исходнике.
     
  9. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    И так 150 раз ... причем написал это одновременно в нескольких компиляторах (все сгенерировали идентичный код) и в десятках системных DLL от M$.
     
  10. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Ага, может просто старые функции были удалены.
     
  11. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    gazlan
    Обычно такое встречается, если методы класса имеют вид
    method_name(...)
    {
    }
    а таких в упомянутых тобой компиляторах может быть достаточно много.
     
  12. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    вообще-то сыровата ОС :) можете посчитать, сколько не дописали
     
  13. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Может под перехват какой-нибудь место зарезервировано? В 5 байт аккурат инструкция 'jmp rel32' влезает. В итоге, если ф-ию перехватаят, то вызовается jmp, который в эти 5 байт записан, а если нет -- просто произойдет возврат.
     
  14. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    gazlan
    Ты не мог бы привести пример такой системной DLL?

    AFAIK, релизный виндовс собирается с полной оптимизацией, а компилятор/линкер VC в этом режиме такого себе не позволяют.
     
  15. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Дома посмотрю. У меня там валялся архив с такими файлами.

    Гм. Не уверен. Мне как-то попадалась прога на Delphi - там такая функция висела почти на каждой форме.

    Кстати, IDA иногда ее именует (зависит от файла) - всякий раз по-разному :-\
     
  16. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Архив оказался разношерстным, поэтому для чистоты эксперимента натравил скэнер на директорию system32 (без поддиректорий). У меня в ней почти 2,000 файлов, из них исполняемых более 1,500. Полный отчет здесь (не нашел, где приаттачить):
    h**p://rapidshare.com/files/56472179/ebp_trick_report.rar.html

    После выбрасывания всех Debug и Unicode версий, а также всего, что не M$, осталось 16 файлов, которые будем считать "системными":
    Код (Text):
    1. atl.dll
    2. atl70.dll
    3. atl71.dll
    4. dbmsrpcn.dll
    5. dbmssocn.dll
    6. dbmsspxn.dll
    7. dxmasf.dll
    8. mfc70.dll
    9. mfc71.dll
    10. msjtes40.dll
    11. ntkrnlpa.exe
    12. ntoskrnl.exe
    13. rsvpmsg.dll
    14. snmpsnap.dll
    15. strmdll.dll
    16. sysedit.exe
    Кроме этого, еще вчетверо большее число файлов содержит JMP вместо RETN, но с тем же странным префиксом.
     
  17. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    это называется инкрементальная линковка. В эти переходники пишется jmp на реальные функции, которые дописываются в конец файла. Для ускорения сборки используется.
     
  18. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    gazlan
    в моём ntoskrnl.exe (XP32 SP2) посл. 55 8B EC 5D C3 не встречается ни разу...

    В atl71.dll есть парочка таких ф-ций.
    Если пустая ф-ция компилится без /Oy, к тому же запрещён неявный инлайн или берётся адрес такой ф-ции (например, если ф-ция виртуальная), то компилятор будет вынужден сгенерировать такой код.
    Такие ограничения оптимизации могут быть сделаны для облегчения отладки. Или по недосмотру. :derisive:
     
  19. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Там может быть и RET x (x = 4, 8, 12, 16, 20). У меня в SSF-листинге точно указаны смещение в файле и возвращаемое значение.

    Все еще сомнительно. IMHO, простого RET x было бы достаточно - без имитации EBP-фрейма.
    Второе соображение: будь это в самом деле так, то встречалось бы чаще чем 1 файл к 100 (для данной выборки).

    И еще: в трех случаях из четырех (по выборке) после 55 8B EC 5D стоит JMP куда-то там ...
    Для меня это полная загадка.
     
  20. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Странно, в моём ntoskrnl.exe(5.1.2600.3093 (xpsp_sp2_gdr.070227-2254) ни разу нет ни '55 8B EC 5D C3' ни '55 8B EC 5D C2'.
    У тебя случайно не checked build виндовса?

    Если не выставлена опция /Oy, то компилятор обязан генерировать фрейм, даже для пустой ф-ции.
    Компиляция без /Oy встречается довольно часто, т.к. облегчает отладку - можно нормально смотреть локальные переменные и стек вызовов.

    Насчёт JMP. Компилятор может оптимизировать код ф-ции, разбивая его на несколько разнесённых кусков. Очень типичное явление. Из-за этого кстати, в IDA появилась возможность работать с chunked functions.