Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2011, 22:31   #1
Tuman777
Пользователь
 
Регистрация: 10.07.2011
Сообщений: 37
По умолчанию Ограничить количество запуска программы

Доброго времени суток, Уважаемые Программисты.
Хочу сделать пробную версию своей программы, т.е. чтобы после 3 запуска она не работала. Подскажите как это воплатить в жизнь.
Заранее спасибо
Tuman777 вне форума Ответить с цитированием
Старый 12.10.2011, 08:36   #2
roperd
Пользователь
 
Регистрация: 14.07.2011
Сообщений: 44
По умолчанию

Есть у меня некоторые нароботки по этому поводу, код рабочий, проверено на Delphi 2007, можно создать переменную типа integer и записать в неё количество возможных запусков, затем в Ini файле или в реестре считывать (при создании формы) и выводить(при закрытии) её значения каждый раз отнимая по единице:
Код:
public
    { Public declarations }
    Ini: TIniFile;
  end;

var
  Form1: TForm1;
  I: integer;
  windir: String;
  Buffer: array [0..255] of char;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
GetWindowsDirectory(Buffer, Sizeof(Buffer));
windir := Buffer;
I:=3;
Ini:=TIniFile.Create(windir + '/Trial Programm.ini');
I:=Ini.ReadInteger('Trial','Trial count',I);
If I = 0 then
Application.Terminate;
Ini.Destroy;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
If I = 0 then exit;
I:=I - 1;
Ini:=TIniFile.Create(windir + '/Trial Programm.ini');
Ini.WriteInteger('Trial','Trial count',I);
Ini.Free;
end;
end.

Последний раз редактировалось roperd; 13.10.2011 в 07:05.
roperd вне форума Ответить с цитированием
Старый 12.10.2011, 09:30   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
затем в Ini файле или в реесте считывать (при создании формы) и выводить(при закрытии) её значения каждый раз отнимая по единице
ну, это несерьёзно! Это не то, что хакер, любой маломальски продвинутый юзер сможет "сломать"!

Если нужно более-менее сложная защита - посмотрите в сторону навесных протекторов (ну, например, ASPack). Среди прочих возможностей там есть и ограничение количества запусков.

Ну и ещё учтите, что ограничение количества запусков это достаточно уязвимая часть триальной защиты! Потому как Вам при каждом запуске нужно где-то обновлять информацию. Достаточно найти это (с помощью FileMonitor и RegMonitor), сохранить и восстанавливать состояние перед очередным запуском.

ну и помните, что
"всё, что один человек сделал, другой завсегда сломать может!" (с) кузнец из фильма "Формула любви".

вопрос только в необходимости взлома (см. анекдот про Неуловимого Джо), квалификации хакера и затрат (как времени и сил, так и финансовых)...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.10.2011, 12:46   #4
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Цитата:
чтобы после 3 запуска она не работала
После третьего раза удаляйте программу...
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 12.10.2011, 20:26   #5
Tuman777
Пользователь
 
Регистрация: 10.07.2011
Сообщений: 37
По умолчанию

Спасибо roperd попробую, если что отпишусь

Serge_Bliznykov, а что такое ASPack?
Tuman777 вне форума Ответить с цитированием
Старый 12.10.2011, 21:34   #6
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Tuman777 Посмотреть сообщение
Спасибо roperd попробую, если что отпишусь

Serge_Bliznykov, а что такое ASPack?
ASPack — программа для сжатия исполняемых файлов для Windows, имеет внутренний архиватор, который по заявлению разработчиков сжимает выше стандарта ZIP на 10-20 %
Материал из Википедии — свободной энциклопедии
Shouldercannon вне форума Ответить с цитированием
Старый 12.10.2011, 22:04   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Shouldercannon
ASPack — программа для сжатия исполняемых файлов для Windows
угу. всё так.

Только ASPack не является протектором. Простите, я чуток опечатался (оговорился).
Разумеется, я имел в виду программу ASProtect (она платная, но можете взять триальную, начнёте свою программу продавать - купите лицензию)...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.10.2011, 09:13   #8
roperd
Пользователь
 
Регистрация: 14.07.2011
Сообщений: 44
Сообщение

Цитата:
Сообщение от Tuman777 Посмотреть сообщение
Спасибо roperd попробую, если что отпишусь
Немного обновил:
Код:
var
  Form2: TForm2;
  I: integer;
  Registry: TRegistry;
resourcestring
 RegPath = '\SOFTWARE\Microsoft\Windows\CurrentVersion\My Trial';
