Добрый день! У меня такая проблема, надо установить пароль при запуске моей программы. Проблемы в том что прога состоит из одного файла и будет переноситься с компа на комп поэтому пороль должен хранится в самом ЕХЕ файле и плюс должна быть возможность его изменить. Как можно сделать запись в саму прогу когда она уже откомпилирована и уже в виде ЕХЕ файла? Может есть возможность зашить в неё например техтовый файл с которым и работать и хранить и изменять пороль? Помогите если кто знает!
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
30-05-2006 14:33
>>> Есть программа тестирования знаний ПДД
Применяю социальную инженерию: спрашиваю у людей, кто уже пытался ЭТО сделать (сломать прогу) скопированную часть, изучаю, смотрю, какой файл/ключ реестра/еще чего требуется. Если есть, скажем, защита с использованием какой-нибудь информации о системе, вроде запроса серийного номера винчестера, я напишу программу, которая честно утянет информацию с того компьютера, а у себя дома это эмулирую (имеется в виду. что между попытками у меня по меньшей мере неделя, потому что я бы так быстро не успел, хотя на cracklab уверяют, что такая защита ломается самое большее за 15 минут).
Вывод: социальная инженерия приходит на помощь всегда (ну или практически всегда), люди - самая дырявая часть любой защиты (невольно приходишь к идее фильма Терминатор).
Комментарий в двух частях с эпиграфом и приложением.
все равно любой ключ
найти можно
хоть как не старайся !!!
trou, "Ответ на вопрос №41175"
Часть первая: Защита от копирования.
Предположим, что нам надо защитить программу от копирования. Именно "от копирования", а не от взлома и других нехороших вещей. Как это сделать: установить её на компьютер без дисководов и USB, после чего не подпускать к нему людей с отвертками. Будет ли задача выполнена? Да, программа полностью защищена. Однако, мы не можем назвать такую защиту идеальной, так как мы программисты, а решение аппаратное. Возможно ли осуществить такую же надежную защиту программно? Нет, так как если программа работает, то перед выполнением она должна быть считана с носителя на котором она находится в оперативную память, а сделать это может что угодно. Хотя операционная система и может пытаться как-то ограничить доступ к информации, а BIOS пытается защитить операционную систему, пока что эти попытки не слишком успешны.
Казалось бы задача неосуществима, однако углубляясь в теорию не стоит забывать практику. Как правило никто не пытается защитить от копирования программы, устанавливающиеся на компьютеры, доступ к аппаратной и программной части которых неограничен. (домашний компьютер) Наоборот, цель такой защиты - не дать злоумышленнику утащить программу к себе домой. По этому такие защиты ставятся например на программах-тестах в школах, университетах и других конторах где доступ к компьютеру сильно ограничен, как впрочем, и возможности самого компьютера. Тем не менее у большинства таких компьютеров есть USB порт или флоповод, что может в принципе позволить унести программу. (Как частный случай - флоповод у админа). Кроме этого BIOS всегда запаролен, и как правило инженерные пароли не подходят, а права пользователя в операционной системе минимальны. В случае учебного заведения пользователи имеют доступ к компьютеру 1-2 раза в неделю, в сумме не более нескольких часов, под присмотром администратора, поэтому зачастую взлом "на месте" невозможен. Все эти ограничения позволяют использовать следующее решение: если время (число попыток) требуемое для копирования программы больше доступного пользователю, то задача решена.
Пример: Есть программа тестирования знаний ПДД, на нее отводится два занятия - одно для тренировки, другое для сдачи. Во время тренировки программа копируется, после чего изучается на другом компьютере. Выясняется, что основная часть программы находится в другом (скрытом) файле. Защита осуществлена, так как количество попыток копирования закончилось.
Часть вторая: Защита от взлома.
В первой части был выведен основной критерий эффективности защиты информации: защита считается эффективной, если затраты на ее взлом превышают возможности взломщика. В другой формулировке, это звучит как: защита эффективна, если проще самому написать такую же программу, чем ломать имеющуюся. В этой фразе содержится одна деталь, которую авторы защит часто не замечают: если часть программы зашифрована или спрятана, взломщик может написать её аналог, и встроить его в программу.
Пример: вы зашифровали код главного модуля: Application.Initialize;Application.CreateForm(..);...; надеясь на то, что взломщик не найдет момент создания формы, и взломщик действительно его не нашел. Вместо этого он просто восстановил нужный участок кода.
Кроме "защит" паролем запуск(создание) приложения(формы), часто встречаются "защиты" в которых правильный пароль хранится непосредственно в программе. Не скажу что криптографические защиты идеальны, однако они позволяют, по крайней мере избежать такой ошибки. Также взломщику сильно облегчает жизнь использование автором библиотечных функций, которые улучшают понимание кода, не говоря уже о том, что их внутренности давно уже изучены. Особенно у функций randomize,random().
Приложение A.
О защите лицензионных программ.
1) Если защита плохая то её сломают.
2) Microsoft написало windows 9x - самую дырявую операционку, и защита у её программ сильно страдает.
3) Сейчас самая популярная защита - ключевой файл. Его обычно крадут.
4) Защиты коммерческих программ крупных фирм работают по прнципу: стоймость 1 лицензиооной копии окупает 99 ломаных.
Приложение B.
"Сказ о том, как тест ломался"
Не так давно мне надо было выполнить несколько тестов по одному очень умному предмету. Поскольку предмет был очень умным я не стал его учить, а вместо этого решил тесты взломать. Компьютеры, на которых были установлены тесты не имели ни usb, ни флоповодов, поэтому унести тесты я не мог, также как и принести туда отладчик или дизассемблер. В качестве утешения на компьютерах стояла IDE Borland Pascal 7.0 вместе чудной программой Turbo Debugger, однако я с этой программой общего языка не нашел, зато сам компилятор мне понравился. Просмотрев в Нортоновском командере файлы тестов, я увидел что они написаны на паскале. Сам тест выдавал вопросы случайным образом, с числом вариантов около двухсот. Придя домой я глянул какой код у функции random() и написал программу, ищущую в её exe файлах и изменяющую ее код таким образом, чтобы она всегда возвращала ноль. В следующий раз я отпечатал в любезно предоставленном мне паскале свою программу запустил ее, и тесты стали задавать только по одному вопросу, ответы на которые были подобраны. Мораль эти истории не в том, что не надо ставить паскаль, (писать можно и на WinScript), а в том, что (1) программы надо защищать, (2) использование библиотечных функций не всегда правильно и (3) была бы программа, а взломщик найдется.
GoldFinch
А разве описано что мы пишем систему защиты для банка или для обычного пользователя
можно и через pgp шифрование и компрессию ключа потом сделать
но все равно любой ключ найти можно хоть как не старайся !!!
30-03-2006 09:41 | Комментарий к предыдущим ответам
2 GoldFinch:
Принципы защиты нормальных коммерческих продуктов всем ясны и понятны. Эту тему мусолят уже давно. Но здесь-то это просто защита от тупых (уж извините, но есть) юзверей. Хотите сказать, что эти товарищи будут ставить отладчик, ставить бряки, нопить... Сомневаюсь, сильно. ИМХО. Автор вроде бы дал это понять... Кстати, автор, вопрос решен, или этот вопрос можно переносить на БП с обсуждением, как стоит и как не стоит осуществлять защиту...
const
PassRec:packed record
GUID:TGUID;
Data:array[0..255] of Char;
end=(GUID:'{19824508-23C7-4923-A19C-68B9FBED7959}');
//Чтение сохранённого пароля
function GetPass:string;
begin
Result:=PassRec.Data;
end;
//Запись пароля в собственный EXE-шник
procedure SetPass(const NewPass:string);
var
OldFileName,Sign:string;
Offset:Integer;
begin
with TMemoryStream.Create do try
LoadFromFile(ParamStr(0));
OldFileName:=ChangeFileExt(ParamStr(0),'.old');
DeleteFile(PChar(OldFileName));
if not RenameFile(ParamStr(0),OldFileName) then
raise Exception.Create('ERROR!!!');
SetString(Sign,PChar(@PassRec.GUID),SizeOf(TGUID));
Offset:=MemoryStrPos(Sign,Memory^,Size);
//функцию брать тут http://www.delphikingdom.com/asp/answer.asp?IDAnswer=38104
if Offset<0 then
raise Exception.Create('ERROR!!!');
Inc(Offset,SizeOf(TGUID));
StrLCopy(PChar(Memory)+Offset,PChar(NewPass),SizeOf(PassRec.Data));
SaveToFile(ParamStr(0));
finally
Free;
end;
end;
//После вызова останется ".old" файл который можно стереть при следующем запуске или при выходе из программы через батничек (как именно, ни раз обсуждалось).
плюс в этом примере код пользователя программы хранится в файле password в зашифрованном виде
а exe файл легко переносится на другой комп с зашифрованниом паролем в самом файле его можно поставить какой угодно
вот решение проблемы !!!!
//создание пароля
procedure TfmPanel.N26Click(Sender: TObject);
var aNewParol: string;
begin
if N26.Caption<>'закрыть администрирование'then begin
if frmDlg.Password('доступ к администрированию','пароль','') = mrOk then begin
aNewParol := frmDlg.eValuePassword.Text;
if aNewParol = constParol then begin
N2.Enabled:=True; N24.Enabled:=true;
N25.Enabled:=true;
N26.Caption:='закрыть администрирование';
end // if
else begin
MessageDlg('пароль неверный!', mtWarning, [mbOk], 0);
N2.Enabled:=False; N24.Enabled:=false;
N25.Enabled:=false;
end; // else
end; // if passw
end // if caption
else begin
N2.Enabled:=False;
N26.Caption:='закрыть администрирование';
end;
end;
///изменение пароля
procedure TfmPanel.ChangePassword;
var
aNewParol,codepassword: string;
i: Integer;
c: Byte;
F: textfile;
begin
if frmDlg.Password('Изменение пароля','введите пароль','') = mrOk then begin
aNewParol:=frmDlg.eValuePassword.Text;
if aNewParol=constParol then begin
if frmDlg.Password('Изменение пароля','новый пароль','') = mrOk then begin
if length(frmDlg.eValuePassword.Text)<3 then begin
MessageDlg('длина пароля должна быть не менее 3 символов'+#13+
'пароль не изменен.',mtError,[mbOk,mbHelp],75);
exit;
end;
Randomize;
codepassword:='';
aNewParol:=frmDlg.eValuePassword.Text;
for i:=length(aNewParol) downto 1 do begin
codepassword:=codepassword+Chr(Ord(aNewParol[i])+7);
c:=random(100)+36;
codepassword:=codepassword+Chr(c);
end;
{$I-}
AssignFile(F, 'password');
FileMode := 1; { Set file access to write only }
Rewrite(F);
write(F, codepassword);
CloseFile(F);
{$I+}
if IOResult<>0 then begin
MessageDlg('ошибка при записи в файл' + #13 +
'пароль не изменен', mtError, [mbOk,mbHelp],75);
exit;
end;
constParol := aNewParol;
MessageDlg('пароль изменен', mtInformation, [mbOk], 0);
end;//if ClickedOK then begin
end //if aNewParol = constParol then begin
else
MessageDlg('пароль не верный!', mtError, [mbOk], 0);
end;
end;
при создании формы пишем вот такую процедуру
procedure TfmOrder.ReadParol;
var
codepassword: String;
i, c: byte;
F : textfile;
begin
{ считываем пароль }
{$I-}
AssignFile(F, 'password');
FileMode := 0; {Set file access to read only}
Reset(F);
read(F, codepassword);
CloseFile(F);
{$I+}
constParol := '';
if (IOResult<>0)OR(length(codepassword) < 6)then begin
if IOResult=0 then
ShowMessage('Внимание! Файл с паролем пытались исправить, для защиты возвращаем исходный пароль');
constParol := 'password';
//Ошибка при чтении пароля, то устанавливаем пароль первоначальный - password
Randomize;
codepassword := '';
for i := length(constParol) downto 1 do begin
codepassword := codepassword + Chr(Ord(constParol[i]) + 7);
c := random(100) + 36;
codepassword := codepassword + Chr(c);
end;
{$I-}
AssignFile(F, 'password');
FileMode := 1; { Set file access to write only }
Rewrite(F);
write(F, codepassword);
CloseFile(F);
{$I+}
end
else
for i:=1 to length(codepassword) do
if Odd(i) then
constParol := Chr(Ord(codepassword[i]) - 7) + constParol;
end;
все эти процедуры храят исходный код в самой программе плюс пользователь может сам изменять пароль приятного пользования
> С реестром не выдет поскольку при переносе с компа на комп
> (пользователь на флешке может понести её домой)
> произойдёт обращение к ключe в реестре которого не существует
правильно, и программа ему скажет: введи правильный пароль!
а в пароле долна быть зашита информация о компьютере, на котором может запуститься программа (например, номер раздела HDD), и если этот номер из пароля не совпадет с номером HDD, на котором запустилась программа, то это - нелицензированный пользователь
GoldFinch К чему сводится работа с файлом - к операциям над его хэндлом, правда? Почему нельзя обычными средствами работать с занятым файлом - потому что система тебе не отдаст его хэндл по createfile. Но createfile есть не что иное как получение хэндла. Больше скажу, не обязательно лазить в ринг-0, хэндл утянуть можно и в юзермоде
2 SLoW
под ДОСью с НТФС
На нормально защищенном компе загрузка должна происходить только с винча, а ещё хорошо когда дисковода вообще нету...
даже под окощками можно скопировать эти файлы
Как??? Выходом в нулевое кольцо и прямым обращением к диску???
Если знаете другой метод расскажите...
Если хочется писать в exe то лучше работать с ресурсами, только мне не очень понятно: что означает "хранить пароль в файле"???
ИМХО участники обсуждения, являясь только программерами не очень понимают как ломаются проги... и вообще не разбираются в защите информации...
Короче, предлагаю такой вариант:
1. Объявить в проге глобальную константу длиной в 16 байт для хранения MD5-хеша.
2. Найти на этом сайте статью о записи в свой ЕХЕ-файл.
3. Найти в тырнете алгоритм вычисления MD5-хешей.
3.2 :-)) Я плакал ... Неужели Вы так думаете? Конечно, нет. Как минимум, под ДОСью с НТФС драйверами можно скопировать и изменять все что угодно. Но более того, даже под окощками можно скопировать эти файлы :-) не скажу как, но можно
29-03-2006 12:21 | Комментарий к предыдущим ответам
Либо можете сделать еще так:
В проге сделать таблицу паролей, и запрашивать нужный в зависимости от, скажем, названия ехе:)) Они наверное, не догадаются переименовывать:))
29-03-2006 12:17 | Вопрос к автору: запрос дополнительной информации
а пароль-то зачем?:) что в ней такого важного? я это к тому, что стоит ли овчинка выделки? И потом, запись в самого себя - не есть гуд, у меня как то антивирусник на простое переименование ехе ругаться начал:))
С реестром не выдет поскольку при переносе с компа на комп (пользователь на флешке может понести её домой) произойдёт обращение к ключe в реестре которого не существует:( Пfроль должен быть зашит в ЕХЕ фаил и при этом была возможность его поменять то есть производить перезапись в ЕХЕ без нарушения его работы. Программа мобильная и никаких фаилов с ней не должно быть поскольку пользователи очень низкого уровня и ОБЯЗАТЕЛЬНО полезет в файл (не от большого ума).
Я полагаю, автор вопроса не пытается создать абсолютную защиту от злобных хакеров, а просто хочет сократить число файлов до минимума, чтобы глупые юзеры не потеряли лишние файлы. А ты ему такие слова ругательные сразу: RegMon, хеш, HEX формат...
Была подобная проблема,
Решил её так:
Создал в реестре ключ, с нелепым названием, к примеру,
HKEY_USERS\S-522-5-21-746137067-484763869-725345543-1003_Classes
И внём создал бинарное значение, в котором хранится пароль,
но перед этим строку придётся элементарно зашифровать,
в простейшем случае так:
type
TChArr = array[1..32] of byte;
var DS:TChArr;
procedure Decode(s:string);
var i:byte;
begin
for i:=1 to Length(s) do
Ds[i]:=255-s[i];
end;
однозначно - шифрованный пароль
Ну-ну... %)
как это вас спасет?
Единственный нормальный способ - ключи реестра:
копируешь прогу, а она требует запись в реестре, извлекаешь из реестра этот ключ, а там ссылка на другой ключ реестра и так далее...
Плюсы:
1.1. Если на исходном компе нельзя запустить RegMon и количество попыток копирования ограничено - то защита работает.
1.2. Для легальной защиты ключа нужен отдельный инсталлер, создающий нужные ключи - идеальный вариант самораспаковывающийся архив WinRAR (WinZIP) дёшево и сердито...
Минусы:
2.1. Для того, чтобы защита реально работала необходимо чтобы в последнем ключе реестра находилась либо часть кода проги либо пароль (или хеш) от предварительно зашифрованной части кода проги (достаточно надежным алгоритмом) либо в этом ключе д.быть процедура расшифвовки.
2.2. Зашифрованная/скрытая часть кода должна быть действительно ВАЖНОЙ, иначе крэкер просто подберет ее эквивалент.
2.3. Из п.2.2. следует, что защита может быть встоена в прогу только после ее компиляции, что усложняет отладку. например: откомпилировать - найти_в_EXE_нужный_кусок - скопировать_его_в_REG - забить_кусок_в_EXE_нулями - запустить_прогу.
Примечания
3.1. Реестр удобнее файлов т.к. файлы надо раскидывать по всему диску, а в реестре можно создать сколько угодно левых ключей
3.2. В Win_NT (2k,XP,2003) файл реестра защищен от копирования (вместе с sam файлом)
3.3. В реестре(или на диске) можно разместить небольшую dll со всем важным кодом
3.4. Информация должна храниться в одном экземпляре.
Выводы:
4.1. пишем отдельную dll миним. размера
4.2. преобразуем ее в текстовый HEX формат: A1 5F 7E 12 00 FF ... и помещаем в reg файл
4.3. в основной проге пишем модуль с разделом инициализации в котором:
4.3.1 загружаем ключ A со значениями f:bool , x:reg_sz y:bin
4.3.2 если f=true то x:reg_sz содержит следующий ключ, goto 4.3.1
4.3.3 создаем файл с именем хр. в x:reg_sz посл. ключа c атр. доступа, запрещ. копирование
4.3.4 пишем туда содержимое ключа, закрываем файл
4.3.5 загружаем dll
4.4. в разделе финализации удаляем dll
4.5. работаем...
Предлагаю все-таки сделать файл с паролем, а программа чтобы при запуске проверяла наличие файла и если его нет, то выводила бы сообщение: "Чайник, надо было два файла скопировать!" :-)
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.