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

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

  1. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Возникла проблема при копировении функции в си.
    Код (Text):
    1. long sum( long a, long b)
    2. {
    3.    return a + b;
    4. };
    такой вот простенький пример функции ;)
    нужно записать эту функцию в бинарный буффер.
    адрес начала - является имя самой функции, а как на си определить её конец?
     
  2. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    osrootd
    а если
    long sum( long a, long b)
    {
    if(a<0)return -1;
    if(b<0)return -1;
    return a + b;
    };
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Код (Text):
    1. long sum( long a, long b)
    2. {
    3.    return a + b;
    4. };
    5.  
    6. void dummy() {};
    Копируй, пока текущий адрес меньше dummy.
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    osrootd
    можно ответ поразвёрнутей :)
     
  6. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Partner
    т.е. предлагаеш ей к заднице приставлять пустышку.
    а есть ещё способы без копирования побочного мусора?
     
  7. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    ищи эпилог :)
    в скомпилированном файле функции не обязательно идут в том порядке, в котором они идут в исходнике
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Freeman
    я и писал
    а по поводу этого
    интерес представляет получения статически в сырцах, а не динамически :dntknw:

    и кстати если функция SEME(Singl Entry Multiple Exit) это мазохизм
     
  9. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Может это и не гарантируется, но, как правило, они идут в таком же порядке как в исходнике.
    Правда, они могут выравниваться на 16 байт. Но это не страшно, если скопируется пара лишних байт.
     
  10. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Можно так:

    Код (Text):
    1. long sum( long a, long b)
    2. {
    3.    return a + b;
    4.  
    5.   __asm {
    6.     // здесь пара экзотических асмовых опкодов
    7.   }
    8. };
    Копировать пока не встретишь асмовую вставку. Возможно придется отключить оптимизацию для этой фукции.
     
  11. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    А зачем извращаться с чистым си, если все это очень просто решается ассемблерной вставкой?
     
  12. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    wsd
    Вы уже кажется создавали такую тему, может хватит боянить?
     
  13. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    GoldFinch
    У него функция с рет 1 раз

    А если как у тебя то посчитай их тупо.
     
  14. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    wsd
    Вы уже кажется создавали такую тему, может хватит боянить?
     
  15. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    wsd
    Добавь в конце функции inline asm:
    XXX function(XXX)
    {
    .......................
    asm
    {push eax
    mov eax, 0x12345678
    pop eax
    }
    }
    И копируй в буфер, пока не встретишь выход ret сразу после данной комбинации.
     
  16. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    crypto
    добавление сигнатуры в конец тоже интересный ход.
    но это всё динамическое.
    а статически языковыми средствами, как сказал censored, - боян :dntknw:
     
  17. crypto

    crypto Active Member

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

    DWORD var_XXX;
    var_XXX = 0x12345678;

    Смотришь, что получается в ассемблерном коде, выделяешь независимый от локальной переменной код, дальше следуешь вышеприведенному совету.
     
  18. wsd

    wsd New Member

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

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    wsd
    Гы, а что если сразу вслед за твоей функцией
    function
    объявить:
    void next_function()
    {
    }

    Если предположить, что компилятор не изменяет порядок следования функций при компиляции, то тогда ты грубо говоря будешь копировать от метки function до метки next_function. И вся функция попадет в бинарный буфер.
     
  20. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    +1.
    А next_function будет полюбому. Хотя бы таже main().