_declspec (naked) функция и инициализация строки

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

  1. zoool

    zoool New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2007
    Сообщения:
    412
    Нужно в нейкед-функции инициализировать строку
    подскажите какой-нибудь макрос, чтобы можно было в асм-вставке сразу вписать инициализированную строку, например так


    _asm
    {
    ...
    ...
    ret
    mystr "blablablabla"
    }

    Юзать _emit(..) и побайтно инициализировать - не удобно
    можно ж как-то сразу макросом организовать?
     
  2. SWR

    SWR New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    226
    Адрес:
    Russia
    Я парсер на скрипте писал.
    На выходе столбец _emit, а вконце комент че забахал.
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    zoool
    c __VA_ARGS финт не получился, но можно использовать бояный трик:
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. #define EMIT_STR(string) __asm _emit string;
    4. #define _ __asm _emit
    5.  
    6. void main() {
    7.   __asm {
    8.     call over_string
    9.     EMIT_STR('a' _ 'b' _ 'c' _ 'd' _ 0)
    10. over_string:
    11.     // do something
    12.     //call printf
    13.   }
    14.   exit(0);
    15. }
     
  4. zoool

    zoool New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2007
    Сообщения:
    412
    респект!

    чтоб не создавать отд. тему, спрошу в этой же

    Предположим, функция naked
    в ней юзается чуть более 100 переменных (большая функция =) )

    Код (Text):
    1. #define total_vars_size 460;
    2. PVOID _declspec(naked) _stdcall  FindARX (ULONG ChgNum)
    3. {
    4. CHAR CompressBuf[0x100];
    5. ULONG a, b, c .... ;
    6. PVOID ...;
    7. _asm
    8.     {
    9.         push ebp
    10.         mov ebp, esp
    11.         sub esp, total_vars_size
    12.         ....
    13.         retn 4
    14.     };
    15. };
    Вопрос
    Можно как-то автоматизировать нахождение общего размера переменных?
    Сейчас пересчитываю размер вручную, что очень неудобно. Размер переменных постоянно меняется, т.к. по мере разработки и отладки что-то добавляется, что-то уменьшается. А "брать с запасом" - мне не нравится =\ Нужно точное значение...
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    zoool
    typedef struct funcdata_t { ... } funcdata_t;
    ...
    sizeof(funcdata_t) ?
    p.s. матчасть
     
  6. zoool

    zoool New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2007
    Сообщения:
    412
    censored
    думал об этом.
    Но тогда теряется наглядность кода.
    Или действительно я ламо.

    Как в асме обращаться к таким переменным по имени, а не по смещению в структуре?
     
  7. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    zoool
    Код (Text):
    1. #include <stddef.h>
    2.  
    3. typedef struct foo_t {
    4.   int a, b, c, d;
    5. } foo_t;
    6.  
    7. __declspec(naked) foo() {
    8.   enum {
    9.     _a = offsetof(struct foo_t, a)
    10.   };
    11.   __asm {
    12.     push ebp
    13.     mov ebp, esp
    14.     sub esp, size foo_t
    15.     mov dword ptr [ebp-_a], 0
    16.     mov esp, ebp
    17.     pop ebp
    18.     retn
    19.   }
    20. }
    21.  
    22. void main() {
    23.   foo();
    24. }
    P.S. Вообще непонятно зачем так извращаться, сложностей что ли в жизни не хватает? :) Пиши что надо (это наверное код какой-нибудь для инжекта) на своем любимом ассемблере, остальной код на С, линкуй к С-проекту свой .obj.
     
  8. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    MSDN:
    Код (Text):
    1. // the__local_size_symbol.cpp
    2. __declspec ( naked ) main()
    3. {
    4.    int i;
    5.    int j;
    6.  
    7.    __asm      /* prolog */
    8.       {
    9.       push   ebp
    10.       mov      ebp, esp
    11.       sub      esp, __LOCAL_SIZE
    12.       }
    13.      
    14.    /* Function body */
    15.    __asm      /* epilog */
    16.       {
    17.       mov      esp, ebp
    18.       pop      ebp
    19.       ret
    20.       }
    21. }
     
  9. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    reverser
    Элитно! :)
     
  10. zoool

    zoool New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2007
    Сообщения:
    412
    reverser
    ыч! круто!!!! респект!!!