Ты же не знаешь заранее как будет скомпилен этот код. Это же не асм. Вдруг вместо первых двух ret'ов будет джамп на последний ret?
crypto давай затестим Код (Text): long sum( long a, long b ) { __asm int 3; return a + b; __asm { push eax mov eax, 0x12345678 pop eax } } long sub( long a, long b) { __asm int 3; return a - b; __asm { push eax mov eax, 0x12345678 pop eax } } компилим в стандартной дебаг версии студии 2005 что видим в олге не слабое расположение? а теперь в стандартной релизе она соптимизировала и выкинула правильно censored сказал что боян или может сборку надо какими-то хитрыми параметрами регулировать
а вот стандартный релизе с отломаной оптимизацией не много мусора есть, что существенно по сравнению с мусором предыдущем теоретическ может можно и вплотную их сдвинуть какими-то параметрами сборки..
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 не ндравится? Используй разные имена, вот и все.
crypto это в смысле сколько между ними мусора ты не в курсе в каких параметрах сборки убрать выравнивание кода?
wsd Ты имеешь в виду байты 0xCC в некотором количестве? Вроде бы Мелкософтсовский компайлер создает такие области... А как этим можно управлять, честное слово, не знаю, никогда не интересовался. В Борланде выравнивание на границу двойного слова, но он зато в код другой мусор добавляет. А что собственно страшного в мусоре? Ведь твоя задача таким образом решается, весь код функции попадет в буфер, что и требовалось. Есть, конечно, тонкости - если компайлер заменит последний вызов процедуры на jmp, но поскольку ты будешь ассемблерные вставки (разные) делать, то такая оптимизация выполнена не будет. ЗЫ Кстати, насчет бояна и поиска в форуме: не вижу ничего плохого, если темы повторяются: во-первых, форум все-таки живет, во-вторых, могут появиться новые идеи.
crypto Языковыми средствами сделать это невозможно, так как для компилятора не существует понятия "конец функции". Код может трансформироваться как угодно, например из Код (Text): function() { if(<..>) { <код> return; } <еще код> <характерная конструкция> } может получиться Код (Text): function() { if(!<..>) { <еще код> <характерная конструкция> return; } <код> } и так далее. Предложения с ret работать не будут, так как функция не обязана иметь точку выхода (бесконечный цикл например). А вообще-то тема уже поднималась, но из-за неработающего поиска по форуму откопать старую я сейчас не смог.
я обычно разделаю куски кода 4-я нупами, плюс ret например, пока не подводило. или так nop;nop;nop;nop;ret и того 0x90;0x90;x90;x90;0xC3
Stiver Я согласен, что компилятор может по-всякому извратиться. Все зависит от функции, но мне так кажется, можно придумать варианты вставки конструкций. Можно добавить такую конструкцию перед каждым выходом из процедуры.
crypto твой способ с насаживанием своей сигнатуры в задницу функции полностью копирует всю функцию и, соответственно, там будут(в этой функции) и все другии ретурны(выходы), потому-что код в функции идёт последовательно до конца и не надо ни чего добавлять перед каждым выходом! а копирование от начала до начала следуюшей функции делает код средней примусорённости
http://cracklab.ru/f/index.php?action=vthread&forum=6&topic=12625 http://cracklab.ru/f/index.php?action=vthread&forum=6&topic=12413
Может, прежде чем говорить об этом, посмотришь на код скомпилированный с параметром /O1 ? Имхо, пихать куда-то линие байты (сигнатуры) для того-лишь, чтобы определить завершение функции - это совсем не по дзенски. Никогда бы не написал такого. Сам подумай, ты копируешь функцию, ладно если в другой процесс, а если в файл? Там каждый байт должен быть на счету..
_Aspire да делает но это методом тыка, в доках где-то упоминается, что так было и так дальше будет? в доках упоминается что это делает минимальный размер и ничего не говориться о располложениях функций. хотелось бы решения построенного на доках, а не тыках