|
|
| |
|
|
Защита инсталляра. А.П. Чистяков
Статистика утверждает, что из всего используемого в России программного
обеспечения, около 70% нелицензионное. (В Китае, например, более 90%.)
В интервью для радио "Эхо Москвы" наши законодатели сообщили, что Дума
пока не собирается ужесточать закон об авторских правах. Пока в России
рядовым пользователям, да и многим организациям не по карману дорогие
программы. Таково сейчас реальное положение дел. Это надо знать,
принимать к сведению и учитывать в работе. С точки зрения пользователя защита программы должна как минимум
не приводить к сбоям в работе, уничтожению информации. Но кроме этого,
защита не должна приводить к серьезным неудобствам в работе. Вам
приходилось видеть, как к параллельному порту компьютера подключены в ряд
несколько ключей защиты? А после них еще принтер? При аппаратной защите
один раз на сто случаев (по словам разработчиков) бывает, когда принтер с
таким подключением не работает. Мне "повезло", в моей практике это
произошло два раза. В первом случае дилер без проблем заменил
установочный пакет, а во втором случае дело было в выходной и мне в
срочном порядке пришлось покупать второй порт. Речь идет об 1C. К ним вообще много вопросов, но это отдельный разговор. Пока
могу только сказать, что пользователи при первой же возможности ставят
вскрытую программу, а поскольку лицензионная версия была куплена, право
на обслуживание сохраняется. Мало того, говорят, некто Соболев написал
такую мульку, которая позволяет обходить ключ защиты. Отсюда правило: Никогда не пользуйтесь чужим программным обеспечением по защите
информации. Самый простой пример: специально для спецслужб (разработчиками
BIOS) были созданы универсальные пароли, открывающие любой компьютер, где
стоит пароль на вход. Вот примеры:
- AWARD BIOS: AWARD_SW, lkwpeter, Wodj, aPAf, j262, Sxyz, ZJAAADC
- AMI BIOS: AMI, SER, Ctrl+Alt+Del+Ins (держать при загрузке, иногда
просто INS)
С точки зрения разработчика программа должна быть написана таким
образом, чтобы ее нельзя было украсть. Если уж составлять программу, то
почему бы самим не позаботиться о ее защите? Тем более, если проект такой
серьезный, что станет жалко, если его начнут несанкционированно
копировать, нужно принять серьезные меры. По всей вероятности необходимо,
чтобы затраты на защиту не превышали стоимость ущерба от вскрытия. Думаю,
что должно быть оптимальное соотношение цены и качества. Никто не станет
взламывать программу если затраты будут приближаться к стоимости
собственной разработки. Поэтому решение применить ключ защиты выглядит
как "фул пруф", какой-то элементарный ход. Похоже, менеджеры 1С забыли,
что "по отношению цена/качество не имеет себе равных халявное пиво".
Итак, для серьезного программного продукта не стоит заказывать
защиту на стороне, если вы не хотите, чтобы она была немедленно взломана.
А для несерьезного - тем более. Штатный программист в состоянии обеспечить
не только необходимый минимум защиты, но и доставить серьезные проблемы
хакерам. Особенно если сам программист - хакер.
Часто работа по взлому программы напоминает отладку на турбодебагере.
Когда выполнение доходит до критической точки, в условном переходе меняем
"TRUE" на "FALSE". Поэтому появился совершенно логичный способ защиты:
некорректный режим работы программы, то есть она не прекращает работу, а
выдает ошибочные результаты, или ограничивает функциональные возможности.
Такой способ уже начали применять некоторые фирмы, но он не доведен до
логического конца. Сама непосредственная проверка сидит в какой-то одной
библиотеке (в конкретной dll), что упрощает разработку, ускоряет работу,
уменьшает память, но существенно облегчает взлом. Напрашивается способ,
где проверка заложена в нескольких динамически подключаемых библиотеках.
Некоторые вещи очевидны: перед компиляцией необходимо убрать из
исходника всю лишнюю отладочную информацию. Но получить список внешних
используемых функций очень просто, хотя бы в режиме быстрого просмотра.
Для этого достаточно выбрать его в контекстном меню, щелкнув по dll правой
кнопкой мыши. Поэтому старайтесь для защиты использовать как можно меньше
встроенных функций Windows. Разве что как "фул пруф", например сделать
проверку метки диска (1-й дискеты инсталляра):
procedure TForm1.Button1Click(Sender: TObject);
{ Использовал в Delphi3 }
var
sss:array[0..max_path] of char;
ss1: PDWORD;
ss2: PChar;
i1,i2:integer;
begin
Getvolumeinformation(PChar('a:\'),SSS,Sizeof(sss),
ss1,i1,i2,ss2,SizeOf(ss2));
Label1.Caption:=sss;
end;
Пусть хакер порадуется, когда вскроет эту простейшую защиту, потому
что настоящая защита будет в другом месте. Вот приблизительная схема:
Инсталляр копирует содержимое 1-й дискеты на компьютер, одновременно
проверяя метку диска, серийный номер и объем памяти. При несовпадении
метки немедленный выход. Остальная информация просто запоминается. Код
определения серийного номера диска (писалось для Delphi1):
unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages,
Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
public
end;
var
Form1: TForm1;
NVOL:longint;
dd: string;
ff:textfile;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
procedure GetDiskVol(NDisk:word);
{NDisk: 0-A, 1-B, 2-C, 3-D...}
var
v,segmn,offst:word;
Packet:record strt:longint; count,tofs,tseg:word end;
buff:record dd1:array[0..$26] of byte;
NVOL:longint; dd2:array[0..511-($27+4)] of byte end;
begin
{DOS 4.00+}
with Packet do begin strt:=0; count:=1;
tofs:=Ofs(buff); tseg:=seg(buff) end;
segmn:=seg(Packet);
offst:=Ofs(Packet);
asm
push bp
mov dx,NDisk
mov cx,$FFFF
mov bx,offst
mov ax,segmn
push ds
mov ds,ax
mov ax,dx
INT $25
pop cx
pop ds
pop bp
end;
NVol:=Buff.NVOL;
end;
begin
Form1.brush.style:=bsclear;
GetDiskVol(0);
assignfile(ff,'c:\CurrVol.txt');
rewrite(ff);
{dd:=Label1.Caption;}
dd:=inttostr(nvol);
write(ff,dd);
closefile(ff);
end;
end.
Затем предложение ввести серийный номер продукта с немедленным выходом
при несовпадении (на радость хакеру). После этого копируется содержимое
остальных дискет (тоже с проверкой). По окончании - просьба вставить
первую установочную дискету с снятием защиты от копирования, куда в файл
счетчика установок заносится очередная цифра. (Легко придумать, где она
может пригодиться.) Скопированные файлы разархивируются, причем архиватор
придется сделать самим: защищать, так защищать! В Delphi это несложно
сделать благодаря свободно распространяемому компоненту TSizer
(написанному на С++). Для каждой библиотеки желательно менять способ архивации.
В процессе выполнения этой программы формируется новая программа,
которая и есть настоящий инсталляр. Причем с привязкой к конкретному
компьютеру. Настоящей привязкой я считаю привязку к дате BIOS. Код
выполнен на ассемблере, поэтому занимает ничтожно мало памяти. В Delphi и
С++ встроенный ассемблер и я рекомендую не создавать библиотечную функцию,
а вставлять этот код в разные места программы и сразу в несколько
библиотек:
procedure TForm1.BitBtn2Click(Sender: TObject);
var
dat2:string[8];
i:dword;
procedure tttddd(var it1:tt1); assembler;
asm
mov edi,it1
mov esi,$000FFFF0
mov eax,[esi]
mov [edi],eax
mov eax,esi
add eax,4
mov esi,eax
mov eax,edi
add eax,4
mov edi,eax
mov eax,[esi]
mov [edi],eax
mov eax,esi
add eax,4
mov esi,eax
mov eax,edi
add eax,4
mov edi,eax
mov eax,[esi]
mov [edi],eax
mov eax,esi
add eax,4
mov esi,eax
mov eax,edi
add eax,4
mov edi,eax
mov eax,[esi]
mov [edi],eax
end;
begin
tttddd(dat1);
{ Абсолютная адресация }
dat2[0]:=chr(8);
for i:=5 to 5+7 do dat2[i-4]:=dat1[i];
Label3.Caption:=format(' = : %s',[dat2]);
end;
Можно еще проверить размеры новых файлов, удалить скопированные файлы,
записать на их место дезу, но главным будет проверка серийного номера и
объема памяти дисков с дистрибутивами. DiskDupe (и аналогичные программы
создания полной копии дискеты) работает не со всеми размерами дисков и я
предлагаю выполнять нестандартное форматирование дискет. Тривиальный прием,
когда пароль пишется на конкретное физическое место, которое затем
помечается ка bed сектор, этот прием можно не применять, разве что для
отвода глаз, так как об этом знает любой хакер. По самому инсталляру небольшое замечание: возникает соблазн
воспользоваться знаменитой программой Installshield, но не стоит ему
поддаваться, лучше все делать самомому: запрос каталога, для установки
программы и ее компонентов; копирование файлов; создание программной
группы (компонент TDdeClientConv); запись в регистраторе. Но пусть
интерфейс инсталляра будет стандартным: голубая градиентная заливка,
индикатор состояния, и т.д., не будем лишать хакера удовольствия
запустить installshield decompiler. Итак, ваша программа установлена. При этом независимо от того,
совпадают ли серийные номера, размеры дискет, или дата BIOS, программа
будет работать. И пусть она работает правильно еще несколько дней. Но
потом, если она является взломанной копией, начнется некорректная работа:
изменится интерфейс, станут недоступны или ограничены некоторые
функциональные возможности. Поскольку программа работает, определить
такие процедуры защиты будет непросто даже применив disassembler. Советую
пойти еще дальше и некорректная работа будет возникать не всегда в одних
и тех же местах и режимах, а случайно и с разной вероятностью.
Может оказаться полезным проверять дату создания инсталляра. Если
дата первой установки будет отличаться например на месяц, то сформируется
инсталляр, который установит некорректную версию, что проявится не сразу.
Существует способ, при котором необходимо при установке программы
звонить разработчикам, чтобы узнать дополнительный код. Недостатки этого
способа очевидны: звонок - серьезное неудобство, но самое главное:
существует слабое звено - человек. Пусть в фирме все сотрудники кристальной
честности. Но почему-то всегда находится хотя бы один, желающий немного
"подзаработать". Это очень печально, но, к сожалению, все так и есть.
Названия фирм называть не буду, они хорошо известны. Все написанное здесь можно было бы назвать "Инсталляр для чайника",
если бы не тот факт, что многие современные коммерческие программы
имеют очень слабую, легко взламываемую защиту, хотя этого легко можно
было бы избежать. Надеюсь, что мои советы пригодятся разработчикам ПО хотя бы в том
смысле, что натолкнут на новые идеи, создадут желание придумать свои приемы.
|
| | |
|
|