Привязка программы к компьютеру

Lokhmati
12/3/2006, 7:04:21 PM
Товарищи! Использую код для привязки к дате создания BIOS материнской платы:
CODE
Type BIOS_DATE
     s As String * 8
  End Type

  Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" _
          (pDest As Any, pSource As Any, ByVal ByteLen As Long)

  Public Function BIOS() As Long
     Dim sDB As BIOS_DATE

     CopyMemory sDB, ByVal &HFFFF5, 8&
     BIOS = DateSerial(Mid(sDB.s, 7, 2), Mid(sDB.s, 1, 2), Mid(sDB.s, 4, 2))
  End Function


При запуске приложения под Win98 все определяется. Под WinXP – ошибка приложения. Что тут не так? Прошу помощи!
adia
12/4/2006, 1:13:39 AM
В ХР не получится. Доступ к таким адресам из программ в ХР (2000+) невозможен.
Во тут показано как узнать дату БИОСа из реестра, хоть это и не надежно. Правда на Паскале, но разобраться можно

Если не секрет, зачем это?
Lokhmati
12/4/2006, 2:16:00 AM
Дело в том, что одну мою программулину хотят приобрести. Следовательно хочу создать привязку только к машине покупателя. Вот и все. :)
kiskus
12/4/2006, 4:35:41 PM
Не лучше ли привязатся к серийному номеру тома где будет инсталирована программа.
Lokhmati
12/5/2006, 1:09:50 AM
Тоже вариант. Спасибо!
adia
12/6/2006, 2:56:51 AM
(kiskus @ 04.12.2006 - время: 13:35) Не лучше ли привязатся к серийному номеру тома где будет инсталирована программа.
Это варварство. Я сталкивался с такими. И не понимаю, почему, если я купил программу, я не могу установить ее на другой комп, если, скажем, сдох винт или сам комп?
AngeLR
12/6/2006, 11:15:34 AM
любая защита приносит неудобства... и не дает гарантии взлома... ни когда не видел смысла в этом... если очень надо будет - словают или обойдут.
kiskus
12/6/2006, 12:54:30 PM
(adia @ 05.12.2006 - время: 23:56) (kiskus @ 04.12.2006 - время: 13:35) Не лучше ли привязатся к серийному номеру тома где будет инсталирована программа.
Это варварство. Я сталкивался с такими. И не понимаю, почему, если я купил программу, я не могу установить ее на другой комп, если, скажем, сдох винт или сам комп?
Если Вы купили программу у производителя, то как правило, у Вас доллжен быть дистрибутив приложения
и в случае поломки жесткого диска устанавливаете и пользуетесь дальше.
Если у Вас "свистнули" или напрямую стянули ,что не редкость, программу
с компьютера, то для того чтобы приложение не запускалось делают "привязку" к железу заказчика. Некоторые заказчики специально оговаривают данный момент.
И маленькое замечание - купил диск с программой ,программами, и
купил программу. Это не одно и то же. При продаже программы производитель
или программист, в зависимости от договора с заказчиком, обеспечивает
"поддержку" программы , те помогает в установке,настройке и обучении персонала, а также в устранении скрытых ошибок приложения если таковые имеются.
Программирование труд, и далеко не самый лёгкий как может показатся. ИМХО
shworker
12/7/2006, 2:41:38 AM
Есть еще один метод - не самый красивый с точки зрения распространения, но зато действенный.
Писал как-то программу для организации - надо было вбивать данные в базу и выводить печатные формы.
Так вот, я намертво закодировал название организации в код.
Для тех, кто стырит программу (случаи были) взлом просто не имеет смысла, так как на всех выходных документах печатается другое название.
Для усиления защиты (а вдруг кто-то догадается ) предусмотрено шифрование.
Еще вариант - защита при помощи Flash USB Stick.
Можно держать на флешке скрытый раздел, который не виден винде.
И в нем - серийник, название организации и ее реквизиты, и тд.
Так как флешка только читается - работает достаточно надежно.
DELETED
12/7/2006, 1:32:47 PM
Если человек пишет на VB прикладные программы, то понятно, какой уровень там у пользователей. И привязать к тому или BIOS'у будет вполне достаточно.
Lokhmati
12/8/2006, 12:59:05 AM
Если человек пишет на VB прикладные программы, то понятно, какой уровень там у пользователей. И привязать к тому или BIOS'у будет вполне достаточно.
Пишу для самого обычного ПТУ. Решил не парить остатки мозга и пишу на VB. Достаточно простой, если не тривиальной, защиты. Просто было уже такое, когда мои проги расходились по друзьям, знакомым, родственникам и т. д. Вот и хочу защититься. Понимаю, что кому надо - взломает. А тот, кому я продаю 100% не сломает.
adia
12/9/2006, 3:32:16 AM
(kiskus @ 06.12.2006 - время: 09:54)
Если Вы купили программу у производителя, то как правило, у Вас доллжен быть дистрибутив приложения
и в случае поломки жесткого диска устанавливаете и пользуетесь дальше.
Если у Вас "свистнули" или напрямую стянули ,что не редкость, программу
с компьютера, то для того чтобы приложение не запускалось делают "привязку" к железу заказчика. Некоторые заказчики специально оговаривают данный момент.

