Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  08:46[Войти] | [Зарегистрироваться]
Ответ на вопрос № 41175

29-03-2006 05:39
Добрый день! У меня такая проблема, надо установить пароль при запуске моей программы. Проблемы в том что прога состоит из одного файла и будет переноситься с компа на комп поэтому пороль должен хранится в самом ЕХЕ файле и плюс должна быть возможность его изменить. Как можно сделать запись в саму прогу когда она уже откомпилирована и уже в виде ЕХЕ файла? Может есть возможность зашить в неё например техтовый файл с которым и работать и хранить и изменять пороль? Помогите если кто знает!

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

30-05-2006 14:33
>>> Есть программа тестирования знаний ПДД
Применяю социальную инженерию: спрашиваю у людей, кто уже пытался ЭТО сделать (сломать прогу) скопированную часть, изучаю, смотрю, какой файл/ключ реестра/еще чего требуется. Если есть, скажем, защита с использованием какой-нибудь информации о системе, вроде запроса серийного номера винчестера, я напишу программу, которая честно утянет информацию с того компьютера, а у себя дома это эмулирую (имеется в виду. что между попытками у меня по меньшей мере неделя, потому что я бы так быстро не успел, хотя на cracklab уверяют, что такая защита ломается самое большее за 15 минут).
Вывод: социальная инженерия приходит на помощь всегда (ну или практически всегда), люди - самая дырявая часть любой защиты (невольно приходишь к идее фильма Терминатор).

31-03-2006 10:52
Комментарий в двух частях с эпиграфом и приложением.


все равно любой ключ
найти можно
хоть как не старайся !!!

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) была бы программа, а взломщик найдется.

31-03-2006 02:37
GoldFinch
например Офис XP лицензионный продукт сломали
ответ !!! может дописать каждый
хотя трудится там очень много умов

31-03-2006 02:27
GoldFinch
А разве описано что мы пишем систему защиты для банка или для обычного пользователя
можно и через pgp шифрование и компрессию ключа потом сделать
но все равно любой ключ найти можно хоть как не старайся !!!

30-03-2006 09:41 | Комментарий к предыдущим ответам
2 GoldFinch:
Принципы защиты нормальных коммерческих продуктов всем ясны и понятны. Эту тему мусолят уже давно. Но здесь-то это просто защита от тупых (уж извините, но есть) юзверей. Хотите сказать, что эти товарищи будут ставить отладчик, ставить бряки, нопить... Сомневаюсь, сильно. ИМХО. Автор вроде бы дал это понять... Кстати, автор, вопрос решен, или этот вопрос можно переносить на БП с обсуждением, как стоит и как не стоит осуществлять защиту...

30-03-2006 08:45
Увидел строчки:

aNewParol := frmDlg.eValuePassword.Text;
    if aNewParol = constParol then begin


Сравнение строк??!!!!!!
Чуть со стула не упал..)))
Ржунемогу...
Если вкратце... есть такая штука... ОТЛАДЧИК!!! и там constParol ну как на ладони...

Увидел ышшо:

ShowMessage('Внимание! Файл с паролем пытались исправить, для защиты возвращаем исходный пароль');
  constParol := 'password';


Т.е. правильный пароль уже зашит в прогу... Есть такое понятие: "закрытая криптосистема"... кто знает тот понял.

И зачем я это пишу?.. Чем больше таких защит будет, тем мне жить легче...

30-03-2006 08:24
Добавлю свои "пять копеек":

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" файл который можно стереть при следующем запуске или при выходе из программы через батничек (как именно, ни раз обсуждалось).


30-03-2006 03:03
а с реестром тоже проблема решаемая
храним в процедуре и добавляем ветку
только одна проблема разные версии windows могут быть на машинах

30-03-2006 02:50 | Комментарий к предыдущим ответам
Зачем все услажнять можно и просто на открытие формы поставить пароль это уже описывалось

30-03-2006 02:44
плюс в этом примере код пользователя программы хранится в файле password в зашифрованном виде
а exe файл легко переносится на другой комп с зашифрованниом паролем в самом файле его можно поставить какой угодно

30-03-2006 02:39
вот решение проблемы !!!!
//создание пароля
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;
все эти процедуры храят исходный код в самой программе плюс пользователь может сам изменять пароль приятного пользования

