Форум » [x]Harbour » Простая программа защиты от нелегального копирования exe-файла » Ответить

Простая программа защиты от нелегального копирования exe-файла

sergey5703: Конечно, самая лучшая защита - электронный ключ, но он стоит денег. Предлагаемая программа защиты основана на записи уникальной информации о компьютере, на который программа инсталлируется, внутрь exe-файла и проверке этой информации при запуске защищаемой программы. Если программа будет несанкционированно перенесена на другой компьютер, то потребуется переинсталляция, иначе программа работать не будет. // Защищаемая программа #include "windows.ch" #include "guilib.ch" STATIC Message := "Копия программы - нелегальная! " PROCEDURE Main LOCAL oMainWindow INIT WINDOW oMainWindow MAIN TITLE "Защищаемая программа"; COLOR COLOR_3DLIGHT + 1 AT 0, 0 SIZE 320, 200; ON INIT {|x|LegalUse(x)} CENTER WINDOW oMainWindow ACTIVATE WINDOW oMainWindow RETURN PROCEDURE LegalUse(x) IF RIGHT(Message, 9) != SPACE(9) IF HDSerial("C:\") != RIGHT(Message, 9) MsgInfo(LEFT(Message, 30), x:Title) x:Close() ENDIF ENDIF RETURN // Программа инсталляции #include "windows.ch" #include "guilib.ch" #include "fileio.ch" #define BUFF_SIZE 8192 STATIC Message := "Копия программы - нелегальная!" PROCEDURE Main(cFile) BEGIN SEQUENCE IF PCOUNT() < 1 MsgInfo("Не задан параметр", "Установка"); BREAK ENDIF IF !FILE(cFile) MsgInfo("Файл " + cFile + " не найден", "Установка"); BREAK ENDIF Install(cFile) END SEQUENCE RETURN PROCEDURE Install(cFile) LOCAL fHandle, i, j, bytes_read, buff1 := SPACE(BUFF_SIZE) LOCAL err, buff2 := "", lFound := .F., curp := 0, curp2 := 0 BEGIN SEQUENCE fHandle := FOPEN(cFile, FO_READWRITE + FO_SHARED) IF fHandle == F_ERROR MsgInfo("Ошибка открытия " + ALLTRIM(STR(FERROR())) + " файла " + cFile, "Установка") BREAK ENDIF FOR i := 0 TO File_Size(fHandle) STEP BUFF_SIZE curp := File_Pos(fHandle); bytes_read := FREAD(fHandle, @buff1, BUFF_SIZE) IF (err := FERROR()) <> 0 FCLOSE(fHandle) MsgInfo("Ошибка чтения " + LTRIM(STR(err)) + " файла " + cFile, "Установка") BREAK ENDIF IF (j := AT(Message, buff2 + LEFT(buff1, bytes_read))) > 0 IF j > LEN(buff2) curp := curp + ((j - LEN(buff2)) - 1) ELSE curp := curp2 + (j - 1) ENDIF curp += (LEN(Message) + 1) FSEEK(fHandle, curp, FS_SET); FWRITE(fHandle, HDSerial("C:\"), 9) lFound := .T.; EXIT ELSE buff2 := LEFT(buff1, bytes_read); curp2 := curp ENDIF NEXT FCLOSE(fHandle) IF lFound MsgInfo("Файл " + cFile + " установлен", "Установка") ELSE MsgInfo("Файл " + cFile + " не может быть установлен", "Установка") ENDIF END SEQUENCE RETURN FUNCTION File_Pos(fHandle) RETURN (FSEEK(fHandle, 0, FS_RELATIVE)) FUNCTION File_Size(fHandle) LOCAL nCurrent, nLength nCurrent := File_Pos(fHandle) nLength := FSEEK(fHandle, 0, FS_END) FSEEK(fHandle, nCurrent) RETURN (nLength) Файлы в архиве

Ответов - 14

Andrey: Не собирается !!! Какая версия хХарбора и HWGUI - нужны ? Compiling 'TEST.prg'... Lines 26, Functions/Procedures 2 Generating C source output to 'TEST.c'... Done. Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland TEST.c: Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: Unresolved external '_HB_FUN_HB_NUMTOHEX' referenced from Z:\HWGUI\LIB\HWGUI.LIB|richtext

Andrey: Почему в архиве Protect.rar, rc-файлы пустые ?

Andrey: sergey5703 пишет: основана на записи уникальной информации о компьютере, на который программа инсталлируется Я вижу только одну функцию HDSerial("C:\") и то с привязкой к библиотеке HWGUI .... А без этой библиотеки можно в хХарборе получить такую же функцию ?


sergey5703: Версия xHarbour version 1.2.1 Intl. (SimpLex) (Rev. 6658), версия HwGUI 2.16. Это у меня такие версии, с которыми запускается. А функция NUMTOHEX есть в ЛЮБОМ xHarbour-е (библиотека rtl.lib). Похоже Вы используете HARBOUR, а не XHARBOUR. Потому что функции _HB_FUN_HB_NUMTOHEX в xHarbour-е НЕТ, а есть функция _HB_FUN_NUMTOHEX. C:\MY\Protect>MAKE_GUI.BAT TEST xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6633) Copyright 1999-2010, http://www.xharbour.org http://www.harbour-project.org/ Compiling 'TEST.prg'... Lines 26, Functions/Procedures 2 Generating C source output to 'TEST.c'... Done. Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland TEST.c: Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

sergey5703: Просто нет ресурсов у приложения.

