Макрос для кодогенерации

Тема в разделе "WASM.BEGINNERS", создана пользователем HoShiMin, 12 апр 2017.

  1. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.486
    Адрес:
    Россия, Нижний Новгород
    Хочу сделать макрос для шифрования кода, в который оборачивается нужный участок, и внутри макроса происходит расшифровка и шифрование. Но со вставками асмовых блоков возникли проблемы:
    Код (C++):
    1.  
    2. #define CRYPT(BlockID, Code) \
    3.     PVOID StartAddress##BlockID, StopAddress##BlockID; \
    4.     __asm \
    5.     { \
    6.         mov StartAddress##BlockID, offset Start##BlockID \
    7.         mov StopAddress##BlockID, offset SigStop##BlockID \
    8.     } \
    9.     ULONG CodeSize##BlockID = (ULONG)StopAddress##BlockID - (ULONG)StartAddress##BlockID; \
    10.     RELOCS_INFO RelocsInfo##BlockID; \
    11.     InitializeRelocsInfo( \
    12.         GetModuleHandle(NULL), \
    13.         &RelocsInfo##BlockID \
    14.     ); \
    15.     EncryptDecrypt( \
    16.         StartAddress##BlockID, \
    17.         CodeSize##BlockID, \
    18.         &RelocsInfo##BlockID \
    19.     ); \
    20.     goto Start##BlockID; \
    21.     CRYPT_SIGNATURE_START; \
    22. Start##BlockID: \
    23.     Code ; \
    24.     goto Stop##BlockID; \
    25. SigStop##BlockID: \
    26.     CRYPT_SIGNATURE_STOP; \
    27. Stop##BlockID: \
    28.     EncryptDecrypt( \
    29.         StartAddress##BlockID, \
    30.         CodeSize##BlockID, \
    31.         &RelocsInfo##BlockID \
    32.     );
    33.  
    Использую так:
    Код (C++):
    1.  
    2. CRYPT(BLCK, DbgBreakPoint());
    3.  
    Ругается:
    Код (Text):
    1.  
    2. 1> warning C4405: mov: идентификатор является зарезервированным словом
    3. 1> error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "второй операнд"; обнаружено "StopAddressBLCK"
    4.  
    Как объявить макрос правильно?
     
  2. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    Код (Text):
    1.  
    2. =>
    3.   __asm mov StartAddress##BlockID, offset Start##BlockID \
    4.   __asm mov StopAddress##BlockID, offset SigStop##BlockID \
    5. нельзя в строчку, по отдельности надо.
    6. а вообще, ключ /P открывает тайны препроцессора
    7.  
     
  3. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.486
    Адрес:
    Россия, Нижний Новгород
    Поправил, работает. Спасибо!