Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 [ 11 ] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

ЗФ равна эталонной ? Код возврата О

jnz ClearMem dec bh ; Защищаемый фрагмент

; (в рабочем варианте программы должен быть зашифрован) Start: jmp Nextlnstr

Message DB Секретная информация !$

Nextlnstr: mov ah, 09h

mov dx, OFFSET Message

int 21h

MemSize = $ - OFFSET Start MemSizeClr = $ - OFFSET Begin ;Очистка памяти

ClearMem:

stosb

cx, MemSizeClif al, al \

di, OFFSET Begin

ah, 4Ch al, bh 21h Begin

Примечания.

1) Для получения исходного текста защищенной версии программы необходимо:

а) выполнить трансляцию и компоновку вышеприведенного исходного модуля;

б) запустить полученную программу в отладчике в пошаговом режиме;

в) определить коды Presence, RightSum и вид ЗФ в зашифрованном-виде;

г) внести изменения в соответствующих строках вышеприведенного текста; при этом зашифрованный фрагмент может быть включен в программу с помощью директив DB;

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

2) Проверить работоспособность защищенной версии программы можно

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

Пристыковочный модуль

Защищаемый фрагмент программы

Электронный ключ

Рис. 1.2.10. Структурная схема аппаратно-программного комплекса защиты ПО

Программный сброс ЭК 1

Проверка присутавия ЭК


Чтение ПСП с выхода ЭК

Расшифрование ЗФ

Формирование КС


Передача управления на расшифрованный ЗФ

Работа ЗФ

Код возврата О

Очистка памяти

Завершение программы

Код возврата 1

•2-11. Алгоритм работы пристыковочного модуля




Ассемблер в задачах защиты информации

Задания для самостоятельной работы

1) Предусмотреть автоматизацию процедуры получения защишенной версии програм-мы, например, задав два режима запуска программы: с ключом /CRYPTO - превращение "полуфабриката" в рабочую защищенную версию профаммы; без ключа -рабочий режим.

2) Предусмотреть выход из циклов ожидания готовности ЭК при превыщении заданного времени ожидания.

3) Защитить код ПМ от статического и динамического исследования.

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

5) Разработать профамму-эмулятор ЭК - обработчик прерывания INT 60h. - j

6) Отладить профамму с ПМ с использованием разработанного эмулятора. j

12.13. Смешанное программирование.

Связь с программами на языке С++

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

Можно выделить и другие причины подключения модулей, написанных на Ассемблере, к профаммам, написанным на языках высокого уровня, например С и С++: Ш доступ к самым низким уровням оборудования компьютера для более эффективного

использования его возможностей;

реализация функций защиты информации.

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

позволяет наиболее полно реализовать возможности Ассемблера;

сохраняет высокую степень переносимости профамм на С и С++;

Ш облегчает отладку из-за возможности автономного тестирования ассемблерных модулей;

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

Глава 1 • Основы программирования на Ассемблере IBM PC g-j

При разработке ассемблерных модулей, вызываемых из профамм, написанных на С С++, следует учитывать

щ соглашения, принятые в С и С++;

В размер переменных С и С++;

щ особенности передачи параметров.

Особенностями С и C-f-t- является чувствительность к строчным и прописным буквам. Одной из особенностей С++ является процесс обработки имен функций таким образом, чтобы в них сохранялась информация о типах аргументов. Одним из соглашений С yiC++ является использование знака подчеркивания " ". Компиляторы автоматически добавляют этот символ к именам всех внешних функций и общедоступных переменных.

При/меры

==== Фрагмент программы С++. ====================================

==== myasmproc - функция, шзываемая из С++, ====================

==== mycpproc - функция, вызываемая =============================

==== из ассемблерного модуля. ===================================

Прототипы функций.

"С" - отключение обработки имен - функции myasmproc и mycppproc будут иметь имена, соответствующие соглашениям, принятым в С extern "С" void myasmproc (); extern "С" void mycppproc ();

Объявление данных в ассемблерном модуле

extern int myvaluel;

Объявление глобальных данных

int myvalue2;

main О (

Присвоение значения данным ассемблерного модуля myvaluel = 2605;

Присвоение значения глобальным данным ™yvalue2 = 357;

Вызов функции ассемблерного модуля "lyasmproc ();

return 0;

/функция, вызываемая из ас\:емблерного модуля ««п "С" void mycppproc О; ™id mycpproc О

Ассемблерный модуль

MODEL small



. DATA

; Данные, объявленные в модуле С++

EXTRN myvalue2: WORD ; Данные, объявленные в ассемблерном модуле myvalueDW 205

; Разрешение доступа к данным из модуля С++

PUBLIC myvalue

. CODE ; Функция в модуле С++

EXTRN mycppproc ; Функция в ассемблерном модуле

PUBLIC myasmpoc myasniproc PROC

mov myvaluel, cx mov ax, myvalue2

; Вызов функции в модуле С++ call mycppproc


jnyasmproc

ENDP

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

Таблица 1. 3. Типы переменных С+ + и Ассемблера

Разрядность, бит

Типы данных С++

Типы данных Ассемблера

Регистры, используемые для возврата данных

Unsigned char Char

BYTE

Unsigned short Short

Unsigned int Int Enum Near*

WORD

Unsigned long

Long

Far*

DWORD

DX: АХ

Передача параметров в процедуру выполняется »-t-i- через с-гек. перед вы:.ипч.... у передаваемые параметры загружаются в стек в порядке, обратном их записи (рис. 1.21

Основы программирования на Ассемблере IBM PC 83 Глава] ......................................................................................................................

примеры (см. рис. 1.2.12, а, б)

Т- вызов функции на С++ =======================================

яургос (myargl, myarg2, 22, 10)

-цзоБ функции на Ассемблере ==================================

" mov ах, 10 push ах push а push ах

push WORD PTR myarg2 push WORD PTR myargl call NEAR PTR myproc

add sp, 8 ; Формируем в SP значение, которое было

; до вызова myproc .-=== Процедура myproc ============================================

. MODEL small . CODE

PUBLIC myproc

myproc PROC

push bp mov bp, sp

; Теперь к параметрам можно обращаться,

; используя BP: [bp+21 - адрес возврата,

; [Ьр+4] = argl, [bp+6] = arg2,

; [bp+8] = 22, [bp+10] = 10

mov cx, [bp+41 ; cx = argl add cx, [bp+8] ; cx = argl+22

pop bp ret

jnyproc ENDP

В ассемблерном модуле можно использовать размещенные в стеке локальные переменные, которые существуют только во время выполнения функции. Стековая область резерви-РУется под локальные переменные при запуске функции, а перед ее завершением очищается.

Пример (см. рис. 1.2.12, в)

стоматическое размещение в стеке локальных переменных =======

™УРгос р™°3°ва»ием директивы LOCAL. ============================

LOCAL localmas: BYTE: 256,

localvar: WORD = myvarsize

; myvarsize r общее количество

; байтов,необходимое для

; размещения локальных переменных

push bp

mov bp, sp

sub sp, myvarsize



0 1 2 3 4 5 6 7 8 9 10 [ 11 ] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88