implementation
{$R *.dfm}
function TForm2.GetRegTrial(NameParam: String) : integer;
begin
Registry:=TRegistry.Create;
Registry.RootKey:=HKEY_CURRENT_USER;
Registry.CreateKey(RegPath);
Registry.OpenKey(RegPath, false);
I := 3;
I := Registry.ReadInteger(NameParam);
Registry.Free;
end;
procedure TForm2.WriteRegTrial(NameParam: String);
begin
Registry:=TRegistry.Create;
Registry.RootKey:=HKEY_CURRENT_USER;
Registry.CreateKey(RegPath);
Registry.OpenKey(RegPath, false);
Registry.WriteInteger(NameParam, I);
Registry.Free;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
If I = 0 then exit;
I:=I - 1;
WriteRegTrial('Trial Count');
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
GetRegTrial('Trial Count');
If I = 0 then
try
Application.MessageBox('Пробный период истёк, приобретите лицензионную версию программы!',
 'Ошибка запуска', 48);
finally
Application.Terminate;
end;
end;
end.
число запусков помещаемое в реестр можно зашифровать, md5 или ASCII шифрацией, но у меня для этого ни времени ни желания нет, так что дальше надеюсь сами разберётесь.
PS. Использовать компоненты вроде ASProtect не советую, поскольку взломают его не позже чем вариант предложенный мной, к тому же он понизит производительность программы и весомо увеличит размер exe файла.

Последний раз редактировалось roperd; 13.10.2011 в 09:16.
roperd вне форума Ответить с цитированием
Старый 13.10.2011, 14:31   #9
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Хоть чем шифруй, если экспортировать ветвь реестра и перед запуском опять импортировать, то счетчик будет как будто заморожен.
FaTaL вне форума Ответить с цитированием
Старый 13.10.2011, 14:50   #10
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

где то тут уже постил
Код:
procedure CreateWin9xProcessList(List: TstringList);
var 
  hSnapShot: THandle; 
  ProcInfo: TProcessEntry32; 
begin 
  if List = nil then Exit; 
  hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
  if (hSnapShot <> THandle(-1)) then 
  begin 
    ProcInfo.dwSize := SizeOf(ProcInfo); 
    if (Process32First(hSnapshot, ProcInfo)) then
    begin
      List.Add(ProcInfo.szExeFile); 
      while (Process32Next(hSnapShot, ProcInfo)) do 
        List.Add(ProcInfo.szExeFile); 
    end; 
    CloseHandle(hSnapShot);
  end; 
end; 

procedure CreateWinNTProcessList(List: TstringList); 
var 
  PIDArray: array [0..1023] of DWORD; 
  cb: DWORD; 
  I: Integer; 
  ProcCount: Integer; 
  hMod: HMODULE; 
  hProcess: THandle; 
  ModuleName: array [0..300] of Char; 
begin
  if List = nil then Exit;
  EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
  ProcCount := cb div SizeOf(DWORD);
  for I := 0 to ProcCount - 1 do 
  begin 
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
      PROCESS_VM_READ, 
      False, 
      PIDArray[I]);
    if (hProcess <> 0) then
    begin
      EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
      GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
      List.Add(ModuleName);
      CloseHandle(hProcess); 
    end;

  end;
end;

procedure GetProcessList(var List: TstringList); 
var ovi: TOSVersionInfo;
begin 
  if List = nil then Exit;
  ovi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); 
  GetVersionEx(ovi); 
  case ovi.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS: CreateWin9xProcessList(List);
    VER_PLATFORM_WIN32_NT     : CreateWinNTProcessList(List);
  end
end;

function GetExeRunCount(const FileName: string):integer;
var i     : Integer;
    fList : TstringList;
    s0,S1 : string;
begin
  result:=0;
  s0:=ExtractFileName(FileName);
  fList := TStringList.Create;
  try
    GetProcessList(fList);
    for i := 0 to fList.Count - 1 do
    begin
     s1:=ExtractFileName(Trim(fList.strings[i]));
     inc(result, byte(s1=s0));
    end;
   finally
    fList.Free;
  end;
end;
Запуск GetExeRunCount с параметром - полный путь к ЕХЕ-шнику возвращает количество запущеных копий проги в Винде.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Логирование запуска программы Dima DDM Общие вопросы Delphi 0 05.08.2011 15:48
как ограничить количество вводимых чисел пользователем? Kati Помощь студентам 4 21.10.2010 11:56
Ограничить количество клиентов SwiP Работа с сетью в Delphi 1 16.06.2010 19:17
Как ограничить количество вводимых знаков числа после запятой. proggramer Общие вопросы C/C++ 1 24.03.2010 03:15
Как ограничить срок работы программы Allegro87 Microsoft Office Access 7 26.11.2007 12:15