Способ предотвращения обратного инжиниринга программного обеспечения, неавторизованной модификации и перехвата данных во время выполнения - RU2439669C2

Код документа: RU2439669C2

Чертежи

Показать все 7 чертежа(ей)

Описание

Область техники, к которой относится изобретение

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

Уровень техники

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

Множество средств применяется сегодня для обратного инжиниринга программного обеспечения, такие как шестнадцатеричный дампер, который печатает или отображает двоичные числа кода программного обеспечения в шестнадцатеричном формате. Посредством узнавания битовых комбинаций, которые представляют эти команды, а также длины команд, человек, который хочет подвергнуть обратному инжинирингу программное обеспечение, может идентифицировать определенные части кода, чтобы видеть то, как они работают, а затем модифицировать их. Другим стандартным средством обратного инжиниринга, а также модификации кода является дизассемблер. Дизассемблер считывает двоичный код и затем отображает каждую исполняемую команду в текстовом формате. Кроме того, поскольку дизассемблер не может указать разницу между исполняемой командой и данными, используемыми посредством кода, может быть использован отладчик. Отладчик дает возможность дизассемблеру избегать обратного ассемблирования частей данных в коде. Например, если дизассемблер считывает команду "ADD_INT8", которая означает: "добавить число, представленное в следующих 8 битах", отладчик обрабатывает следующие 8 битов как часть данных команды "ADD_INT8", и следующая группа битов обрабатывается как новая команда. Тем не менее, эти средства базируются на общедоступном знании того, как компонуется программный код, где информация хранится в памяти, какие регистры используются, а также того, как используется стек (буфер данных, используемый для сохранения запросов, которые должны быть обработаны, в форме списка с проталкиванием вниз).

Проблема обратного инжиниринга и модификации кода неавторизованными пользователями еще более очевидна при работе с основанными на интерпретаторе языками программирования, отличными от основанных на компиляторе языков программирования. Описание основанного на компиляторе языка программирования можно найти на фиг. 1, который, в общем, иллюстрирует процесс программирования предшествующего уровня техники для основанных на компиляторе языков программирования, таких как C или Pascal. Когда программист программирует на высокоуровневом языке с использованием редактора и т.п., команды 10 его кода или исходный код не могут быть считаны непосредственно аппаратными средствами компьютера. Следовательно, исходный код 10 должен быть подвергнут процессу трансляции, известному как компиляция, посредством компилятора 11. Компилятор 11 компилирует исходный код 10 в конкретный машинный код (MC) 12, который аппаратные средства компьютера могут считывать и приводить в исполнение. Поскольку MC 12 специально компилируется для определенной платформы, он не может быть преобразован из одной платформы в другую. В основанных на компиляторе языках программирования исходный код 10 компилируется для каждой платформы отдельно, создавая различный конкретный MC 12 для каждой платформы. Примером отличающихся платформ может быть ПК на базе Intel® с Windows® XP и Mac® OS X.

Описание основанного на интерпретаторе языка программирования можно найти на фиг. 2a, который, в общем, иллюстрирует процесс программирования предшествующего уровня техники для основанных на интерпретаторе языков программирования, таких как JAVA. Аналогично основанным на компиляторе языкам программирования, основанные на интерпретаторе языки написаны на высокоуровневом языке с использованием редактора и т.п., упоминаемом далее как исходные операторы 20. Тем не менее, согласно этому подходу компилятор 21 транслирует высокоуровневые исходные операторы 20 в байтовый код (BC) 22, который является обобщенным MC, не ограниченным конкретной платформой. Тем не менее для того, чтобы приводить в исполнение BC 22, требуется специальный интерпретатор 23 для того, чтобы транслировать BC 22 в конкретный MC 24. Специальный интерпретатор 23 обычно устанавливается вместе с операционной системой. Основное преимущество этого подхода заключается в том, что BC 22 может распространяться для различных платформ. После того как BC 22 приводится в исполнение на конкретной платформе, специальный интерпретатор 23 транслирует только одну команду BC 22 за раз, создавая конкретную команду MC 24 для аппаратных средств компьютера, чтобы приводить в исполнение. Тем не менее, поскольку способ обработки посредством интерпретатора общеизвестен, достаточно просто читать, понимать и модифицировать BC 22, который является набором команд для интерпретатора 23. Хакер может приобрести легальную копию кода, написанного в BC, расшифровать его команды и стереть либо модифицировать некоторые из исходных команд BC. После того как BC модифицирован, он может быть массово скопирован и перепродан.

