Вычисление CRC исполняемого кода во время выполнения
У меня есть приложение, в котором используется некоторая процедура проверки целостности кода. Я вычисляю CRC фрагмента кода после того, как приложение построено, а затем регистрируюсь во время выполнения.
Все хорошо работает на 32-битной платформе, но на 64-битной платформе есть много проблем.
Что я уже пробовал:
Проверка целостности выглядит следующим образом:
codemark1_start: <Some code> 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\
После компиляции программа была обработана дополнительным приложением, которое "вытаскивает" фрагменты между метками и вычисляет их CRC. Под Win32 все компилируется и работает.
Однако для X64 есть свои сложности:
1) X64 в Visual Studio 2015 не поддерживает встроенный ассемблер. Но я могу сделать макрос как функцию в отдельном файле, и я могу сделать функцию __forceinline.
2) необходимо получить адреса меток во время компиляции. А это уже проблема.
Может ли кто-нибудь сказать мне, как получить адреса меток во время компиляции для платформы X64?