Самомодифицирующиеся программы.
Программа-тренажер "ЛамПанель"
Поскольку данные находятся в той же области памяти, что и программы, программа может изменять свой код во время выполнения. Например, для защиты от взлома может быть использовано шифрование: основной код программы зашифрован, и она сама себя расшифровывает при запуске. Теперь остается добавить (также в текстовом редакторе) этот фрагмент в конец файла lampanel.rom. Новая процедура будет доступна… Читать ещё >
Самомодифицирующиеся программы. Программа-тренажер "ЛамПанель" (реферат, курсовая, диплом, контрольная)
Поскольку данные находятся в той же области памяти, что и программы, программа может изменять свой код во время выполнения. Например, для защиты от взлома может быть использовано шифрование: основной код программы зашифрован, и она сама себя расшифровывает при запуске.
Пример самомодифицирующейся программы:
ассемблер | псевдокод |
jmp decode. main: data ba6b. data ba98. data 27a8. data 4444. decode: mov @main, r0. mov 4, r1. loop: xor bbbb,(r0)+. sub 1, r1. jnz loop. jmp main. | переход на блок расшифровки начало основной части в этом и следующем словах будет «mov 123, R0» . здесь будет «system 13» . здесь будет «stop» . начало блока расшифровки. R0:= начало зашифрованного блока. R1:= 4; нужно расшифровать 4 слова начало цикла. расшифровка: xor с маской BBBB16 уменьшить счетчик если счетчик не ноль, перейти на начало цикла перейти на основную программу. |
Расширение ПЗУ
Пользователь может добавить свои подпрограммы в ПЗУ. Для этого нужно сначала отладить подпрограмму, а затем сохранить ее в специальном формате с помощью кнопки или пункта меню «Программа — Сохранить как ПЗУ». Например, напишем подпрограмму, которая переставляет биты числа в обратном порядке, используя циклический сдвиг через бит переноса:
ассемблер | псевдокод |
mov 1234, R0. call reverse. stop. reverse: push R1. push R2. mov 10, R2. xor R1, R1. next-bit: rcl 1, R0. rcr 1, R1. sub 1, R2. jnz next-bit. mov R1, R0. pop R2. pop R1. ret. | R0:= 123416 вызов подпрограммы стоп начало подпрограммы сохранить R1 в стеке сохранить R2 в стеке. R2:= 16 = 1016 R1:= 0. старший бит R0 попадает в бит переноса бит переноса попадает в старший бит R1. R2:= R2 — 1. если R20, перейти к метке next-bit. R0:= R1. восстановить R2 из стека восстановить R1 из стека возврат из подпрограммы. |
Отладив эту программу, уберем верхние три строчки, оставив только процедуру, и применяем команду меню «Программа — Сохранить как ПЗУ». Полученный файл (он будет иметь расширение.rom) открываем в любом текстовом редакторе (например, в Блокноте) и добавляем в начало комментарий:
; Перестановка битов R0.
; в обратном порядке.
;———————————;
- 2E10 PUSH R1
- 2E20 PUSH R2
- 01D2 MOV 10, R2
- 0010
- 0911 XOR R1, R1
- 9E00 RCL 1, R0
AE01 RCR 1, R1.
- 03D2 SUB 1, R2
- 0001
- 4D0D JNZ 000A
FFF4.
- 0110 MOV R1, R0
- 3E20 POP R2
- 3E10 POP R1
- 0D00 RET
Теперь остается добавить (также в текстовом редакторе) этот фрагмент в конец файла lampanel.rom. Новая процедура будет доступна при следующем запуске программы «ЛамПанель».