Ну в этом случае есть более простой вариант. При установке Setup прописывает в реестр какие-то значения, связанные с этой программой. Без этих записей программа просто не работает или работает в ограниченном демонстрационном режиме. Если ее тырить прямо с компа, то только вместе с реестром )). Ну а если диск уведут вместе с setup, то тут уж ничего не поделаешь.
Lokhmati
12/11/2006, 12:50:01 PM
Уж думал об этом. И передумал smile.gif
Всем спасибо! Остановлюсь на привязке к дате BIOS'а
himor
4/22/2007, 5:11:36 AM
Самый реальный вариант которым лично я пользовался - это привязка к серийному номеру тома где устанавливается программа. Но не думаю, что сейчас это актуально. Намного удобнее иметь USB ключ - недорогую флешку небольшого размера с ключевым файлом на ней. При выборе правильного метода шифрования получится довольно интересное решение.
DELETED
4/22/2007, 5:37:30 PM
(himor @ 22.04.2007 - время: 01:11) Самый реальный вариант которым лично я пользовался - это привязка к серийному номеру тома где устанавливается программа.
Lokhmati правельно сказал про свой необходимый уровень. :) Cерийный номер тома меняется на ура. Можно привязать к связке MAC-HDD-BIOS-REGISTRY-XP (...) но таки все это фигня. Не катит. :) Единственный нормальный способ - привязать к аппаратному ключу.

Кстати, можно сделать нулевой драйвер, дистрибутив никому не давать и спрашивать про валидность через поимённые трубы. :) Напесать? wink.gif
DELETED
4/22/2007, 6:13:20 PM
Блин, чего только не сделаешь... Лишь бы не работать.

Драйвер:
CODE
#include <ddk/ntddk.h>

#include "stdarg.h"
#include "stdio.h"

#pragma once

#define IOCTL_BITCH_UP                 CTL_CODE(IOCTL_UNKNOWN_BASE, 0x0800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define DRIVER_NAME                     L"bitchUp"

// Forward declarations
void        UnloadDriver( PDRIVER_OBJECT DriverObject );
NTSTATUS    DispatchCreateClose( PDEVICE_OBJECT DeviceObject, PIRP Irp );
NTSTATUS    DispatchIoctl ( PDEVICE_OBJECT DeviceObject,  PIRP Irp );


// The main entry point of the driver module
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) {
   NTSTATUS                  ntStatus;
   UNICODE_STRING            uszDriverString;
   UNICODE_STRING            uszDeviceString;
   PDEVICE_OBJECT            pDeviceObject;

   // Point uszDriverString at the driver name
   RtlInitUnicodeString(&uszDriverString, L"\\Device\\"DRIVER_NAME);
   // Create and initialize device object
   ntStatus = IoCreateDevice( DriverObject, sizeof(DEVICE_EXTENSION), &uszDriverString, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDeviceObject );
   if(ntStatus != STATUS_SUCCESS)
       return ntStatus;

   // Point uszDeviceString at the device name
   RtlInitUnicodeString(&uszDeviceString, L"\\DosDevices\\"DRIVER_NAME);

   // Create symbolic link to the user-visible name
   ntStatus = IoCreateSymbolicLink(&uszDeviceString, &uszDriverString);

   if(ntStatus != STATUS_SUCCESS) {
       // Delete device object if not successful
       IoDeleteDevice(pDeviceObject);
       return ntStatus;
   }

   // Load structure to point to IRP handlers
   DriverObject->DriverUnload                         = UnloadDriver;
   DriverObject->MajorFunction[IRP_MJ_CREATE]         = DispatchCreateClose;
   DriverObject->MajorFunction[IRP_MJ_CLOSE]          = DispatchCreateClose;
   DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;

// Return success
   return ntStatus;
}

// Create and close routine
NTSTATUS DispatchCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) {
   Irp->IoStatus.Status      = STATUS_SUCCESS;
   Irp->IoStatus.Information = 0;
   IoCompleteRequest(Irp, IO_NO_INCREMENT);
   return STATUS_SUCCESS;
}

