1. Конец прошивки проще всего определить по глобальному символу. Или поместить последней секцией специальную секцию из одного слова, или сочинить скрипт для линкера, возможны варианты...
2а. Где угодно. Подобрать КС прошивки так, чтобы с учетом этой КС общая КС вышла какой-нибудь константой, например, 0xFFFF. Для многих алгоритмов CRC, если первоначально занести в ячейку для CRC ноль, дополнение этой CRC до 1, положенное в ячейку для CRC, вместо нуля, даст в итоге CRC == 0xFFFF. То есть, пускаем программу под отладчиком, вот она стала по плохой CRC, смотрим в регистре, какая получилась CRC, делаем ей NEG и полученное число заносим в ячейку для CRC. Пробуем еще раз, если что-то не сходится, разбираемся...
А что мешает "левой" пришивке иметь скорректированную CRC ?
Для этого нужно, как минимум, глубоко вникнуть в программу. Тут, конечно, возникают разные сложности. Что можно порекомендовать? Маскировка, нестандартный алгоритм CRC. Да и вообще, не допускать попадания программы в открытом виде в руки злоумышленников. Запретить считывание кода из МК, передача программы в шифрованном виде, ключ дешифровки должен лежать в нечитаемой извне флеш-памяти программы...