Прячем if переходы от дизассемблера

Тема в разделе "WASM.ASSEMBLER", создана пользователем marduk, 10 янв 2006.

  1. marduk

    marduk New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2006
    Сообщения:
    1
    Адрес:
    Ukraine
    Собственно в книге "Secure Programming Cookbook for C and C++" была приведена такая ассемблерная вставка для обфускации if-перехода в дизассемблерах:
    Код (Text):
    1. #define IF_ZERO(val)                             \        
    2.         asm("   xorl %%ebx, %%ebx\n\t"           \
    3.             "   negl %%eax\n\t"                  \
    4.             "   rcl $3, %%ebx\n\t"               \
    5.             "   movl 0f( , %%ebx ), %%eax \n\t"  \
    6.             "   jmp *%%eax \n"                   \
    7.             "0: \n\t"                            \
    8.             "   .long 1f\n\t"                    \
    9.             "   .long 2f\n"                      \
    10.             "1: \n"                              \
    11.             : : "a" (val) : "%ebx");
    12.  
    13. #define ELSE                                     \
    14.         asm("   jmp 3f\n\t"                      \
    15.             "2: \n");
    16.  
    17. #define ENDIF                                    \
    18.         asm("3: \n");


    И было приведено описание того, как данный код работает:



    А проблема в том, что GCC ругается следующим образом:


    Прошу помочь разобратиься с этой ошибкой. Благодарю...
     
  2. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Я так понимаю, что здесь обязательно должна быть ELSE-ветвь, т.е. код должен быть вида
    Код (Text):
    1.  
    2. IF_ZERO(val)
    3. ...some code...
    4. ELSE
    5. ...some other code...
    6. ENDIF
    7.