Привязка программы к компьютеру
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 – ошибка приложения. Что тут не так? Прошу помощи!
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.
Можно держать на флешке скрытый раздел, который не виден винде.
И в нем - серийник, название организации и ее реквизиты, и тд.
Так как флешка только читается - работает достаточно надежно.
Писал как-то программу для организации - надо было вбивать данные в базу и выводить печатные формы.
Так вот, я намертво закодировал название организации в код.
Для тех, кто стырит программу (случаи были) взлом просто не имеет смысла, так как на всех выходных документах печатается другое название.
Для усиления защиты (а вдруг кто-то догадается ) предусмотрено шифрование.
Еще вариант - защита при помощи 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% не сломает.
Пишу для самого обычного ПТУ. Решил не парить остатки мозга и пишу на VB. Достаточно простой, если не тривиальной, защиты. Просто было уже такое, когда мои проги расходились по друзьям, знакомым, родственникам и т. д. Вот и хочу защититься. Понимаю, что кому надо - взломает. А тот, кому я продаю 100% не сломает.
adia
Специалист
12/9/2006, 3:32:16 AM
(kiskus @ 06.12.2006 - время: 09:54)
Если Вы купили программу у производителя, то как правило, у Вас доллжен быть дистрибутив приложения
и в случае поломки жесткого диска устанавливаете и пользуетесь дальше.
Если у Вас "свистнули" или напрямую стянули ,что не редкость, программу
с компьютера, то для того чтобы приложение не запускалось делают "привязку" к железу заказчика. Некоторые заказчики специально оговаривают данный момент.
Ну в этом случае есть более простой вариант. При установке Setup прописывает в реестр какие-то значения, связанные с этой программой. Без этих записей программа просто не работает или работает в ограниченном демонстрационном режиме. Если ее тырить прямо с компа, то только вместе с реестром )). Ну а если диск уведут вместе с setup, то тут уж ничего не поделаешь.
Если Вы купили программу у производителя, то как правило, у Вас доллжен быть дистрибутив приложения
и в случае поломки жесткого диска устанавливаете и пользуетесь дальше.
Если у Вас "свистнули" или напрямую стянули ,что не редкость, программу
с компьютера, то для того чтобы приложение не запускалось делают "привязку" к железу заказчика. Некоторые заказчики специально оговаривают данный момент.
Ну в этом случае есть более простой вариант. При установке Setup прописывает в реестр какие-то значения, связанные с этой программой. Без этих записей программа просто не работает или работает в ограниченном демонстрационном режиме. Если ее тырить прямо с компа, то только вместе с реестром )). Ну а если диск уведут вместе с setup, то тут уж ничего не поделаешь.
Lokhmati
Любитель
12/11/2006, 12:50:01 PM
Уж думал об этом. И передумал
Всем спасибо! Остановлюсь на привязке к дате BIOS'а
Всем спасибо! Остановлюсь на привязке к дате 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 (...) но таки все это фигня. Не катит. :) Единственный нормальный способ - привязать к аппаратному ключу.
Кстати, можно сделать нулевой драйвер, дистрибутив никому не давать и спрашивать про валидность через поимённые трубы. :) Напесать?
Lokhmati правельно сказал про свой необходимый уровень. :) Cерийный номер тома меняется на ура. Можно привязать к связке MAC-HDD-BIOS-REGISTRY-XP (...) но таки все это фигня. Не катит. :) Единственный нормальный способ - привязать к аппаратному ключу.
Кстати, можно сделать нулевой драйвер, дистрибутив никому не давать и спрашивать про валидность через поимённые трубы. :) Напесать?
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
}
Драйвер:
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);
}
В общем, без комментариев :)
Даже если строки не будет в чистом виде в экзешнике, то когда дело дойдет до отладчика, трюк быстро обнаружится. Смотрим, при каких условиях на экране появляется окно, посылающее нас на, и добираемся до условного перехода на функции 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.
Впрочем, я бы всё равно не выбрал мы метод с драйвером. Всё-таки достаточно сравнить списки файлов до установки и после установки, и тогда легко запалить появление нового драйвера (собственно, сравнение списков файлов и должно быть первым шагом во взломе, просто я всегда забываю сделать снимок системы перед инсталляцией :)
Так-то оно так, да вот только достаточно проследить за вызовами функции CreateFile в API-мониторе, и трюк вскроется :) Тем более что первый шаг при взломе (по крайней мере, у меня) - изучение того, какие файлы программа пытается открыть. И в этом списке "белой вороной" будет смотреться запись \\.\ЧТО-ТО.
Если даже и использовать этот метод, то тогда юзать нативные API: ZwCreateFile, а лучше напрямую вызов SYSENTER.
Впрочем, я бы всё равно не выбрал мы метод с драйвером. Всё-таки достаточно сравнить списки файлов до установки и после установки, и тогда легко запалить появление нового драйвера (собственно, сравнение списков файлов и должно быть первым шагом во взломе, просто я всегда забываю сделать снимок системы перед инсталляцией :)
DELETED
Акула пера
4/23/2007, 2:25:25 PM
Этот метод для ламеров. Все обсуждаемые тут вопросы не имеют отношения к нормальной защите. Обычный пользователь драйвер не найдет. В списке процессов его нет, установка скрыта и т.д. Впрочем, так же он не найдет привязку к тому, BIOS, etc.