sergey5703: GetVolumeInformation - функция Win32 API. unsigned long Get_SerialNumber(char* RootPathName) { unsigned long SerialNumber; GetVolumeInformation(RootPathName, NULL, 0, &SerialNumber, NULL, NULL, NULL, 0); return SerialNumber; } HB_FUNC( HDGETSERIAL ) { hb_retnl( Get_SerialNumber(hb_parc(1)) ); } FUNCTION HdSerial( cDrive ) Local n := HDGETSERIAL( cDrive ) Local cHex := NUMTOHEX(n) Local cResult := "" cResult := Substr( cHex,1, 4 ) + '-' + Substr( cHex,5, 4 ) return cResult

Andrey: sergey5703 пишет: GetVolumeInformation - функция Win32 API. А как оформить все это чтоб под хХарбором работало ? Я знаю что нужно: #PRAGMA ..... #ENDPRAGMA А какие инклуды вставлять нужно ?

sergey5703: Так оно и работает под xHarbour-ом. Исходные тексты в HwGUI\Source. А #pragma BEGINDUMP/ENDDUMP должны быть В КОНЦЕ программы. Вот примерная программа: ? HDSerial("C:\") ? FUNCTION HdSerial( cDrive ) Local cHex := NUMTOHEX(HDGETSERIAL( cDrive )) return (Substr( cHex,1, 4 ) + '-' + Substr( cHex,5, 4 )) #pragma BEGINDUMP #include <windows.h> #include "hbdefs.h" #include "hbapi.h" unsigned long Get_SerialNumber(char* RootPathName) { unsigned long SerialNumber; GetVolumeInformation(RootPathName, NULL, 0, &SerialNumber, NULL, NULL, NULL, 0); return SerialNumber; } HB_FUNC( HDGETSERIAL ) { hb_retnl( Get_SerialNumber(hb_parc(1)) ); } #pragma ENDDUMP Вот make.bat: @echo off SET PATH=c:\BCC55\BIN;c:\XHARBOUR\BIN SET INCLUDE=c:\BCC55\INCLUDE;c:\XHARBOUR\INCLUDE SET LIB=c:\BCC55\LIB;c:\BCC55\LIB\PSDK;c:\XHARBOUR\LIB set HB_BIN_INSTALL=c:\xharbour\bin set HB_LIB_INSTALL=c:\xharbour\lib\ set HB_INC_INSTALL=c:\xharbour\include\ %HB_BIN_INSTALL%\harbour.exe %1.prg %2 -w -gc0 -i%HB_INC_INSTALL% bcc32.exe -O2 -d -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% %1.c vm.lib rtl.lib gtwin.lib lang.lib rdd.lib dbffpt.lib hbsix.lib macro.lib pp.lib dbfntx.lib dbfcdx.lib pcrepos.lib common.lib codepage.lib ct.lib Вот консольный вывод: C:\3>MAKE.BAT test xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6633) Copyright 1999-2010, http://www.xharbour.org http://www.harbour-project.org/ Compiling 'test.prg'... Lines 7, Functions/Procedures 2 Generating C source output to 'test.c'... Done. Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland test.c: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland C:\3>test.exe 3D4E-1A0E

Vlad04: А при работе в сети? Ехе расположен на сервере с базой. Запуск с рабочих машин. Сетевой диск и его характеристики будут определяться?

sergey5703: Для сети, если exe-файл запускается с сервера, это решение не годится, так как для всех рабочих станций будет запускаться один exe-файл. Вообще сразу, как заходит речь об сетевых решениях, ВСЕ программистские проблемы сразу увеличиваются на порядок (раз в десять) - это я по собственному опыту ориентируюсь!

Лукашевский: А кто мешает запускать exe-файл не с сервера, а с рабочей станции? А путь к серверным базам указывать в "Командной строке" ярлыка после имени exe-файла. У меня например так и делается, и защита прекрасно работает. Да, при необходимости перестановки программы (исправление ошибок и т.п.) работы на [число рабочих станций] больше, но зато программа защищена!

Vlad04: Ничто не мешает. Так обновлять проще- если все на сервере лежит. В одном месте заменил и все довольны. Я делал вообще просто. Кидаешь в вин папку (там много всякого хлама) файл с произвольным именем и содержанием.Программа при запуске проверяет наличие этого файла - НЕТ его , значит нельзя работать.

Dima: Vlad04 пишет: Так обновлять проще- если все на сервере лежит Тоже примерно так делаю. EXE лежит на серваке. На рабочих станциях в autoexec.bat (NT) прописываю переменную среды и указываю папку куда смотреть. Типа Set blabla=c:\set (папка может быть любая , это просто пример) В программе считываю эту переменную среды и проверяю папку на которую она указывает. В папке лежит файлик с кодом привязки к конкретной машине (вяжу к дате Bios и номеру диска) Если прога не находит файл - ключ , вываливается табличка с условным номером компа , в ответ на который нужно ввести код ответа. Если файл-ключ найден но код в нем не верный , значит или железо меняли или прогу украли или винт форматнули , в этом случае прога уходит в бесконечный цикл , ну а далее разбираюсь в каждом случае отдельно.

Eduard: Попробовал я скомпилирвать данные примеры, что-то не могу понять, после записи в файл, программа перестает запускаться, посылает к билу... или я что-то не то делаю??? Application Internal Error - F:\test\test.exe Terminated at: 2013.09.07 20:35:12 Unrecoverable error 9002: No ERRORBLOCK() for error Called from (_INITSTATICS00001)(0) in test.prg У кого нибудь сохранились исходники в архиве, а то ссылка битая



полная версия страницы