Другой способ, используемый хакерами, известен в данной области техники как "перехват данных во время выполнения". Посредством перехватывания и считывания потока данных в ходе исполнения легальной программы посредством интерпретатора, хакер может смоделировать процесс при исполнении нелегальной программы.

Один способ недопущения простого понимания и расшифровки режима работы кода использует шифрование кода, как описано в US 2004/0015710. Согласно этому подходу, зашифрованный код продается вместе с ключом расшифровки для расшифровки кода. Каждая команда в коде сначала расшифровывается и интерпретируется посредством интерпретатора для исполнения процессором. Тем не менее после того, как код расшифрован, хакер может считать расшифрованный код, чтобы вернуть инженеру исходный код. Более того, процесс расшифровки может отслеживаться пользователем для создания ключа расшифровки. Помимо этого, после того, как код расшифрован, он загружается незащищенным в память компьютера и может также быть скопирован оттуда.

Другой способ предотвращения модификации кода программного обеспечения - это разделение кода на две части, чувствительную часть, содержащую защиту кода, и менее чувствительную часть. Менее чувствительная часть кода продается пользователю, как и раньше, готовой для интерпретации, тогда как чувствительная часть кода сохраняется на аппаратных продуктах, таких как смарт-карты. Интерпретация чувствительной части кода осуществляется в аппаратных средствах, таких как устройство считывания смарт-карт, где она не может отслеживаться или считываться. Тем не менее, в некоторых случаях дополнительные аппаратные средства могут быть дорогими, и распространение обновлений кода, формируемых поставщиком, усложняется.

Способ предотвращения модификации кода программного обеспечения описан в документе Enriquillo Valdez и Moti Yung "DISSECT: Distribution for SECurity Tool" (G.I.Davida and Y.rankel (Eds.), ISC 2001, LNCS 2200, стр. 125-143, 2001, Springer-Verlag Berlin Heidelberg 2001). Способ предлагает разделение кода на две части, чувствительную часть и менее чувствительную часть. Менее чувствительная часть кода продается пользователю, как и раньше, готовой для интерпретации, тогда как чувствительная часть кода сохраняется на защищенном сервере.

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

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

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

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

Другие задачи и преимущества изобретения станут очевидными из нижеследующего описания.

Сущность изобретения

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

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

