Определение границ функции

Тема в разделе "LANGS.C", создана пользователем wsd, 2 дек 2008.

  1. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Ты же не знаешь заранее как будет скомпилен этот код. Это же не асм. Вдруг вместо первых двух ret'ов будет джамп на последний ret?
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    crypto
    давай затестим
    Код (Text):
    1. long sum( long a, long b )
    2. {  
    3.     __asm int 3;
    4.     return a + b;
    5.     __asm
    6.     {
    7.             push eax
    8.             mov eax, 0x12345678
    9.             pop eax
    10.     }
    11. }
    12. long sub( long a, long b)
    13. {
    14.     __asm int 3;
    15.     return a - b;
    16.     __asm
    17.     {
    18.             push eax
    19.             mov eax, 0x12345678
    20.             pop eax
    21.     }
    22.  
    23. }
    компилим в стандартной дебаг версии студии 2005
    что видим в олге
    не слабое расположение?
    а теперь в стандартной релизе
    она соптимизировала и выкинула

    правильно censored сказал что боян или может сборку надо какими-то
    хитрыми параметрами регулировать
     
  3. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Проверил только что. Шляпа получается из-за выравнивания...
     
  4. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    а вот стандартный релизе с отломаной оптимизацией
    не много мусора есть, что существенно по сравнению с мусором предыдущем :)
    теоретическ может можно и вплотную их сдвинуть какими-то параметрами сборки..
     
  5. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    http://wasm.ru/forum/viewtopic.php?id=29109
     
  6. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    _Aspire
    да, позабыл завертелся.. а поиском я не нашёл, вот и создал :)
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    wsd
    Я что-то не врубился по-поводу
    И что из этого следует? Непонятно, какую инструкцию искать? Дык можно взять для каждой функции какое-нибудь "осмысленное" сочетание загрузки нескольких регистров, этого должно хватить на все случаи жизни:
    asm
    {
    push eax
    push ebx
    push ecx
    push edx
    mov eax, 'MyFu'
    mob ebx, 'nctio'
    mov ecx, 'nNo1'
    mov edx, '_end'
    pop edx
    pop ecx
    pop ebx
    pop eax
    }
    PS
    А чем способ с end_function не ндравится? Используй разные имена, вот и все.
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    crypto
    это в смысле сколько между ними мусора :)
    ты не в курсе в каких параметрах сборки убрать выравнивание кода?
     
  9. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    wsd
    Ты имеешь в виду байты 0xCC в некотором количестве? Вроде бы Мелкософтсовский компайлер создает такие области... А как этим можно управлять, честное слово, не знаю, никогда не интересовался.
    В Борланде выравнивание на границу двойного слова, но он зато в код другой мусор добавляет.
    А что собственно страшного в мусоре? Ведь твоя задача таким образом решается, весь код функции попадет в буфер, что и требовалось. Есть, конечно, тонкости - если компайлер заменит последний вызов процедуры на jmp, но поскольку ты будешь ассемблерные вставки (разные) делать, то такая оптимизация выполнена не будет.
    ЗЫ
    Кстати, насчет бояна и поиска в форуме: не вижу ничего плохого, если темы повторяются: во-первых, форум все-таки живет, во-вторых, могут появиться новые идеи.
     
  10. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    crypto
    Языковыми средствами сделать это невозможно, так как для компилятора не существует понятия "конец функции". Код может трансформироваться как угодно, например из

    Код (Text):
    1. function() {
    2. if(<..>) {
    3.    <код>
    4.    return;
    5. }
    6. <еще код>
    7. <характерная конструкция>
    8. }
    может получиться

    Код (Text):
    1. function() {
    2. if(!<..>) {
    3.     <еще код>
    4.     <характерная конструкция>
    5.     return;
    6. }
    7. <код>
    8. }
    и так далее. Предложения с ret работать не будут, так как функция не обязана иметь точку выхода (бесконечный цикл например). А вообще-то тема уже поднималась, но из-за неработающего поиска по форуму откопать старую я сейчас не смог.
     
  11. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Поставить параметр О1 в компиляторе. (VS C++)
     
  12. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    я обычно разделаю куски кода 4-я нупами, плюс ret например, пока не подводило.
    или так nop;nop;nop;nop;ret и того 0x90;0x90;x90;x90;0xC3
     
  13. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Stiver
    Я согласен, что компилятор может по-всякому извратиться. Все зависит от функции, но мне так кажется, можно придумать варианты вставки конструкций. Можно добавить такую конструкцию перед каждым выходом из процедуры.
     
  14. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    crypto
    твой способ с насаживанием своей сигнатуры в задницу функции полностью
    копирует всю функцию и, соответственно, там будут(в этой функции)
    и все другии ретурны(выходы), потому-что код в функции идёт последовательно до конца ;)
    и не надо ни чего добавлять перед каждым выходом!

    а копирование от начала до начала следуюшей функции делает код
    средней примусорённости :)
     
  15. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    http://cracklab.ru/f/index.php?action=vthread&forum=6&topic=12625
    http://cracklab.ru/f/index.php?action=vthread&forum=6&topic=12413
     
  16. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    Может, прежде чем говорить об этом, посмотришь на код скомпилированный с параметром /O1 ?
    Имхо, пихать куда-то линие байты (сигнатуры) для того-лишь, чтобы определить завершение функции - это совсем не по дзенски. Никогда бы не написал такого.
    Сам подумай, ты копируешь функцию, ладно если в другой процесс, а если в файл? Там каждый байт должен быть на счету..
     
  17. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    _Aspire
    да делает
    но это методом тыка, в доках где-то упоминается, что так было и так дальше будет?
    в доках упоминается что это делает минимальный размер и ничего не
    говориться о располложениях функций.
    хотелось бы решения построенного на доках, а не тыках :)
     
  18. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    wsd
    А можно поподробнее что именно? У меня лично все функции одна-к-одной без всяких 0хС3.
     
  19. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    _Aspire
    извиняюсь
    там сверху пост подправил
     
  20. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Ловите циклы, переходы, определяйте вероятность ( похоже_на функцию)
    Тат только, я думаю