Даже не пытайся. Вы не можете предполагать, что функция является непрерывной в памяти: она может иметь базовые блоки с более низкими начальными адресами, чем ее точка входа; он может разделять основные блоки с другими функциями; он может содержать разбросанные данные или байты выравнивания или может полностью исчезнуть, в зависимости от вызывающего сайта (из-за того, что компилятор решил встроить функцию).
Ваш код не может узнать размер сгенерированной функции. Подумайте об этом: размер полностью зависит от того, что испускает компилятор, и это зависит от всевозможных настроек и флагов компилятора (например, оптимизационная сборка с сильными внутренними ссылками или отладочная сборка или использование расширенных наборов инструкций, таких как SSE, и их неиспользование). ).
Кроме того, как уже указывалось, такая проверка контрольной суммы тривиальна, чтобы обойти ее как хакера - просто еще одну ветвь, которую вы должны инвертировать.
И, наконец, в качестве упражнения для любопытных, а также потому, что потенциальные злонамеренные хакеры тоже будут его использовать, я бы порекомендовал заблокировать ваш двоичный файл через дизассемблер IDA Pro. Это сделает очевидным множество проблем, связанных с мерами по предотвращению взлома ...
Если вы действительно хотите продолжить этот путь, я бы порекомендовал реверсировать ресурсы или выполнить шаг постобработки для вашего кода, который
а) объединяет все ваши функции вместе, вставляя переходы, соединяющие их, которые никогда не будут выполнены. Скройте ветви за непрозрачными предикатами. Это сделает разборку трудной для чтения / понимания и даже сломает некоторые дизассемблеры, выполняющие статический анализ потока, из-за получающегося огромного размера функции.
б) перенаправляет все вызовы функций через одну большую функцию ветвления. Это повлияет на производительность вашего кода, но также сделает коллограф полностью непригодным / нечитаемым.