Программное обеспечение может быть высокоуровневым языком (к примеру, Java, Visual J#, J#, C# или http://VB.NET, либо основанным на компиляторе языком, к примеру, C++, VB или Pascal), таким как основанный на интерпретаторе язык, и может быть разделено так, что только часть программного обеспечения преобразуется с помощью преобразователя и интерпретируется интерпретатором.

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

Краткое описание чертежей

На чертежах:

Фиг. 1 - это блок-схема, в общем, иллюстрирующая процесс программирования предшествующего уровня техники для основанных на компиляторе языков программирования;

Фиг. 2a - это блок-схема, в общем, иллюстрирующая процесс программирования предшествующего уровня техники для основанных на интерпретаторе языков программирования;

Фиг. 2b - это блок-схема, в общем, иллюстрирующая процесс программирования предшествующего уровня техники для основанных на интерпретаторе языков программирования, главным образом, JAVA;

Фиг. 3 - это блок-схема, в общем, иллюстрирующая процесс программирования предшествующего уровня техники для языков программирования на основе .NET, таких как Visual J#;

Фиг. 4 - это блок-схема, в общем, иллюстрирующая реализацию изобретения согласно одному из вариантов осуществления;

Фиг. 5 - это блок-схема, иллюстрирующая один из вариантов осуществления изобретения;

Фиг. 6 - это блок-схема, в общем, иллюстрирующая реализацию изобретения согласно другому варианту осуществления изобретения; и

Фиг. 7 - это блок-схема, в общем, иллюстрирующая реализацию изобретения согласно одному из вариантов осуществления изобретения для основанных на компиляторе языков программирования.

Осуществление изобретения

Для краткости следующие термины определяются следующим образом:

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

- Машинный код (MC) - это код, который может быть считан и исполнен непосредственно процессором компьютера.

- Конкретный машинный код - это код, который может быть считан и исполнен только посредством конкретной платформы или ряда указанных платформ.

- Обобщенный машинный код - это код, который не ограничен конкретной платформой.

- Компилятор преобразует набор команд в машинный код.

Описание широко распространенных процессов

Фиг. 2b - это блок-схема, в общем, иллюстрирующая процесс программирования предшествующего уровня техники для основанных на интерпретаторе языков программирования, таких как JAVA. Аналогично основанным на компиляторе языкам программирования, основанные на интерпретаторе языки написаны на высокоуровневом языке с использованием редактора и т.п., упоминаемом далее как исходные операторы 200. Согласно этому подходу компилятор 210 транслирует высокоуровневые исходные операторы 200 в байтовый код (BC) 220, который является обобщенным MC, который не ограничен конкретной платформой. Тем не менее для того, чтобы приводить в исполнение BC 220, требуется конкретный интерпретатор 230 для того, чтобы транслировать BC 220 в конкретный MC 240. Конкретный интерпретатор 230 обычно устанавливается вместе с операционной системой. Основное преимущество этого подхода заключается в том, что BC 220 может распространяться для различных платформ. После того как BC 220 приводится в исполнение на конкретной платформе, конкретный интерпретатор 230 транслирует только одну команду BC за раз, тем самым создавая конкретную команду MC для аппаратных средств компьютера, чтобы приводить в исполнение. При работе с Sun Microsystems® Java, BC 220 называется байтовым кодом Java, а интерпретатор 230 называется виртуальной машиной (VM). В некоторых случаях VM идет вместе с оперативным компилятором 250 и используется по выбору. Оперативный компилятор 250 компилирует Java BC 220 в конкретный MC 260, как если бы программа изначально была скомпилирована для этой конкретной программы. В обоих случаях VM 230 и оперативного компилятора 250, аппаратные средства компьютера считывают предназначенный конкретный MC. Тем не менее, поскольку интерпретатор 230 транслирует одну команду BC 220 за раз в ходе исполнения, он может работать медленнее на компьютере.

Java VM, которая работает как интерпретатор между Java BC и конкретным MC, является отдельной для каждой платформы. После того как Java VM предоставлена для платформы, весь скомпилированный Java BC может выполняться на этой платформе. Следовательно, когда пользователь имеет Java VM, установленную на его компьютере, он может запрашивать любую программу на Java BC и исполнять на своем компьютере. Когда программист программирует на Java и компилирует программу на Java BC, он может повсеместно распространять BC всем пользователям, поскольку Java BC является совместимым для всех популярных платформ. Java VM отвечает за распределение памяти, регистры установок, стек, кучи "ненужных данных" и области методов (область методов Java VM - это логическая область памяти, которая сохраняет всю информацию о загруженных типах) для исполнения программы.

Фиг. 3 - это блок-схема, в общем, иллюстрирующая процесс программирования предшествующего уровня техники для языков программирования, которые предназначены для того, чтобы запускаться в Microsoft®.NET, например, Visual J#. Вообще говоря, среда .NET предоставляет возможность использования веб-ресурсов вместо ресурсов компьютера для различных служб. Visual J# или J# дает возможность программистам программировать на "похожем на Java" языке и выполнять программу в .NET. Исходные операторы 300, написанные на высокоуровневом языке Visual J#, компилируются посредством компилятора 310 в Microsoft Intermediate Language (MSIL - промежуточный язык Microsoft) 320, который является общим MC, который неограничен конкретной платформой. MSIL 320 эквивалентен Java BC 220 по своим функциям, и Java BC 220 даже может быть легко преобразован в MSIL 320. Аналогично вышеописанному процессу, MSIL 320 преобразуется в конкретный MC 340 с помощью общеязыковой среды выполнения (CLR) 330, которая эквивалентна функции JAVA VM 230. Следует понимать, что другие языки программирования .NET, такие как C# и http://VB.NET, подвергаются аналогичной обработке от исходных операторов 300 к MSIL 320 к конкретному MC 340.

Следует отметить, что распределение памяти описанных VM и CLR хорошо известно хакерам, например, настройка регистров, стека, кучи "ненужных данных" и области методов программы. С помощью этой информации хакер может понимать то, какие команды Java BC или MSIL относятся к требованиям лицензии, и модифицировать эти команды.

Метаданные .NET в инфраструктуре Microsoft .NET описывают код .NET CIL (Common Intermediate Language - общий промежуточный язык). Компилятор языка .NET должен сформировать метаданные и сохранить их в сборке, содержащей CIL. Метаданные описывают все классы и членов классов, которые заданы в сборке, и классы, и членов классов, которые текущая сборка должна вызывать из другой сборки. Метаданные для способа содержат полное описание способа, в том числе класс (и сборку, которая содержит класс), возвращаемый тип и все параметры метода. Когда CLR приводит в исполнение CIL, он проверяет то, что метаданные вызываемого метода такие же, что и метаданные, которые сохранены в вызывающем методе. Это обеспечивает то, что метод может вызываться только точно с корректным числом параметров и точно с корректными типами параметров. Следовательно, в таких средах, как .NET и Java, проще осуществлять обратный инжиниринг кода, и метаданные предоставляются совместно в качестве части распространяемого пакета. Метаданные необходимы для оперативной компиляции кода на целевой платформе. Тем не менее, в языках на основе компилятора, таких как C++, метаданные теряются в ходе стадий компиляции и связывания и не распространяются конечным пользователям.

Общее описание изобретения

Суть изобретения - это интерпретатор, способ работы и распределение памяти в котором не разглашаются. Новый необнаруживаемый интерпретатор, или "секретная VM", упоминается далее как SVM. Каждая SVM спаривается с коррелированным преобразователем, или другими словами, каждая SVM может только интерпретировать код, который сформирован посредством коррелированного преобразователя. Следовательно, каждый производитель оригинального программного обеспечения, который требует защиты программного обеспечения, может приобретать эксклюзивную коррелированную пару из преобразователя и SVM. Способы работы, такие как кодирование команд или распределение памяти, могут варьироваться между различными SVM.

Фиг. 4 иллюстрирует реализацию изобретения согласно одному из вариантов осуществления, где исходные операторы 400 написаны на высокоуровневом языке программирования .NET. Компилятор 410 компилирует исходные операторы 400 в MSIL 420, как описано в предшествующем уровне техники. В этой точке преобразователь 421 используется для того, чтобы преобразовывать MSIL 420 в язык секретной виртуальной машины (SVML) 422. SVML 422 - это общий MC, не ограниченный конкретной платформой. Тем не менее, команды SVML 422 отличаются от известных команд общих MC, таких как команды Java BC или MSIL 420. Следовательно, расшифровка SVML 422 исключительно затруднена, поскольку нет известного дизассемблера или отладчика для SVML 422. SVML 422 может распространяться вместе с соответствующей SVM 423. SVM 423 компилируется на указанном компьютере с помощью локального CLR 430 для добавления данных, касающихся конкретной платформы указанного компьютера. Поскольку SVM 423 выступает в качестве интерпретатора, она содержит не только новые данные для интерпретации SVML 422, но также данные, касающиеся профиля платформы от CLR 430. Таким образом, когда SVML 422 приводится в исполнение на указанном компьютере, SVM 423 интерпретирует каждую команду в аппаратные средства для исполнения. Поскольку способ обработки SVM 423 неизвестен, хакеру трудно понимать и модифицировать код либо попытаться перехватить данные во время выполнения.

Общее описание атрибутов предлагаемого преобразователя

Один из указанных атрибутов преобразователя включает в себя формирование различных SVML-программ для одних и тех же входных данных MSIL (по-другому называемых "трансформация кода"). Трансформация кода базируется на избыточности в наборе команд SVML, например, команда SUB может быть заменена командами NEG и ADD. Этот атрибут наиболее эффективен для предотвращения попыток сравнивать набор команд MSIL с эквивалентным набором команд SVML. Этот атрибут базируется на избыточности в наборе команд SVML, например, команда SUB может быть заменена командами NEG и ADD.

I. Другим созданным атрибутом преобразователя является возможность динамического кодирования команд, означающая изменение соответствующей битовой комбинации, или кода, определенной команды. В отличие от MSIL, где одинаковые команды, как ожидается, закодированы аналогично, в SVML одинаковая команда может отображаться в различных кодах. Например, команда может быть закодирована с помощью своего адреса, как показано в нижеследующих таблицах:

Адрес командыКоманда MSILКод70ADD20Адрес командыКоманда SVMLКод70ADD20+70=9074ADD20+74=94

Следовательно, даже если хакер может попытаться найти повторяющиеся комбинации в SVML-коде, чтобы логически вывести общие команды, окажется, что это более сложно, чем предполагалось.

II. Основной спроектированный атрибут преобразователя - это принудительная потеря данных в ходе преобразования для того, чтобы сделать процесс преобразования практически необратимым. Один пример потери данных - это удаление метаданных структуры кода, таких как объявления методов, поскольку в .NET необязательно, чтобы метод вызывался только посредством других преобразованных методов. Дополнительный пример потери данных следующий. Хорошо известный набор команд содержит следующие команды: ADD_INT8, ADD_INT16 и ADD_INT32. Эти команды указывают процессору добавлять числа в 8, 16 или 32 бита соответственно. В ходе процесса преобразования, с помощью уникального преобразователя все эти команды преобразуются в открытые команды "ADD". Тип операнда и число битов, которое должно быть добавлено (8, 16 или 32), определяется во время выполнения. Следовательно, обратная компиляция невозможна без знания числа для добавления в команду "ADD". Поскольку процесс преобразования является необратимым, код не может быть преобразован обратно в стандартный формат MSIL/Java BC, и, следовательно, он не может быть декомпилирован, обратно ассемблирован, отлажен или модифицирован с помощью стандартных средств.

Пример архитектуры SVM и соответствующего набора команд SVML

Фиг. 5 - это блок-схема, иллюстрирующая пример архитектуры SVM согласно одному из вариантов осуществления. Арифметико-логическое устройство 500 выполняет логические операции для регистров 510 и 520 операндов и сохраняет результат в регистре 530. Регистр 560 переноса данных используется для переноса данных между регистрами и банками 540 и 550 памяти. Банки 540 и 550 памяти используются для сохранения локальных переменных и параметров метода. Регистр 570 селектора банка сохраняет номер используемого банка памяти.

Пример поднабора команд SVML и их значение:

Команда SVMLОписаниеMEM2TRANSFERКопирует содержимое указанного адреса памяти в регистр 560 переноса данныхSETMBANK1Задает значение регистра 570 селектора банка равным 1SETMBANK2Задает значение регистра 570 селектора банка равным 2TRANSFER2MEMКопирует содержимое регистра 560 переноса данных в указанный адрес памятиTRANSFER2ОP1Копирует содержимое регистра 560 переноса данных в регистр 510 операндаTRANSFER2ОP2Копирует содержимое регистра 560 переноса данных в регистр 520 операндаRESULT2TRANSFERКопирует содержимое регистра 530 результата в регистр 560 переноса данныхADDВыполняет арифметическую операцию сложения для регистров операнда 1 и операнда 2 и сохраняет результат в регистре 530 результатовSUBВыполняет арифметическую операцию вычитания для регистров операнда 1 и операнда 2 и сохраняет результат в регистре 530 результатов

Сравнение между общим MC-кодом и SVML-кодом

Для краткости далее приводится неограничивающий пример, сравнивающий код программы сборки общего MC предшествующего уровня техники с кодом SVML. В обоих случаях данная задача потребовала обработки уравнения 4+3-1.

Обработка уравнения 4+3-1 на общем программном MC-коде:

LDC 4LDC 3ADDLDC 1SUBОбработка уравления4+3-1 на программном SVML-коде:SETMBANK1выбирает банк 1 памятиMEM2TRANSFER 23загружает «4», константу, сохраненную по адресу 23 памятиTRANSFER2ОP1перемещает значение «4» в регистр операнда 1MEM2TRANSFER 45загружает «3», константу, сохраненную по адресу памяти 45TRANSFER2ОP2перемещает значение «3» в регистр операнда 2ADDдобавляет содержимое регистров операндов 1 и 2RESULT2TRANSFERперемещает результат «7» в регистр переносаTRANSFER2ОP1перемещает значение «7» в регистр операнда 1MEM2TRANSFER 12загружает «1», константу, сохраненную по адресу памяти 12TRANSFER2ОP2перемещает значение «1» в регистр операнда 2SUBвычитает содержимое операнда 2 из операнда 1RESULT2TRANSFERперемещает результат в регистр переносаTRANSFER2MEM 1сохраняет результат по адресу 1 памяти

Как показано в вышеприведенном программном коде, обработанные операнды (4, 3 и 1) никогда не показываются в явном виде в командах. Хакер, пытающийся подвергнуть обратному инжинирингу программу, не может сделать логические выводы из текущего набора команд о том, каковы значения операндов в уравнении, поскольку каждое значение считывается из памяти во время выполнения.

Дополнительные варианты осуществления изобретения

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

Способ, предлагаемый настоящим изобретением, может быть использован с любым языком на основе интерпретатора. Например, для J# .NET SVM компилируется посредством CLR, для JAVA SVM компилируется посредством VM и т.д. Предлагаемое изобретение может быть использовано для любого программного обеспечения, будь то высокоуровневый язык, такой как C# или http://VB.NET, программный код, исходный код или машинный код.

Фиг. 6 иллюстрирует пример еще одного варианта осуществления изобретения, в котором исходные операторы 500 записаны на высокоуровневом языке, таком как Visual J#. Компилятор 410 компилирует исходные операторы 400 в MSIL 420, как описано выше. Тем не менее, до преобразования команды MSIL 420 разделяются на две группы: чувствительные команды, которые могут включать в себя требования по лицензированию, и нечувствительные команды. Чувствительные команды преобразуются посредством преобразователя 421 в SVML 422, тогда как нечувствительные команды не преобразуются. Общий MC 425 или программа, которая состоит из части MSIL и части SVML, может распространяться вместе с соответствующим SVM 423 для всех популярных платформ. Для исполнения программы, SVM 423 компилируется посредством CLR 430 на указанной платформе. В ходе исполнения каждая команда анализируется на совместимость с MSIL 420 или SVML 422. Команды MSIL 420 интерпретируются непосредственно посредством CLR 430, тогда как команды SVML 422 интерпретируются посредством SVM 423.

Фиг. 7 иллюстрирует реализацию изобретения согласно одному из вариантов осуществления для основанных на компиляторе языков программирования. Как описано в разделе по уровню техники, исходный код 700 компилируется посредством компилятора 710 в конкретный MC 720. Конкретный MC 720 преобразуется с помощью указанного преобразователя 721 в SVML 722, где SVML 722 зависит от платформы, или иными словами, это конкретный MC. SVML 722 распространяется с SVM 723, разработанной для конкретной платформы SVML 722. Поскольку распространенная SVM 723 уже задана для указанной платформы, она не требует компиляции на указанном компьютере. Следовательно, SVM 723 допускает трансляцию SVML 722 в конкретный MC 740 для аппаратных средств указанного компьютера.

В другом варианте осуществления для языков программирования на основе компилятора только чувствительные команды преобразуются посредством преобразователя 721 в SVML 722. SVML 722 распространяется вместе с SVM 723 и оставшимися командами конкретного MC 720. В ходе исполнения SVM 723 исполняет команды SVML 722.

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

Реферат

Изобретение относится к вычислительной технике, а именно к способам области защиты компьютерного программного обеспечения. Техническим результатом является повышение эффективности защиты против неавторизованной модификации программного обеспечения или динамических данных. Способ предотвращения неавторизованной модификации программного обеспечения или неавторизованной модификации динамических данных, в котором: предоставляют преобразователь, выполненный с возможностью преобразования упомянутого программного обеспечения в общий машинный код, обратный инжиниринг которого нельзя выполнить, посредством использования процесса преобразования, который вызывает потерю данных, предоставляют интерпретатор, в котором знание способа обработки сохраняется ограниченным, и интерпретируют посредством упомянутого интерпретатора упомянутый общий машинный код в конкретный машинный код при восстановлении потерянных данных в ходе процесса интерпретации. 3 н. и 25 з.п. ф-лы, 8 ил.

Формула

1. Способ предотвращения неавторизованной модификации программного обеспечения или неавторизованной модификации динамических данных, содержащий этапы, на которых:
a. предоставляют преобразователь, выполненный с возможностью преобразования упомянутого программного обеспечения в общий машинный код, обратный инжиниринг которого нельзя выполнить, посредством использования процесса преобразования, который вызывает потерю данных,
b. предоставляют интерпретатор, в котором знание способа обработки сохраняется ограниченным, и
c. интерпретируют посредством упомянутого интерпретатора упомянутый общий машинный код в конкретный машинный код при восстановлении потерянных данных в ходе процесса интерпретации.
2. Способ по п.1, в котором интерпретатор компилируется посредством общеязыковой среды выполнения (CLR).
3. Способ по п.1 или 2, в котором программное обеспечение разделяется таким образом, что только часть программного обеспечения преобразуется с помощью преобразователя и интерпретируется интерпретатором.
4. Способ по п.1, в котором программным обеспечением является высокоуровневый язык.
5. Способ по п.4, в котором высокоуровневый язык - это язык на основе интерпретатора.
6. Способ по п.5, в котором высокоуровневым языком может быть один из следующих языков: Java, Visual J#, J#, C# или VB.NET.
7. Способ по п.4, в котором высокоуровневый язык - это язык на основе компилятора.
8. Способ по п.7, в котором высокоуровневым языком может быть один из следующих языков: С++, VB или Pascal.
9. Способ по п.1, в котором потеря данных в ходе преобразования состоит в удалении метаданных структуры кода.
10. Способ по п.1, в котором потеря данных в ходе преобразования состоит в преобразовании команд в другие команды, соответствующий(ие) операнд(ы) которых определяют при выполнении.
11. Способ предотвращения декомпиляции и динамической модификации кода программного обеспечения .NET/CLI с использованием инструментальных средств, основанных на метаданных .NET/CLI, содержащий этапы, на которых:
a. предоставляют преобразователь, выполненный с возможностью преобразования упомянутого кода программного обеспечения .NET/CLI в общий машинный код, причем упомянутое преобразование включает в себя потерю данных по метаданным .NET/CLI;
b. предоставляют новый интерпретатор, выполненный с возможностью интерпретации упомянутого общего машинного кода без требования метаданных .NET/CLI, при этом упомянутый новый интерпретатор реализован как компонент программного обеспечения на основе .NET/CLI для поддержания такого же уровня переносимости, что и упомянутый код программного обеспечения .NET/CLI; и
c. интерпретируют упомянутый общий машинный код в конкретный машинный код упомянутым интерпретатором.
12. Способ по п.11, в котором разделяют программное обеспечение таким образом, что только часть программного обеспечения преобразуется с помощью преобразователя и интерпретируется новым интерпретатором.
13. Способ по п.11, дополнительно содержащий этап, на котором предотвращают подделку механизма вступления в силу условий лицензионного соглашения в среде .NET/CLI посредством того, что инструментальные средства декомпиляции и модификации, основанные на метаданных .NET/CLI, становятся непригодными для использования после выполнения упомянутого этапа.
14. Способ по п.11, в котором использование инструментальных средств, основанных на метаданных .NET/CLI, для подделки механизма вступления в силу условий лицензионного соглашения предотвращают посредством использования архитектуры нового интерпретатора для выполнения вызовов между преобразованными методами.
15. Способ по п.11, в котором для шифрования кода .NET/CLI при преодолении отсутствия поддержки шифрования/расшифровки кода в .NET CLR посредством выполнения частичной расшифровки исполняемой в данный момент функции, содержащий этапы, на которых:
a. применяют процесс симметричного шифрования к представлению общего машинного кода каждой преобразованной функции; и
b. расшифровывают каждую функцию общего машинного кода до исполнения посредством нового интерпретатора.
16. Способ по п.15, в котором симметричный ключ процесса шифрования доставляется пользователю программного обеспечения отдельно, тем самым делая неавторизованное исполнение программного обеспечения невозможным.
17. Способ по п.11, в котором различные реализации нового интерпретатора предоставляются производителям программного обеспечения, при этом упомянутый новый интерпретатор сформирован посредств выбора полного поднабора команд из избыточного набора команд и посредством динамического формирования преобразователя и .NET/CLI-сборки реализации упомянутого нового интерпретатора с помощью .NET Framework System.CodeDom API, System.Reflection.Emit API или непосредственного формирования исходного кода на языке .NET.
18. Способ по п.11, в котором различные реализации нового интерпретатора предоставляются производителям программного обеспечения посредством применения процесса сбивания с толку с помощью различных схем переименования метаданных в одной базовой реализации .NET/CLI упомянутого нового интерпретатора для предоставления возможности упомянутым метаданным отображаться по-разному в средствах декомпиляции.
19. Способ по п.17 или 18, в котором новый интерпретатор сформирован посредством выбора полного поднабора команд из избыточного набора команд и посредством динамического формирования преобразователя и .NET/CLI-сборки реализации упомянутого нового интерпретатора с помощью .NET Framework System.CodeDom API, System.Reflection.Emit API или непосредственного формирования исходного кода на языке .NET, а также посредством применения процесса сбивания с толку с помощью различных схем переименования метаданных той же самой базовой реализации .NET/CLI упомянутого нового интерпретатора для предоставления возможности упомянутым метаданным отображаться по-разному в средствах декомпиляции.
20. Способ предотвращения декомпиляции и динамической модификации кода программного обеспечения Java с использованием инструментальных средств, основанных на метаданных класса Java, содержащий этапы, на которых:
a. предоставляют преобразователь, выполненный с возможностью преобразования упомянутого кода программного обеспечения Java в общий машинный код, причем упомянутое преобразование включает в себя потерю данных по метаданным Java;
b. предоставляют новый интерпретатор, выполненный с возможностью интерпретации упомянутого общего машинного кода без требования метаданных класса Java, при этом упомянутый новый интерпретатор реализован как компонент программного обеспечения на основе Java для поддержания такого же уровня переносимости, что и упомянутый код программного обеспеченич Java; и
с. интерпретируют посредством упомянутого интерпретатора упомянутый общий машинный код в конкретный машинный код.
21. Способ по п.20, в котором разделяют программное обеспечение таким образом, что только часть программного обеспечения преобразуется с помощью преобразователя и интерпретируется новым интерпретатором.
22. Способ по п.20, дополнительно содержащий этап, на котором предотвращают подделку механизма вступления в силу условий лицензионного соглашения в среде Java посредством того, что инструментальные средства декомпиляции и модификации, основанные на метаданных .NET/CLI, становятся непригодными после выполнения упомянутого этапа.
23. Способ по п.20, в котором использование инструментальных средств, основанных на метаданных класса Java, для подделки механизма вступления в силу условий лицензионного соглашения предотвращают посредством использования архитектуры нового интерпретатора для выполнения вызовов между преобразованными методами.
24. Способ по п.20 для шифрования кода Java при преодолении отсутствия поддержки шифрования/расшифровки кода в Java VM посредством выполнения частичной расшифровки исполняемой в данный момент функции осуществляют этапы, на которых:
a. применяют процесс симметричного шифрования к представлению общего машинного кода каждой преобразованной функции; и
b. расшифровывают каждую функцию общего машинного кода до исполнения новым интерпретатором.
25. Способ по п.24, в котором симметричный ключ процесса шифрования доставляется пользователю программного обеспечения отдельно, тем самым делая неавторизованное исполнение программного обеспечения невозможным.
26. Способ по п.20, в котором различные реализации нового интерпретатора предоставляются производителям программного обеспечения, при этом упомянутый новый интерпретатор сформирован посредством выбора полного поднабора команд из избыточного набора команд и посредством динамического формирования преобразователя и реализации упомянутого нового интерпретатора.
27. Способ по п.20, в котором различные реализации нового интерпретатора предоставляются производителям программного обеспечения посредством применения процесса сбивания с толку с помощью различных схем переименования метаданных в одной базовой реализации Java упомянутого нового интерпретатора для предоставления возможности упомянутым метаданным отображаться по-разному в средствах декомпиляции.
28. Способ по п.26 или 27, в котором новый интерпретатор сформирован посредством выбора полного поднабора команд из избыточного набора команд и посредством динамического формирования преобразователя и реализации упомянутого нового интерпретатора, а также посредством применения процесса сбивания с толку с помощью различных схем переименования метаданных в той же самой базовой реализации упомянутого нового интерпретатора для предоставления возможности упомянутым метаданным отображаться по-разному в инструментальных средствах декомпиляции.

Документы, цитированные в отчёте о поиске

Процесс удостоверения подлинности команд

Авторы

Патентообладатели

Заявители

СПК: G06F21/125 G06F21/14

Публикация: 2012-01-10

Дата подачи заявки: 2006-03-30

0
0
0
0
Невозможно загрузить содержимое всплывающей подсказки.
Поиск по товарам