sinsin-88 Ответов: 1

Вычисление 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?

1 Ответов

Рейтинг:
1

Jochen Arndt

В стандарте C/C++ нет метода для получения адреса метки. Вероятно, именно по этой причине была использована встроенная сборка.

Поэтому я не вижу другого решения, кроме написания всего кода в 64-битной сборке или использования компилятора GNU для компиляции конкретной части кода, потому что это имеет Использование коллекции компиляторов GNU (GCC): метки как значения[^] Расширение c. Однако для этого необходимо сделать созданный объектный файл связываемым с VS. См. также нить так Адрес этикеток (MSVC).