// The dispatch routine
NTSTATUS DispatchIoctl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) {
   Irp->IoStatus.Status      = STATUS_SUCCESS;
   Irp->IoStatus.Information = 0;
   IoCompleteRequest(Irp, IO_NO_INCREMENT);
   return STATUS_SUCCESS;
}

// Driver unload routine
void UnloadDriver ( IN PDRIVER_OBJECT DriverObject ) {
   UNICODE_STRING  uszDeviceString;

   //  By default the I/O device is configured incorrectly or the
   //  configuration parameters to the driver are incorrect.
   NTSTATUS        ntStatus = STATUS_DEVICE_CONFIGURATION_ERROR;

   IoDeleteDevice(DriverObject->DeviceObject);

   RtlInitUnicodeString(&uszDeviceString, L"\\DosDevices\\"DRIVER_NAME);
   IoDeleteSymbolicLink(&uszDeviceString);
}


Пользовательское приложение:
CODE
               // Open driver
               if ( ( HANDLE hBitchUpGuardian = ::CreateFile ( TEXT("\\\\.\\"DRIVER_NAME), GENERIC_READ | GENERIC_WRITE,  FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0 ) ) != INVALID_HANDLE_VALUE ) {
                               CloseHandle ( hBitchUpGuardian )
               } else {
                               // fuck'em all! there is no guardian
               }
maxdiversexnarod1
4/22/2007, 10:49:10 PM
Позволю заметить, что толку от такой защиты не намного больше, чем от, скажем, привязки к BIOS'у. Если программа не запакована, то строка вида \\.\ЧТО-ТО будет заметно выделяться среди всех строк экзешника. Тыкаем по перекрёстной ссылке, видим CreateFile...
Даже если строки не будет в чистом виде в экзешнике, то когда дело дойдет до отладчика, трюк быстро обнаружится. Смотрим, при каких условиях на экране появляется окно, посылающее нас на, и добираемся до условного перехода на функции CreateFile. Многие даже не станут задумываться, и исправят условный переход на обратный - и все дела :)
Если же хорошенько запутать защитный код или запаковать файл крутым протектором, то тогда уже станет не важно, какая защита применена: одинаково хорошо будет действовать и проверка номера BIOS'а, и поиск драйвера.

В общем, мораль такова: или писать тупую защиту, которая остановит только ламеров, или делать навороченную защиту, которая обойдется в десятки бессонных ночей, и всё равно будет рано или поздно взломана.

P.S. USB-ключ - это вообще отстойный метод. Что мы имеем для пользователей? Кучу гимора с покупкой и применением проги. Что имеем для взломщиков? Во-первых, не надо искать метод защиты - он и так известен :) Во-вторых, пишем драйвер, эмулирующий USB-устройство - и кранты защите. Не говоря уже о том, что многие пишут так:
... ...
... КУЧА навороченного защитного кода - чтение скрытых файлов с USB, вычисление MD5-хэшей ...
... ...
if ( ! ok )
{
MessageBox (0, "У вас незарегистрированная версия!!!", "", 0);
ExitProcess (0);
}
В общем, без комментариев :)
DELETED
4/23/2007, 12:34:41 AM
Зато импорт функций не будет вызывать подозрений. 6) И имя пипы может быть само по себе абстрактным.

А так согласен. Полностью.
maxdiversexnarod1
4/23/2007, 3:42:08 AM
Зато импорт функций не будет вызывать подозрений
Так-то оно так, да вот только достаточно проследить за вызовами функции CreateFile в API-мониторе, и трюк вскроется :) Тем более что первый шаг при взломе (по крайней мере, у меня) - изучение того, какие файлы программа пытается открыть. И в этом списке "белой вороной" будет смотреться запись \\.\ЧТО-ТО.
Если даже и использовать этот метод, то тогда юзать нативные API: ZwCreateFile, а лучше напрямую вызов SYSENTER.

Впрочем, я бы всё равно не выбрал мы метод с драйвером. Всё-таки достаточно сравнить списки файлов до установки и после установки, и тогда легко запалить появление нового драйвера (собственно, сравнение списков файлов и должно быть первым шагом во взломе, просто я всегда забываю сделать снимок системы перед инсталляцией :)
DELETED
4/23/2007, 2:25:25 PM
Этот метод для ламеров. Все обсуждаемые тут вопросы не имеют отношения к нормальной защите. Обычный пользователь драйвер не найдет. В списке процессов его нет, установка скрыта и т.д. Впрочем, так же он не найдет привязку к тому, BIOS, etc.