Глава 14. Приемы, облегчающие работу противника | Телекоммуникации вчера, сегодня, завтра

Последовательность действий при создании объекта радиосвязи

Бланк формы №1 ТАКТИКО-ТЕХНИЧЕСКИЕ ДАННЫЕ РЭС

Поставка оборудования обеспеченного радиочастотами

Витрина



Глава 14. Приемы, облегчающие работу противника

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

14.1 Осмысленные имена функций

Общим тоном при разработке сложных проектов является разделение задачи на отдельные, минимально связанные между собой части. При таком подходе жестко определяются интерфейсы, с помощью которых отдельные шлющие могут общаться между собой, и каждая часть разрабатывается независимо от всех остальных.

Для того чтобы программистам было проще обращаться к узлам, разработанным другими людьми, функциям, через которые происходят взаимодействия, дают легко запоминающиеся и самоописывающие имена. Например, чтобы запомнить, что CreateFile используется для создания файла, DeviceloControl — для управления устройствами.

При компиляции программы некоторые фрагменты кода могут быть вынесены во внешние библиотеки и импортированы по именам. Иногда по имени функции можно восстановить даже количество и тип аргументов, которые функция принимает на вход. Многие визуальные среды разработки, например, Borland Delphi и C++ Builder) сохраняют внутри исполняемых процессов строки с именами функций, являющихся обработчиками событий, возникающих в интерфейсе программы (перемещение мыши, нажатие кнопки и т.д.). А иногда в готовой программе остаются фрагменты отладочной информации, в которой присутствуют имена функций. В любом из этих случаев не составляет большого труда определить, что по конкретному адресуначинается код функции с таким-то именем.

Это не является проблемой для функций, выполняющих действия, не связанные с защитой программы. Но если функция называется CheckLicense или btnRegisterclick, то противнику имеет смысл в первую очередь исследовать именно такую функцию, т.к. с большой вероятностью в ней выполняются важные действия, относящиеся к работе защиты.

Стоит всячески избегать попадания осмысленных имен функций, относящихся к защитным механизмам, в исполняемые файлы и библиотеки, являющиеся частью готовой программы. Если в исходном тексте программы функции должны фигурировать под осмысленными именами (по соображениям удобочитаемости), то для сокрытия истинных имен функций можно использовать макроподстановки (листинг 14.1).

Листинг 14.1. Использование #define для сокрытия имен функции в С :


#define CheckLicense fn23
void CheckLicense (char *pszLic) {

/* текст функции */

void main (void) {
CheckLicense ("License Sting");

При компиляции такого кода препроцессор вместо CheckLicense везде подставит fh23, а значит, имя, которое могло бы дать какую-то информацию противнику, просто не попадется ему на глаза.

Библиотечные функции могут импортироваться и экспортироваться не только по имени (by name), но и по номеру (by ordinal). Это позволяет вообще исключить соответствующие имена из программы и библиотек.

Однако никогда не помешает в готовых исполняемых файлах выполнить поиск текстовых строк, содержащих названия важных для защиты функций — никогда нельзя быть уверенным, что компилятор или редактор связей нигде не оставил важных имен.



Поиск по сайту


Смотрите также