30-03-2006 01:44
> С реестром не выдет поскольку при переносе с компа на комп
> (пользователь на флешке может понести её домой)
> произойдёт обращение к ключe в реестре которого не существует

правильно, и программа ему скажет: введи правильный пароль!
а в пароле долна быть зашита информация о компьютере, на котором может запуститься программа (например, номер раздела HDD), и если этот номер из пароля не совпадет с номером HDD, на котором запустилась программа, то это - нелицензированный пользователь

30-03-2006 00:45
GoldFinch К чему сводится работа с файлом - к операциям над его хэндлом, правда? Почему нельзя обычными средствами работать с занятым файлом - потому что система тебе не отдаст его хэндл по createfile. Но createfile есть не что иное как получение хэндла. Больше скажу, не обязательно лазить в ринг-0, хэндл утянуть можно и в юзермоде

30-03-2006 00:32
2 SLoW
под ДОСью с НТФС
На нормально защищенном компе загрузка должна происходить только с винча, а ещё хорошо когда дисковода вообще нету...
даже под окощками можно скопировать эти файлы
Как??? Выходом в  нулевое кольцо и прямым обращением к диску???
Если знаете другой метод расскажите...


Если хочется писать в exe то лучше работать с ресурсами, только мне не очень понятно: что означает "хранить пароль в файле"???
ИМХО участники обсуждения, являясь только программерами не очень понимают как ломаются проги... и вообще не разбираются в защите информации...


29-03-2006 23:16
Короче, предлагаю такой вариант:
1. Объявить в проге глобальную константу длиной в 16 байт для хранения MD5-хеша.
2. Найти на этом сайте статью о записи в свой ЕХЕ-файл.
3. Найти в тырнете алгоритм вычисления MD5-хешей.

Пожалуй, это всё.

29-03-2006 12:48
GoldFinch

3.2 :-)) Я плакал ... Неужели Вы так думаете? Конечно, нет. Как минимум, под ДОСью с НТФС драйверами можно скопировать и изменять все что угодно. Но более того, даже под окощками можно скопировать эти файлы :-) не скажу как, но можно

29-03-2006 12:21 | Комментарий к предыдущим ответам
Либо можете сделать еще так:
В проге сделать таблицу паролей, и запрашивать нужный в зависимости от, скажем, названия ехе:)) Они наверное, не догадаются переименовывать:))

29-03-2006 12:17 | Вопрос к автору: запрос дополнительной информации
а пароль-то зачем?:) что в ней такого важного? я это к тому, что стоит ли овчинка выделки? И потом, запись в самого себя - не есть гуд, у меня как то антивирусник на простое переименование ехе ругаться начал:))

29-03-2006 12:03 | Сообщение от автора вопроса
С реестром не выдет поскольку при переносе с компа на комп (пользователь на флешке может понести её домой) произойдёт обращение к ключe в реестре которого не существует:( Пfроль должен быть зашит в ЕХЕ фаил и при этом была возможность его поменять то есть производить перезапись в ЕХЕ без нарушения его работы. Программа мобильная и никаких фаилов с ней не должно быть поскольку пользователи очень низкого уровня и ОБЯЗАТЕЛЬНО полезет в файл (не от большого ума).

29-03-2006 11:41
to GoldFinch:

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

Проще надо быть :-)

29-03-2006 11:39
Была подобная проблема,
Решил её так:
Создал в реестре ключ, с нелепым названием, к примеру,
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;



далее пишем в реестр значение DS как бинарное.

29-03-2006 08:56
однозначно - шифрованный пароль
Ну-ну... %)
как это вас спасет?
Единственный нормальный способ - ключи реестра:
копируешь прогу, а она требует запись в реестре, извлекаешь из реестра этот ключ, а там ссылка на другой ключ реестра и так далее...

Плюсы:
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. работаем...

29-03-2006 08:37
привет
однозначно - шифрованный пароль в отдельном файле или в реестре

29-03-2006 06:09
Предлагаю все-таки сделать файл с паролем, а программа чтобы при запуске проверяла наличие файла и если его нет, то выводила бы сообщение: "Чайник, надо было два файла скопировать!" :-)

29-03-2006 06:05
Попробуйте поместить в resourcestring - можно будет поменять, но как это вас спасет?

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жили у бабуси два веселых гуся. Один белый, другой КАКОЙ?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования