СИСТЕМА ОБНАРУЖЕНИЯ ОБФУСЦИРОВАННОГО КОДА ВРЕДОНОСНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Область техники
Заявленная полезная модель относится к компьютерным системам, а именно к системам оптимизации обфусцированного программного обеспечения.
Уровень техники
Усложнение и скорость распространения вредоносного программного обеспечения создают постоянно увеличивающееся количество угроз для персональных компьютеров и компьютеров предприятий по всему миру. Для борьбы с распространением компьютерных вредоносных программ, подобных вирусам, троянам, червям, и т.п., используются антивирусные техники, которые разрабатываются в антивирусных компаниях. Такие техники основаны на принципах совпадения сигнатур в программном коде, который сравнивается с базой данных известных вредоносных кодов. Другая техника - эвристический анализ - состоит в эмулировании программ и анализе шаблонов поведения с признаками вредоносного программного обеспечения. Тем не менее, подобные техники не срабатывают, когда сталкиваются с обфусцированным кодом, т.е. преобразованным исходным текстом или исполняемым кодом программы к некоторому виду, сохраняющему ее функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции. Следовательно, антивирусным системам не удается выявить экземпляр обфусцированного вредоносного программного обеспечения, либо это потребует значительных затрат системных ресурсов и машинного времени, что существенно снижает эффективность.
Отсюда вытекает задача разработки механизма анализа обфусцированного кода, которая облегчит и повысит эффективность обнаружения вредоносного программного кода.
Раскрытие полезной модели
Технический результат полезной модели заключается в эффективной оптимизации программного кода. Заявленный технический результат достигается за счет использования системы оптимизации программного кода, предназначенной для определения вредоносного программного обеспечения (ПО), содержащей: средства загрузки, предназначенные для загрузки участков программного кода в системную память, соединенные со средствами преобразования, предназначенными для получения и преобразования загруженного программного кода в инструкции языка программирования низкого уровня, соединенными со средствами оптимизации кода, предназначенными для получения и оптимизации преобразованных инструкций языка низкого уровня и выработки программного кода, который содержит оптимизированный код или простые инструкции (или основные инструкции, такие как ADD, SUB, MOV, OR и другие простые ассемблерные инструкции) языка низкого уровня, соединенные со средствами создания модели обработки, предназначенными для получения данных от средств оптимизации кода с последующим созданием модели обработки данных программного кода и анализом взаимосвязей и зависимостей элементов кода модели обработки данных (создается граф, в узлах которого операнды-данные, так удобнее выделять данные, которые участвуют в бессмысленных, запутывающих операциях, потоках данных и т.п.), соединенные со средствами анализа взаимосвязей (связи модели данных кода - граф со связями - операции с данными), предназначенными для получения данных от средств оптимизации кода с последующим анализом взаимосвязей и зависимостей элементов кода модели обработки данных и выявления обфусцированного программного кода, соединенные со средствами удаления обфусцированных участков, предназначенными для получения и удаления одного или более выявленных обфусцированных участков программного кода согласно модели обработки данных, рассчитывающие степень обфускации, и соединенные со средствами выявления вредоносного программного обеспечения, которые получают данные о степени обфускации, оценивают степень обфускации и при высокой степени обфускации формирует вывод о вредоносности исходного программного кода.
В одном из вариантов реализации системы программный код содержит исполняемый программный код. Упомянутые средства загрузки участков программного кода в системную память содержат: средства деления программного кода на множество блоков кода; и средства загрузки одного или более блоков программного кода в один или более буферов памяти, при этом упомянутые средства преобразования, средства оптимизации, средства создания, средства анализа и средства удаления обфусцированного кода способны обрабатывать два и более блоков кода параллельно.
Дополнительно система оснащается средствами преобразования загруженного кода в инструкции языка программирования низкого уровня, которые предназначены также для дизассемблирования программного кода в инструкции языка ассемблера. Упомянутые средства удаления одного или более обфусцированных участков кода предназначены также для удаления мертвого кода, оптимизации коммутативных операций, оптимизации обратных операций оптимизации вычислений констант, оптимизации инструкций присваивания, оптимизации работы с памятью, оптимизации операций работы с флагами, оптимизации инструкций ветвлений и циклов. Средства выявления вредоносного программного обеспечения предназначены для сравнения оптимизированного программного кода с исходным программным кодом, и определения степени обфускации кода по результатам сравнения программного кода до и после оптимизации. Средства выявления вредоносного программного обеспечения предназначены для анализа оптимизированного программного кода программ, степень обфускации которых выше 50%, с использованием систем сигнатурных проверок; анализа оптимизированного программного кода с использованием систем эвристического анализа или штатных антивирусных средств.
Один из примеров реализации полезной модели, определяющей вредоносный программный код, состоит в загрузке исполняемого программного кода в компьютер. Программный код делят на множество блоков кода, каждый из которых последовательно (или параллельно) загружается в один или более буферов памяти. Далее в буфере памяти дизассемблируют программный код и переводят в язык ассемблера или другой язык программирования низкого уровня, известный специалисту в данной области техники. Каждая сложная инструкция языка ассемблера упрощается и переводится в простые инструкции. Конструируют модель обработки данных упрощенного программного кода, анализируя зависимости и взаимосвязи элементов кода модели обработки данных для выявления в нем обфусцированного программного кода. Выявленный обфусцированный код в дальнейшем оптимизируют. В конечном счете, исходя из результатов оптимизации кода, решают, какой из программного кода является вредоносным программным кодом и/или какому дальнейшему анализу следует подвергать оптимизированный программный код (например, следует ли выполнить технику сигнатурной проверки и/или эвристический анализ).
Следующий пример показывает выявление вредоносного программного обеспечения при загрузке, по меньшей мере, части программного кода в память системы. Программный код преобразуют в программу на языке программирования низкого уровня. Далее программный код упрощают, оптимизируют зависимости и взаимосвязи между инструкциями в упрощенном программном коде. Оптимизация содержит удаление мертвых участков кода и оптимизацию коммутативных операций, обратных операций, вычисления констант, инструкций присваивания, вызовы памяти, операции с флагами, ветвящихся и цикличных участков кода. В заключение оптимизированный код компилируется вновь и проверяется с использованием техник сигнатурной проверки и/или эвристического анализа для определения того программного кода, который является вредоносным.
Краткое описание чертежей
Сопровождающие чертежи включены в описание для пояснения сути и основных принципов работы данного технического решения. Нижеследующее описание раскрывает варианты реализации предложения со ссылками на позиции следующих чертежей:
Фиг.1 схематически представляет компьютер, на котором возможно использовать данное предложение.
Фиг.2 отображает пример обфусцированного программного кода.
Фиг.3А отображает высокоуровневую диаграмму процесса по оптимизации кода в соответствии с данным техническим решением.
Фиг.3Б отображает детальную диаграмму процесса оптимизации кода.
Фиг.4 отображает разные типы обфусцированного кода, который следует оптимизировать.
Фиг.5 отображает примерную модель обработки данных обфусцированного кода, а также пример удаления мертвого кода.
Фиг.6 отображает пример коммутативных операций.
Фиг.7 отображает пример обратных вычислений переменных.
Фиг.8 отображает пример вычислений констант.
Фиг.9 схематически отображает пример инструкции присваивания.
Фиг.10 отображает пример оптимизации инструкций работы с памятью.
Фиг.11 отображает пример оптимизации инструкций работы с флагами.
Фиг.12 отображает пример оптимизации ветвлений и циклического кода.
Фиг.13 отображает пример оптимизации обфусцированного кода.
Фиг.14 графически отображает взаимосвязи между степенью обфусцирования кода и временем, необходимым для проверки обычными антивирусным системами.
Подробное описание вариантов осуществления
Детальное описание заявленного технического решения будет содержать определения и примеры использования тех признаков, совокупность которых позволяет достичь поставленной задачи.
Настоящее предложение направлено на анализ, оптимизацию и обнаружение обфусцированного вредоносного программного обеспечения (также упомянутого как вредоносный код). Дальнейшее описание раскрывает основную идею, позволяющую специалисту в данной области техники, реализовать подобную систему или варианты подобных систем. В силу того, что нет возможности описать все конкретные варианты реализации систем, приведено конечное число описаний примеров, достаточное для раскрытия основных принципов построения систем. При этом сама система и ее аналоги будут обеспечивать сходный эффект. При изложении материала будут использованы ссылки на поясняющие чертежи и соответствующие позиции чертежей.
С другой стороны, не приводятся примеры всех путей реализации, чтобы не загромождать описание. Алгоритмы анализа, оптимизации и обнаружения обфусцированного вредоносного программного обеспечения реализованны аппаратно, программно-аппаратно или в комбинации этих подходов в разных вычислительных системах, в том числе и компьютере общего назначения (ПК), портативном персональном компьютере, сервере приложений, сетевом экране, роутере или беспроводной точке доступа. Дополнительно организуются параллельные вычисления, работа которых обеспечивается системой сетевых серверов, работающих параллельно, что позволяет оперативно выявлять вредоносное программное обеспечение.
Фиг.1 схематически отображает компьютерную систему, на которой реализовано настоящее решение или его варианты. Компьютерная система 100 содержит, по меньшей мере, центральный процессор 150, внутреннюю системную память 110, различные сетевые коммуникационные интерфейсы 185, и различные внутренние и внешние устройства ввода 190 и устройства вывода 195. Компоненты компьютерной системы 100 взаимодействуют посредством системной шины (на чертеже не отображена). Компьютерная система 100 содержит антивирусную систему 130, которая реализует алгоритмы анализа, оптимизации и обнаружения обфусцированного кода. Таким образом, специалист в данной области техники поймет, что настоящее описание компьютерной системы 100 упрощено и компьютерная система 100 может содержать другие компоненты в соответствие с решаемой ею задачей.
Процессор 150 имеет арифметико-логическое устройство (АЛУ) 160, множество регистров 170 и устройство управления 180. АЛУ 160 используется для выполнения простых арифметических операций, таких как сложение, вычитание, сравнение и множество других операций, зависящих от специфики процессора 150. Регистры 170 являются ячейками памяти для временного хранения значений внутрипроцессорных операций, таких как инструкции работы с памятью и/или данные, которые обрабатываются процессором 150. Регистры 170 имеют емкость по 32 или 64 бит, но могут иметь другую битовую длину, в зависимости от компьютерной архитектуры. Устройство управления 180 управляет работой процессора 150, анализируя выполнение программных инструкций.
Системная память 110 содержит энергонезависимую память 120, оперативное запоминающее устройство (ОЗУ) 140 и разные другие типы вторичных как внутренних, так и внешних устройств хранения, подобные CD-ROM, DVD-ROM, стримерам и им подобные. Энергонезависимая память 120 является твердотельным, магнитным или оптическим приводом, перезаписываемым постоянным запоминающим устройством, электрически перезаписываемым постоянным запоминающим устройством или флеш-памятью. Энергонезависимая память 120 используется для хранения операционной системы (ОС) 125 антивирусных систем 130, которые используется для анализа и выявления вредоносного программного обеспечения в системе 100 в соответствие с принципами, которые раскрыты далее. ОС 125 является одной из существующих операционных систем DOS, Windows, Mac OS, Unix, Linux и т.п. ОЗУ 140 является статической ОЗУ, или динамической ОЗУ, или ОЗУ иного типа, которая предназначена для хранения исполняемых программ и приложений и известна эксперту в данной области техники.
Коммуникационный интерфейс 185 имеет, по меньшей мере один из последовательных портов, параллельных портов, USB, FireWire, PCMCIA, интерфейс проводной сети модемной связи или выделенная линия, карта Ethernet, беспроводной интерфейс (сотовая связь, Wi-Fi, Bluetooth, радиоканал, оптическая связь). Устройство ввода 190 является, по меньшей мере, одним из пользовательских устройств, таких как мышь, клавиатура, микрофон, удаленный контроллер или другой тип контроллера. Пользовательское устройство вывода содержит, по крайней мере, дисплей, принтер, звуковые колонки или другое устройство подобного типа. Коммуникационный интерфейс 185 и устройства ввода/вывода 190, 195 используются для загрузки различных программных систем, т.е. программного обеспечения в ОЗУ 140 системной памяти 100 для выполнения антивирусного анализа. Интерфейс 185 также предназначен для соединения и взаимодействия компьютера 100 с другими компьютерными системами или сетевыми базами данных, которые предоставляют дополнительные возможности обработки, для выполнения антивирусного анализа. Для облегчения антивирусного анализа программного обеспечения, которое было загружено в компьютерную систему 100, система содержит дизассемблер 135. Дизассемблер 135 является компонентом антивирусной системы 130. Дизассемблер 135 переводит загруженную в компьютерную систему 100 исполняемую программу в ассемблерный код для дальнейшего анализа программного кода антивирусной системой 130. Ассемблерный язык - это язык низкого уровня компьютерного программирования. В нем используется символьное представление машинных кодов и других констант, используемых программой в соответствующей архитектуре центрального процессора.
Как упоминалось выше, обфусцированное программное обеспечение значительно сложнее для анализа и обнаружения вредоносного кода, поскольку антивирусные системы сигнатурных проверок, эвристического анализа и др. не рассчитаны на это. Фиг.14 отражает граф взаимосвязей между степенью обфускации кода и временем, необходимым на анализ обычной антивирусной системе исполняемой в компьютерной системе 100. Как следует из графа зависимости при росте степени обфускации экспоненциально увеличивается и время анализа такого обфусцированного кода, которое необходимо антивирусной системе в компьютерной системе 100.
Фиг.2 отображает пример обфусцированного программного кода на языке программирования C++. Рассмотрим следующий обфусцированный код:
M[i]=D;
Т+=M[i];
M[i]=D;
Т-=M[i];
Скомпилированная версия такого кода представлена с правой стороны фиг.2. Код, скомпилированный любым из компиляторов на компьютерной системе 100, например компилятором Microsoft Visual C++ или любым другим. В итоге полученный обфусцированный программный код имеет следующий вид:
ADD EAX, ECX
SUB EAX, ECX
Такой код считается обфусцированным, поскольку операции сложения (ADD) и вычитания (SUB) выполненные процессором 150 в действительности не изменяют значение регистра EAX. Это говорит о том, что инструкции излишни и их выполнение бесполезно. Такой пример обфускации достаточно прост. Он также как и другие техники обфускации значительно затрудняет обработку и анализ вредоносного программного обеспечения антивирусными системами. Следовательно, возможно улучшить быстродействие и эффективность систем обнаружения, если применить оптимизацию для снижения степени обфускации кода.
Для достижения данной цели компьютерная система 100 содержит оптимизатор кода 145. Оптимизатор кода 145 является компонентом антивирусной системы 130. На фиг.3А представлена схематическая диаграмма оптимизации кода в соответствие с настоящей полезной моделью. На этапе 301 не оптимизированный исполняемый файл или объект кода программного обеспечения загружается антивирусной системой 130. Программный код 301а делят на блоки кода 302, 303, 304 при помощи средств деления программного кода на блоки. Размер каждого блока кода может варьироваться. Для примера в диапазоне от 400 до 1000 байт, но эта длина зависит от специфики системы и необходимых приложению условий для работы и параметров, которые определяет антивирусный эксперт. Блоки кода 301б-301в оптимизируются кодовым оптимизатором 145 последовательно или параллельно. Оптимизированный код имеет меньший размер из-за того, что содержит меньше инструкций, следовательно, легче для анализа антивирусной системой 130, чем исходный не оптимизированный код. Блоки кода анализируются в реальном масштабе времени по мере создания блоков кода, при этом антивирусная система 130 завершает анализ программного кода, если удалось точно определить, что код является вредоносным (или чистым и безвредным) до выполнения полной оптимизации программного кода, что позволит избежать лишних затрат системных ресурсов.
Фиг.3Б отображает более подробно диаграмму оптимизации кода в соответствие с данной полезной моделью. На этапе 310 исполняемый программный файл 130 загружают в энергонезависимую память 120 компьютера 100 для анализа антивирусной системой. На этапе 320 антивирусная система разделяет загруженный исполняемый программный код на несколько блоков кода при помощи средств разделения программного кода на блоки, и на этапе 330 при помощи средств загрузки одного или более блоков программного кода в один или более буферов памяти, загружает блоки кода в один или несколько буферов памяти в ОЗУ 140 компьютерной системы 100. На этапе 340 дизассемблер 135 дизассемблирует каждый блок кода и преобразует их в инструкции низкоуровневого языка ассемблера. На этапе 350 оптимизатор кода 145 анализирует главным образом в реальном масштабе времени каждый блок и заменяет сложные ассемблерные инструкции простыми или основными инструкциями, такими как ADD, SUB, MOV, OR и другими простыми ассемблерными инструкциями. Для примера сложная инструкция PUSH EAX будет представлена набором простых инструкций:
SUB ESP, 4
MOV [ESP], EAX
На этапе 360 оптимизатор кода 145 при помощи средств создания модели обработки, создает модель обработки данных соответствующим программным кодом для одного или нескольких блоков кода. Модель обработки данных определяет взаимосвязи и зависимости между элементами оптимизированного программного кода. Фиг.5 отображает пример модели обработки данных. На этапах 360 и 370 оптимизатор 145 при помощи средств анализа взаимосвязей анализирует модель обработки данных, соответствующую некоторому обфусцированному программному коду, оптимизирует обфусцированный код в модели обработки данных. Выполнение оптимизации реализует анализ взаимосвязей и зависимостей между элементами кода и модели обработки данных. Проанализированные элементы кода содержат операции, например XOR, ADD, INC и т.п. и операнды, т.е. значения, которые используются при выполнении одной или нескольких ассемблерных инструкций в одном или нескольких блоках кода. Модель обработки данных используется в оптимизаторе 145, что способствует анализу программного кода. Оптимизатор 145 конструирует отдельные модели обработки данных для каждого блока кода, которые были созданы. Оптимизатор 145 при помощи средств удаления обфусцированных участков анализирует и удаляет обфусцированные участки в оптимизированном программном коде код с использованием моделей обработки данных.
На этапе 380 антивирусная система сравнивает оптимизированный программный код, предоставленный оптимизатором кода 145, с оригинальным не оптимизированным кодом и оценивает степень обфускации кода. Антивирусная система оценивает количество инструкций, на которое удалось оптимизировать программный код. Исходя из степени обфускации кода, антивирусная система формирует вывод о том, что анализируемое программное обеспечение является вредоносным. Если программный код сильно обфусцирован, т.е. 50% доступного кода обфусцированы, то антивирусные системы расценивают такое программное обеспечение, как пытающееся скрыть свою функциональность. С другой стороны, если код не обфусцирован, или обфусцирован в незначительной степени, т.е. менее 10%, то антивирусная система рассматривает такое программное обеспечение как чистое и безопасное.
На этапе 390 антивирусная система, исходя из уровня обфускации кода, решает, что программный код необходимо дополнительно проанализировать. На этапе 390 антивирусная система производит анализ программного кода, имеющего значительный уровень обфускации кода. При анализе используются известная техника выявления вредоносного программного обеспечения, например система сигнатурных проверок, система эвристического анализа и другие. Для систем сигнатурных проверок подходит оптимизированный программный код, который сравнивается с базой данных известных вредоносных программ. При использовании систем эвристического анализа оптимизированный программный код эмулируют и сравнивают с моделями вредоносного поведения. Также оптимизированный программный код отсылается для составления экспертного заключения антивирусным экспертом или группой экспертов. Если оптимизированный программный код содержит вредоносный функционал, то исходная программа считается вирусом, червем, Трояном и т.п. Следует понимать, что оптимизированный программный код легче поддается анализу для известных антивирусных систем.
Фиг.4 отражает несколько типов обфусцированного кода, который будет оптимизирован оптимизатором 145. Оптимизатор 145, при помощи средств удаления обфусцированного программного кода, выполняет следующие варианты оптимизации: удаление мертвого кода 410 (удаление бесполезных операций, то есть операций, результат которых нигде не используется, и операций, которые в силу различных условий никогда не будут выполнены), оптимизация коммутативных операций 420, обратные операции 430, вычисления констант 440 и оптимизации инструкций присваивания 450. Также выполняется оптимизация обращений к памяти 460, операций с флагами 470, ветвлений и циклических инструкций 480. Порядок, в котором оптимизируют инструкции, в данном случае не имеет значения, и оптимизация может быть выполнена в любом ином порядке. Также, в зависимости от системы и требований приложения, оптимизатор 145 может не выполнять какие-то из отмеченных процессов оптимизации и выполнить только необходимые техники оптимизации в данном конкретном случае.
Примеры приведенных ранее процессов оптимизации будут детально разобраны далее со ссылками на фиг.5-13, а в качестве примера обфусцированного кода будет использован:
XOR ЕАХ, ЕАХ
ADD ECX, 2500h
OR ЕАХ, 250h
ADD ЕАХ, 80h
INC ECX
MOV ECX, ЕАХ
ADD ECX, EDX
ADD ECX, 30h
SUB ECX, EDX
MOV EAX, 100h
SUB ECX, EAX
Фиг.5 отображает пример модели обработки данных 500 программного кода, который сконструирован оптимизатором кода 145. Анализ зависимостей и связей между инструкциями модели 500 указывает то, что программный код содержит мертвый код 510, который не участвует в выполнении программы и только занимает системные ресурсы. Мертвый код 510 соответствует следующим инструкциям:
ADD ECX, 2500h
INC ECX
Оптимизатор 145 помечает инструкции как мертвый код из-за того, что последующая операция MOV затирает результаты инструкций ADD и INC:
MOV ECX, EAX
Следовательно, оптимизатор 145 удаляет инструкции ADD и INC из модели обработки данных 500.
Фиг.6 отображает пример коммутативных операций в модели 500, которая содержит сложение (ADD) и вычитание (SUB) константы (выделено на чертеже), которые представляют из себя следующее:
ADD EAX, 80h
MOV ECX, EAX
ADD ECX, 30h
SUB ECX, 100h
Такие коммутативные рперации с константами могут быть успешно вычислены оптимизатором 145, что приводит к получению оптимизированного программного кода 500.
Фиг.7 отображает пример обратных вычислений со значением (выделено на чертеже) в модели обработки информации 500. Обратные вычисления, содержат инструкции следующего типа:
А=А+В
А=А-В
Такие обратные вычисления в результате не дают изменения значения переменной А. На фиг.7 такие вычисления выделены и содержат следующие инструкции:
ADD ECX, EDX
SUB ECX, EDX
Оптимизатор кода 145 полностью удаляет эти инструкции из программного кода 500.
Фиг.8 отображает пример вычислений значений констант, которые вычисляются предварительно оптимизатором 145 для упрощения программного кода. Такими операциями являются MOV, ADD и SUB и т.п. Например:
MOV EAX, 15h
ADD EAX, 100h
SUB EAX, 80h
Фиг.9 отображает пример операции MOV, которая содержит оптимизацию инструкций типа: А=В и С=А, которые приводятся к виду С=В.
Пример таких инструкций представлен на фиг.9:
MOV EAX, EDX
MOV ECX, EAX
Анализ взаимосвязей и зависимостей упомянутых инструкций позволяет анализатору 145 заменить их следующей инструкцией:
MOV ECX, EDX
Отметим, что оптимизация выполняется в случае, если значение регистра ЕАХ не используется в последствии в других инструкциях программы. Тем не менее, если оно все же используется, то результат оптимизации будет иметь вид:
MOV ЕАХ, EDX
MOV ЕСХ, EDX
Фиг.10 отображает оптимизацию инструкций работы с памятью такого типа как *А=В и С=*А, которые приводятся к виду С=В. Принцип оптимизации инструкций направлен на создание новых связей между узлами в модели обработки данных с доступом к памяти в случае, если узлы оперируют с идентичными ячейками памяти. На фиг.10 подобная инструкция работы с памятью представлена в виде:
PUSHEAX
POP ЕАХ
Последовательное выполнение инструкций в этом порядке не изменит значение регистра ЕАХ.
Фиг.11 отображает оптимизацию инструкций установки флагов, таких как:
STC
ADC ЕАХ, 0
которые эквивалентны следующей оптимизированной операции:
ADD ЕАХ, 1
Фиг.12 отображает пример оптимизации инструкций ветвления и циклов. Для примера, инструкция условного перехода JZ (Jump-If-Zero) может быть выполнена инструкцией безусловного перехода JMP, если заранее обеспечивается выполнение условия перехода. Так инструкция JZ из условного перехода if {…} будет оптимизирована в {…}. Фиг.12 отображает такую оптимизацию следующим образом:
СМР 0,0
JZ [token]
эту последовательность можно представить эквивалентной инструкцией:
JMP [token]
где [token] - это адрес указателя в коде компьютерной программы.
Отметим также, что все предыдущие примеры оптимизации кода не являются ограничительными, и приведены для иллюстрации работы алгоритмов оптимизации разных типов, которые основываются на правилах, которые можно записать как
А+0=А
A^A=0
Фиг.13 отображает результаты ранее описанных алгоритмов оптимизации кода 500. Приведенный пример неоптимизированного кода:
XOR ЕАХ, ЕАХ
ADD ECX, 2500h
OR ЕАХ, 250h
ADD ЕАХ, 80h
INC ECX
MOV ECX, EAX
ADD ECX, EDX
ADD ECX, 30h
SUB ECX, EDX
MOV EAX, 100h
SUB ECX, ЕАХ
Такая модель обработки данных 1301 представлена на фиг.13.
В результате выполнения оптимизации получается модель обработки данных 1302, которая соответствует следующему коду:
MOV ECX, 200h
MOV EAX, 100h
Результат оптимизации состоит в уменьшении размера программного кода более чем на 85%.
Описанные компоненты этапы обработки, и/или структуры данных реализуются в различных типах операционных систем, на разных вычислительных платформах, при помощи компьютерных программ и языков программирования. В дополнение следует отметить, что специалисты в данной области техники смогут назвать не одно средство реализации принципов настоящей полезной модели, например аппаратными средствами, при помощи программируемой пользователем вентильной матрицы (FPGA) или на специализированных интегральных схемах (ASIC). Словом, любые концепции, изложенные в данном описании, возможно реализовать на различной элементной базе и с использованием разнообразных достижений современной науки и техники. При этом объем правовой охраны настоящей полезной модели определяется только лишь нижеследующей формулой.