Возникла проблема при копировении функции в си. Код (Text): long sum( long a, long b) { return a + b; }; такой вот простенький пример функции нужно записать эту функцию в бинарный буффер. адрес начала - является имя самой функции, а как на си определить её конец?
Код (Text): long sum( long a, long b) { return a + b; }; void dummy() {}; Копируй, пока текущий адрес меньше dummy.
Partner т.е. предлагаеш ей к заднице приставлять пустышку. а есть ещё способы без копирования побочного мусора?
ищи эпилог в скомпилированном файле функции не обязательно идут в том порядке, в котором они идут в исходнике
Freeman я и писал а по поводу этого интерес представляет получения статически в сырцах, а не динамически и кстати если функция SEME(Singl Entry Multiple Exit) это мазохизм
Может это и не гарантируется, но, как правило, они идут в таком же порядке как в исходнике. Правда, они могут выравниваться на 16 байт. Но это не страшно, если скопируется пара лишних байт.
Можно так: Код (Text): long sum( long a, long b) { return a + b; __asm { // здесь пара экзотических асмовых опкодов } }; Копировать пока не встретишь асмовую вставку. Возможно придется отключить оптимизацию для этой фукции.
wsd Добавь в конце функции inline asm: XXX function(XXX) { ....................... asm {push eax mov eax, 0x12345678 pop eax } } И копируй в буфер, пока не встретишь выход ret сразу после данной комбинации.
crypto добавление сигнатуры в конец тоже интересный ход. но это всё динамическое. а статически языковыми средствами, как сказал censored, - боян
wsd А почему это способ динамический? Код же в статике реализуется и будет скомпилирован. Языковыми средствами - то же самое. Вставляешь в конец какую-нибудь характерную конструкцию, которую можно выловить по коду или данным. Ну, к примеру DWORD var_XXX; var_XXX = 0x12345678; Смотришь, что получается в ассемблерном коде, выделяешь независимый от локальной переменной код, дальше следуешь вышеприведенному совету.
crypto неа, ни кто ни чего путного не предложил - только censored объяснил что это боян(я кстати тему эту первый раз создал, он меня с кем-то перепутал ) статически языковыми средствами - это известное на момент сборки, имелось ввиду. динамическое - вычисляемое в программе. в асме это быстро и легко - ставиш метку на первый байт после функции и вычитаеш из него начало и всего делов. и вот это это статика средствами языка. а твой динамически метод с вживлением сигнатуры правдf очень красивый
wsd Гы, а что если сразу вслед за твоей функцией function объявить: void next_function() { } Если предположить, что компилятор не изменяет порядок следования функций при компиляции, то тогда ты грубо говоря будешь копировать от метки function до метки next_function. И вся функция попадет в бинарный буфер.