Жанр: Учеба
Как защитить информацию (пособие по борьбе с хакерами)
... 60,132
title NONPSP - Резидентная программа без PSP
;==========================================================
;
; Пример построения резидентной программы без PSP
;
; Авторские права ГРУППЫ ПРОГРАММИСТОВ 2B
;
; Язык программирования: Ассемблер
; Транслятор : MASM
;
;===========================================================
;
; сообщить транслятору адресацию
;
assume cs:code,ds:code,es:nothing
;
; определить сегмент кода
;
code segment para
;
subttl Резидентная часть программы
;
ResStart label byte ;определим начало программы
Текст резидентной части.
ResEnd label byte ;конец резидентной части
ResLen equ ResEnd-ResStart ;размер резидентной части в
; байтах
ResSize equ (ResEnd-ResStart+15)/16 ;размер резидентной
; части в параграфах
org ResStart+ResSize*16 ;для выравнивания на
; границу параграфа
;
page
subttl Инициализация резидентной программы без PSP
;
MCBLen equ 10h ;размер MCB
;
PSPMCB db MCBlen dup (0) ;резервная область для MCB
SavRes db ResLen dup (0) ;область сохранения
; резидентной части
;
PspOld dw 0 ;для адреса старого PSP
PspNew dw 0 ;для адреса нового PSP
8
;
; сообщения
;
MsgInst label byte
db 0ah,0dh
db 'Программа установлена'
db 0ah,0dh
db '$'
MsgNoInst label byte
db 0ah,0dh
db 'Ошибка. Программа не установлена'
db 0ah,0dh
db '$'
;=========================================================
;
; процедура инициализации резидентной программы без PSP
;
;=========================================================
ini proc far
;
cld ;для операций
пересылки
mov cs:PspOld,ds ;сохраним старый PSP
;
; Освобождение environment
;
mov ax,ds:[2ch] ;адрес сегмента
mov es,ax ; environment
cmp ax,0 ;есть environment ?
je Go1 ; нет
mov ah,49h ;код функции
int 21h ; освободить
; память
jnc Go1 ;успешно
jmp ErrorRet ;неуспешно
Go1:
mov word ptr ds:[2ch],0 ;укажем, что нет
; environment
push cs ;установим
pop es ; ES
push cs ;установим
pop ds ; DS
;
; запомним резидентную часть
; т.к. она будет разрушена при построении новых PSP и MCB
;
mov si,Offset ResStart ;откуда
mov di,Offset SavRes ;куда
mov cx,ResLen ;сколько
rep movsb ;перешлем
;
; модифицируем размер памяти текущей программы от сегмента
; PSP на длину резидентной части
; это приведет к построению нового MCB в теле программы
;
mov ah,4ah ;модифицируем память
mov bx,ResSize ;размер резидентной
; части
mov es,PspOld ;сегмент старого PSP
int 21h ;выполним
jnc Go2 ;успешно
jmp ErrorRet ;неуспешно
Go2:
;
; подсчитаем сегмент памяти для нового PSP
;
mov ax,ResSize ;длина резидентной
; части в параграфах
add ax,PspOld ; плюс сегмент
; старого PSP
add ax,MCBLen/16 ; плюс длина MCB
mov PspNew,ax ;запомним сегмент
; для нового PSP
;
; создадим новый PSP
;
mov es,PspOld ;адрес старого PSP
mov si,word ptr es:[02h] ; конец памяти
mov ah,55h ;построим
; подчиненный PSP
mov dx,PspNew ;сегмент нового PSP
int 21h ;выполним
;
; скорректируем указатель на родительский PSP в новом PSP
;
mov es,PspOld ;сегмент старого PSP
mov ax,word ptr es:[16h] ;адрес родительского
; PSP
mov es,PspNew ;сегмент нового PSP
mov word ptr es:[16h],ax ;скорректируем
;
; сообщим DOS о новом активном PSP
;
mov bx,PspNew ;сегмент нового PSP
mov ah,50h ;функция указания
; нового PSP
int 21h ; выполним
;
; укажем принадлежность полученной памяти для нового PSP
;
mov ax,bx ;сегмент нового PSP
sub ax,1 ;сегмент
; построенного MCB
mov es,ax ;==================
mov word ptr es:[01h],bx ;скорректируем адрес
; владельца памяти
;
; переместим резидентную часть на старый PSP
;
mov es,PspOld ;адрес старого PSP
mov cx,ResLen ;размер резидентной
; части
mov di,0 ;куда
mov si,Offset SavRes ;откуда
rep movsb ;переместим
push cs ;восстановим
pop es ; ES
;
; Успешный выход из программы
;
PrgEnd:
mov ah,09h ; выведем сообщение
mov dx,offset MsgInst ; об успешной
; установке
int 21h ;
mov ax,4c00h ;завершим программу
int 21h ; обычным
; образом с кодом 0
;
; Выход из программы по ошибке
;
ErrorRet:
push cs ;установим адресацию
pop ds ; данных
mov ah,09h ; выведем сообщение
mov dx,offset MsgNoInst ; о неуспешной
; установке
int 21h ;
mov ax,4c04h ;завершим программу
int 21h ; обычным
; образом с кодом 4
ini endp
;
code ends
;
; СТЕК
;
stack segment stack
dw 512 dup(0)
stack ends
end ini
ГРУППА ПРОГРАММИСТОВ 2B.
НЕСКОЛЬКО СЛОВ О ВИДЕОАДАПТЕРАХ.
В данной статье рассматриваются особенности работы
резидентных программ (например драйверов русского языка) с
основным и альтернативным видеоадаптером, описывается метод
идентификации основного и альтернативного видеоадаптера.
ЧТО ТАКОЕ ОСНОВНОЙ И АЛЬТЕРНАТИВНЫЙ ВИДЕОАДАПТЕР.
Обычно на ПЭВМ мы работаем только с одним дисплеем и,
соответственно, с одним видеоадаптером. Однако аппаратура
ПЭВМ допускает стандартное подключение дополнительного
видеоадаптера и дисплея. Такой дополнительный видеоадаптер
называется альтернативным. При этом не следует путать
альтернативные видеоадаптеры с нестандартными
видеоадаптерами. Первые поддерживаются стандартными
средствами BIOS, а вторые используются различными
программами (САПР или издательские системы) с помощью
нестандартных программных средств. Иначе говоря, на
стандартно подключенный видеоадаптер всегда можно перевести
вывод всех сообщений DOS и программ, которые для вывода
используют средства BIOS.
Не всякие виды видеоадаптеров могут быть подключены
одновременно к ПЭВМ. В таблице 1 рассматриваются допустимые
сочетания видеоадаптеров.
СОЧЕТАНИЯ ВИДЕОАДАПТЕРОВ.
Таблица 1.
---------------T---T---T---T----T---T---T----T-------------¬
¦ Видеоадаптер ¦MDA¦CGA¦EGA¦MCGA¦VGA¦HGC¦HGC+¦HGC In Color ¦
+--------------+---+---+---+----+---+---+----+-------------+
¦MDA ¦ - ¦ + ¦ + ¦ + ¦ + ¦ - ¦ - ¦ - ¦
+--------------+---+---+---+----+---+---+----+-------------+
¦CGA ¦ + ¦ - ¦ + ¦ - ¦ + ¦ + ¦ + ¦ + ¦
+--------------+---+---+---+----+---+---+----+-------------+
¦EGA ¦ + ¦ + ¦ - ¦ - ¦ - ¦ + ¦ + ¦ + ¦
+--------------+---+---+---+----+---+---+----+-------------+
¦MCGA ¦ + ¦ - ¦ - ¦ - ¦ + ¦ + ¦ + ¦ + ¦
+--------------+---+---+---+----+---+---+----+-------------+
¦VGA ¦ + ¦ + ¦ - ¦ + ¦ - ¦ + ¦ + ¦ + ¦
+--------------+---+---+---+----+---+---+----+-------------+
¦HGC ¦ - ¦ + ¦ + ¦ + ¦ + ¦ - ¦ - ¦ - ¦
+--------------+---+---+---+----+---+---+----+-------------+
¦HGC+ ¦ - ¦ + ¦ + ¦ + ¦ + ¦ - ¦ - ¦ - ¦
+--------------+---+---+---+----+---+---+----+-------------+
¦HGC In Color ¦ - ¦ + ¦ + ¦ + ¦ + ¦ - ¦ - ¦ - ¦
L--------------+---+---+---+----+---+---+----+--------------
Следует отметить, что к ПЭВМ не может быть подключено
два видеоадаптера, работающие одновременно в цветном или
монохромном режиме. Если один видеоадаптер работает в
цветном режиме, то другой должен работать в монохромном
режиме.
Рассмотрим теперь особенности определения текущего
видеоадаптера при работе резидентной программы.
ВИДЕОАДАПТЕР EGA.
Для определения активности видеоадаптера EGA достаточно
проверить бит активности EGA адаптера в области данных BIOS.
Признак активности видеоадаптера расположен в поле по
адресу 40h:87h. Если установлен флажок 08h, то это значит,
что в текущий момент видеоадаптер EGA не активен, поэтому
следует организовывать работу с учетом альтернативного
видеоадаптера. Приведем фрагмент кода для определения
активности видеоадаптера EGA.
mov ax,40h ;адресация данных
mov es,ax ; BIOS
test byte ptr es:[87h],08h ;EGA активен ?
jz EgaAct ;EGA активен
jmp NonEga ;EGA не активен
Следует отметить, что среди обилия видеоадаптеров EGA
существуют видеоадаптеры, позволяющие программно
переключаться в режим совместимости MDA и HGC. При этом они
зачастую корректируют адрес обработчика INT 10h. Поэтому,
перед проверкой активности видеоадаптера EGA, мы рекомендуем
убедиться, что EGA до сих пор существует на вашей ПЭВМ. Это
можно сделать путем считывания переключателей EGA по функции
INT 10h, AH=12h, BL=10h. Приведем фрагмент кода, для
выполнения этой функции.
mov ah,12h ;запрос
mov bl,10h ; переключателей
int 10h ; вызвать INT 10h
cmp bl,10h ;функция выполнена ?
je NonEga ; EGA не активен
jmp EgaAct ; EGA активен
ВИДЕОАДАПТЕРЫ VGA/MCGA.
Видеоадаптеры VGA и MCGA являются поколением
видеоадаптеров, анонсированных в ПЭВМ PS/2 фирмы IBM. В
настоящее время существует большое количество видеоадаптеров
VGA. Среди них есть видеоадаптеры, поддерживающие
расширенные графические и текстовые режимы.
Чтобы определить активность видеоадаптера VGA/MCGA
достаточно выполнить функцию INT 10h, AX=1A00h. Если функция
обеспечена, то в регистре AL будет значение 1Ah. В этом
случае в регистре BL Вы получите код основного, а в регистре
BH - код альтернативного дисплея в текущий момент времени.
Возможны следующие коды:
00h - отсутствует;
01h - монохром;
02h - CGA;
03h - резерв;
04h - EGA с цветным дисплеем;
05h - EGA с монохромным дисплеем;
06h - PGC с цветным дисплеем;
07h - VGA с монохромным дисплеем;
08h - VGA с цветным дисплеем;
09h - 0Ah - резерв;
0Bh - MCGA с монохромным дисплеем;
0Ch - MCGA с цветным дисплеем;
0Dh - FEh - резерв;
-1 - неизвестен.
Таким образом процесс определения активного
видеоадаптера для ПЭВМ, оборудованных видеоадаптерами VGA,
не представляет особых проблем.
Приведем фрагмент кода, определяющий активность
видеоадаптера VGA/MCGA.
mov ax,1a00h ;спросим код дисплея
int 10h ;выполним
cmp al,1ah ;подсистема активна ?
jne NonSubst ;нет, возможно переключение
; в режим другого
; видеоадаптера или
; подсистема остутствует
cmp bl,07h ;VGA ?
je VgaAct ; да
cmp bl,08h ;VGA ?
je VgaAct ; да
cmp bl,0bh ;MCGA ?
je MCGAct ; да
cmp bl,0ch ;MCGA ?
je MCGAct ; да
jmp NonSubst ; не найден VGA/MCGA
Следует отметить, что все регистры видеоадаптера VGA
можно прочитать. Таким образом резидентная программа может
определить режим работы видеоадаптера - графический или
текстовый. Это может быть полезно для программ, которым
требуется сохранить текущее состояние экрана, или для
драйверов русского языка, чтобы определить режим загрузки
знакогенератора. Знание режима видеоадаптера позволяет
драйверам русского языка поддерживать старшие режимы работы
нестандартных видеоадаптеров VGA, не привязываясь к номеру
видеорежима. Определение текущего режима основано на анализе
содержимого регистра 06h GRAFICS CONTROLLER (Miscellaneous
Register). Размер буквы можно узнать в области данных BIOS
по адресу 40h:85h.
Приведем фрагмент кода для определения режима работы
видеоадаптера VGA.
; прочитаем GC регистр 06h
mov dx,03ceh ;адресный порт
mov al,06h ;номер регистра
out dx,al ;затребуем регистр
jmp short $+2
inc dx ;порт данных
in al,dx ;прочитаем регистр
; анализ типа знакогенератора
test al,01 ;графический режим ?
jz VgaTxt ;текстовый режим
jmp VgaGraf ;графический режим
СПОСОБ ОПРЕДЕЛЕНИЯ ТИПА ОСНОВНОГО И АЛЬТЕРНАТИВНОГО
ВИДЕОАДАПТЕРА.
В данном разделе мы расскажем Вам, как определить,
какие видеоадаптеры установлены на ПЭВМ. Предлагаемый метод
позволяет идентифицировать видеоадаптеры MDA, CGA, EGA,
MCGA, VGA, HGC, HGC+ и HGC In Color и совместимые с
HERCULES, которые мы будем называть MGA.
ПОРЯДОК ИДЕНТИФИКАЦИИ ВИДЕОАДАПТЕРОВ.
Приведем порядок, в котором Вам следует выполнять
идентификацию видеоадаптеров.
1. Проверить наличие видеоподсистемы VGA/MCGA по
функции INT 10h, AX=1A00h. Если подсистема активна, то код
основного и альтернативного видеоадаптера будет передан в
регистрах BL и BH.
2. Если в шаге 1 обнаружен монохромный дисплей, то
следует удостовериться, не является ли он адаптером типа
HERCULES. Метод определения видеоадаптеров типа HERCULES
рассмотрим ниже.
3. Если функция шага 1 не выполнена, то следует
проверить наличие видеоадаптера EGA по функции INT 10h,
AH=12h, BL=10h.
4. Если видеоадаптер EGA обнаружен, то следует
определить, работает EGA в цветном или монохромном режиме.
Метод определения основан на анализе переключателей на плате
EGA, полученных по функции INT 10h, AH=12h, BL=10h в младших
четырех битах регистра CL. Комбинация переключателей
следующая:
000X - обычный цветной дисплей;
001X - цветной дисплей с расширенными возможностями;
010X - монохромный терминал;
011X - обычный цветной дисплей;
100X - цветной дисплей с расширенными возможностями;
101X - монохромный терминал.
5. Если видеоадаптер EGA работает в цветном режиме, то
следует проверить, не подключен ли видеоадаптер
MDA/HERCULES.
6. Если видеоадаптер EGA работает в монохромном режиме,
то следует проверить, не подключен ли видеоадаптер CGA.
8. Если видеоадаптер EGA не обнаружен, то следует
проверить наличие видеоадаптеров MDA/HERCULES или CGA. Выбор
текущего видеоадаптера при одновременном наличии CGA и
MDA/HERCULES производится на основе анализа видеорежима в
области данных BIOS по адресу 40h:49h. Видеорежим 07h
указывает на активность видеоадаптера MDA/HERCULES.
МЕТОД ОПРЕДЕЛЕНИЯ ВИДЕОАДАПТЕРА CGA.
Видеоадаптер CGA определяется путем проверки наличия
6845 CHIP (CRT CONTROLLER) с индексным регистром 3D4h. Метод
проверки наличия 6845 описан ниже.
МЕТОД ОПРЕДЕЛЕНИЯ ВИДЕОАДАПТЕРА MDA/HERCULES.
Проверка наличия видеоадаптера MDA или HERCULES, а
также подобных им адаптеров выполняется на основе следующего
алгоритма.
1. Проверяется наличие 6845 CHIP (CRT CONTROLLER) с
индексным регистром 3B4h.
2. Считывается содержимое порта 3BAh (состояние CRTC)
и проверяется, изменяется ли бит 7 этого порта (индицирует
VERTICAL SYNC). Если нет, то видеоадаптер классифицируется
как MDA.
3. Адаптеры фирмы HERCULES идентифицируются битами 4-6
состояния CRTC:
000 - HGC;
001 - HGC+;
101 - InColor Card).
остальное - совместимый с HERCULES монохромный графичесий
адаптер - MGA.
Следует отметить, что идентификация типа видеоадаптера
фирмы HERCULES на базе бит 4-6 может быть недостоверна, т.к.
многие фирмы разработчики совместимых видеоадаптеров
неправильно устанавливают эти биты.
Приведем фрагмент кода, идентифицирующий видеоадаптеры
MDA/HERCULES/MGA.
mov dx,3B4h ; проверить наличие 6845
; CHIP.
call Test_6845 ; процедура проверки наличия
; 6845
; CF=1 - 6845 не найден
; CF=0 - 6845 найден
jc NonMdaHgc ;6845 CHIP отсутствует.
;нет MDA/HERCULES/MGA.
mov dx,3BAh ; считать регистр состояния
in al,dx ; CRTC.
and al,80h ; изолировать бит 7
; (VERTICAL SYNC).
mov ah,al ; проверим, изменяется ли
; бит 7.
mov cx,8000h ; количество повторов.
TBIT7: in al,dx ; регистр состояния CRTC
and al,80h ; изолировать бит 7
; (VERTICAL SYNC).
cmp ah,al ; сравним значения
loope TBIT7 ; повторим
je MDAFOUND ; переход, если бит 7 не
; изменился. Только MDA
; определим тип адаптера HERCULES.
in al,dx ; считать состояние CRTC.
and al,70h ; изолировать биты 4-6.
jz HGCFOUND ; переход, если это HGC.
cmp al,10h ; это HGC+?
je HGCPFOUND ; да, переход.
cmp al,50h ; это InColor Card?
je HGCICFOUND ; да, переход.
jmp MGAFOUND ; адаптер, совместимый с
; HERCULES - MGA.
МЕТОД ОПРЕДЕЛЕНИЯ НАЛИЧИЯ 6845 CHIP
6845 CHIP используется в видеоадаптерах MDA, CGA и
HERCULES в качестве CRT CONTROLLER. Техника определения
наличия этой микросхемы заключается в том, что в регистр 15
CRT CONTROLLER (младший байт местоположения курсора)
записывается значение, которое затем считывается обратно.
Если возвращено записанное значение, то 6845 CHIP есть в
компьютере.
Приведем фрагмент кода для определения 6845 CHIP.
Считается, что при входе в программу регистр DX содержит
адрес индексного регистра 6845 CHIP ( 3D4h/3B4h ).
cli ; запретить прерывания.
mov al,15 ; подготовиться к работе с
; регистром 15 CRTC.
out dx,al ; передать номер регистра
jmp short $+2
inc dx ; регистр данных
in al,dx ; считать текущее значение
; регистра 15.
mov ah,al ; запомнить считанное
; значение
mov al,66h ; записать в регистр 15
; тестовое значение.
out dx,al ; передадим
jmp short $+2
mov cx,400h ; дождаться, пока 6845 все
; это воспримет.
W1: loop W1 ; ждем
in al,dx ; считать тестовое значение.
xchg ah,al ; восстановить
; первоначальное значение
; регистра 15.
out dx,al ; передадим
jmp short $+2
sti ; разрешить прерывания.
cmp ah,66h ; считано тестовое значение?
je F6845 ; да, 6845 найден.
jmp NF6845 ; 6845 не найден
ОПЫТ ПРИМЕНЕНИЯ.
Описанный механизм был, в частности, применен при
разаработке универсального драйвера русского языка. Авторы
стокнулись с тем фактом, что ни один из существоваших на
этот момент драйверов не поддерживал работу с альтернативным
видеоадаптером и не обеспесчивал расширенных режимов VGA
видеоадаптера. Любая попытка перейти на альтернативный
видеоадаптер приводила к срыву синхронизации. Авторы
использовали комбинации видеоадаптеров EGA/HGC и VGA/MGA.
Разработанный авторами драйвер поддерживает все описанные
выше комбинации видеоадаптеров. Он может запускаться как
драйвер из CONFIG.SYS или использоваться как обычная
программа и запускаться, например, из AUTOEXEC.BAT.
ГРУППА ПРОГРАММИСТОВ 2B.
КАК СКОПИРОВАТЬ ЗАЩИЩЕННУЮ ОТ КОПИРОВАНИЯ ДИСКЕТУ.
Статья посвящена анализу форматов защищенных от копирования дискет
и возможным методам их копирования.
НЕСКОЛЬКО СЛОВ О ЗАЩИТЕ ОТ КОПИРОВАНИЯ.
Системы защиты от копирования предотвращают использование
"ворованных" копий программного обеспечения. Разработка таких систем в
условиях нашей страны, когда огромные толпы программистов стремятся
всячески вскрыть защищенные программы, является делом достаточно
сложным и требует определенной квалификации и опыта. В настоящее время
на рынке программного обеспечения средств защиты появилось много
программ, обеспечивающих защиту от копирования. Зачастую реклама этих
программ не соответствует действительным возможностям. Авторы решили
приобщиться к когорте программистов, вскрывающих системы защиты от
копирования. При этом мы не хотим дискредитировать сами системы защиты
от копирования, а просто хотим предостеречь возможных покупателей от
использования несовершенных систем с одной стороны, а также привлечь
новые отряды высококвалифицированных программистов к разработке систем
защиты, которые действительно всем нам очень нужны.
В основном все программисты, занимающиеся вскрытием защит, идут по
пути преодоления систем защиты от отладчиков, чтобы выполнить
модификацию тех частей программы, которые отвечают за проверку
легальности копии. Эта работа требует высокой квалификации. Мы пошли
несколько другим путем. Система защиты предполагает наличие дискеты,
называемой ключевой, и не копируемой стандартными средствами, а также
специальными программами или аппаратурой для копирования. Мы
исследовали дискеты систем защиты и можем предложить способы
копирования защищенных дискет с использованием подручных программных
средств. Вам потребуется широко распространенные программы COPYWRIT
издания март 1987 и EXPLORER издания апрель 1987.
Мы подвергли анализу несколько системы.
JAWS версия 4.0 1989 год. Автор Малькович А.П.
НОТА версия 1.1 февраль 1990. Автор Стас Ляшев. Система
распространяется СП НОВИНТЕХ.
SHIELD (известна также под названиями ARMOUR, БРОНЯ и ЩИТ). Под
названием SHIELD распространяется кооперативом ЭЛИАС.
Система защиты ПП от несанкционированного копирования (программа
INST_FD) версия 2.1, май 1990. Производитель не известен. Известна под
названием PROTECT.
JAWS.
Система защиты от копирования JAWS утверждает, что созданные ей
дискеты не копируются программой COPYWRIT. Это утверждение не
соответствует действительности. Автор программы записывает некоторую
информацию на 0 поверхность 42 цилиндра. Мы не будем рассказывать,
какой именно формат и как записывается на этот цилиндр, т.к. Вы можете
запустить программу COPYWRIT и, указав максимальный копируемый цилиндр
42, получить работоспособную копию защищенной дискеты. Естественно,
дискета легко копируется с помощью платы COPY II PC OPTION BOARD DELUXE
(в дальнейшем изложении будем называть для краткости просто OPTION
BOARD), если вы укажете копирование до 42 цилиндра. При работе с платой
достаточно сначала скопировать дискету обычной программой DISKCOPY, а
затем с помощью платы скопировать 42 цилиндр.
НОТА.
Авторы этой системы также решили расположить информацию о защите
на инженерном цилиндре. В отличие от системы JAWS они решили
использовать 41 цилиндр. Однако программа COPYWRIT также успешно
копирует эту дискету. Дискета естественно легко копируется платой
OPTION BOARD.
SHIELD.
Авторы система SHIELD не пошли проторенным путем использования
инженерного цилиндра. Они использовали свободное пространство на 0, 1 и
2 цилиндрах для размещения ключевой информации. Дискета не копируется
напрямую программой COPIWRYT. Однако после копирования программой
COPYWRIT достаточно немножко помочь программой EXPLORER и Вы имеете
работоспособную копию. Дискета не устойчива к копированию платой OPTION
BOARD. Мы рекомендуем Вам при использовании платы скопировать сначала
дискету программой DISKCOPY, а
...Закладка в соц.сетях