none
Вычисление CRC фрагмента кода на X64 RRS feed

  • Вопрос

  • Здравствуйте.

    Есть приложение, в котором в ходе выполнения проверяется целостность фрагмента кода. Это выглядит следующим образом:

    codemark1_start:
    
    <код>
    
    codemark1_end:
    AsmCrcCodeMrk((MyTinyBuff), codemark1_start, codemark1_end, 1,Procedure);
    	

    где макрос AsmCrcCodeMrk определен как:

    AsmCrcCodeMrk(DescriptorAddr, StartAddr, EndAddr, Id, BPA)	\
    		AsmCrcCodeSig											\
    		__asm mov EAX, offset DescriptorAddr					\
    		__asm mov EAX,  StartAddr							\
    		__asm mov EAX,  EndAddr							\
    		__asm mov EAX, Id\
    	   __asm mov EAX, BPA\
    После компиляции программа "обраоатывается" дополнительным приложением, которое "вытаскивает" из кода метки и рассчитывает их CRС.

    Под Win32 все компилируется и работает. 

    Однако для X64 возникают трудности:

    1) X64 не поддерживает встроенный ассемблер. Но, как я понимаю, это обходится вынесением макроса как отдельной функции, функция делается __forceinline.

    2) Надо каким-то образом при компиляции получить адреса меток codemark1_start и codemark1_end. И вот с этим возникают проблемы.

    Может ли кто-нибудь подсказать, как получить адрес метки во время компиляции программы для архитектуры X64?



Ответы

  • Ну в таком случае видимо ваш вариант не реализуем на x64.

    С другой стороны я думаю при "обработке после компиляции" можно определить адреса вызовов двух конкретных функций.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    Модератор

Все ответы

  • Никак скорее всего. Но можно видимо заменить две метки вызовами:

    codemarkStart();

    <код>

    codemarkEnd(...);

    Осталось лишь сохранить адрес где нибудь, например с стеке, при вызове codemarkStart() и получить его при вызове codemarkEnd(). 

    Другие варианты - вынесение кода который подлежит проверке в отдельную функцию и ее экспорт.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    Модератор
  • Суть в том, что адреса мне надо знать при компиляции программы. Т.е. вариант с вызовами не пройдет.
  • Ну в таком случае видимо ваш вариант не реализуем на x64.

    С другой стороны я думаю при "обработке после компиляции" можно определить адреса вызовов двух конкретных функций.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    Модератор