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

Discussion in 'LANGS.C' started by wsd, Dec 2, 2008.

  1. _Aspire

    _Aspire New Member

    Blog Posts:
    0
    Ты же не знаешь заранее как будет скомпилен этот код. Это же не асм. Вдруг вместо первых двух ret'ов будет джамп на последний ret?
     
  2. wsd

    wsd New Member

    Blog Posts:
    0
    crypto
    давай затестим
    Code (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

    Blog Posts:
    0
    Проверил только что. Шляпа получается из-за выравнивания...
     
  4. wsd

    wsd New Member

    Blog Posts:
    0
    а вот стандартный релизе с отломаной оптимизацией
    не много мусора есть, что существенно по сравнению с мусором предыдущем :)
    теоретическ может можно и вплотную их сдвинуть какими-то параметрами сборки..
     
  5. _Aspire

    _Aspire New Member

    Blog Posts:
    0
    http://wasm.ru/forum/viewtopic.php?id=29109
     
  6. wsd

    wsd New Member

    Blog Posts:
    0
    _Aspire
    да, позабыл завертелся.. а поиском я не нашёл, вот и создал :)
     
  7. crypto

    crypto Active Member

    Blog Posts:
    0
    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

    Blog Posts:
    0
    crypto
    это в смысле сколько между ними мусора :)
    ты не в курсе в каких параметрах сборки убрать выравнивание кода?
     
  9. crypto

    crypto Active Member

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

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

    Blog Posts:
    0
    crypto
    Языковыми средствами сделать это невозможно, так как для компилятора не существует понятия "конец функции". Код может трансформироваться как угодно, например из

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

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

    _Aspire New Member

    Blog Posts:
    0
    Поставить параметр О1 в компиляторе. (VS C++)
     
  12. djmans

    djmans New Member

    Blog Posts:
    0
    я обычно разделаю куски кода 4-я нупами, плюс ret например, пока не подводило.
    или так nop;nop;nop;nop;ret и того 0x90;0x90;x90;x90;0xC3
     
  13. crypto

    crypto Active Member

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

    wsd New Member

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

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

    Dian Member

    Blog Posts:
    0
    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

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

    wsd New Member

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

    _Aspire New Member

    Blog Posts:
    0
    wsd
    А можно поподробнее что именно? У меня лично все функции одна-к-одной без всяких 0хС3.
     
  19. wsd

    wsd New Member

    Blog Posts:
    0
    _Aspire
    извиняюсь
    там сверху пост подправил
     
  20. osrootd

    osrootd New Member

    Blog Posts:
    0
    Ловите циклы, переходы, определяйте вероятность ( похоже_на функцию)
    Тат только, я думаю