Closed TopicStart new topicStart Poll

Страницы: (1) 1 
Lokhmati
дата: [ i ]
  • *
  • Любитель
  • Репутация: 75
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Товарищи! Использую код для привязки к дате создания 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
дата: [ i ]
  • *
  • Специалист
  • Репутация: 29
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
В ХР не получится. Доступ к таким адресам из программ в ХР (2000+) невозможен.
Во тут показано как узнать дату БИОСа из реестра, хоть это и не надежно. Правда на Паскале, но разобраться можно

Если не секрет, зачем это?
Lokhmati
дата: [ i ]
  • *
  • Любитель
  • Репутация: 75
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Дело в том, что одну мою программулину хотят приобрести. Следовательно хочу создать привязку только к машине покупателя. Вот и все. :)
kiskus
дата: [ i ]
  • *
  • Новичок
  • Репутация: 14
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Не лучше ли привязатся к серийному номеру тома где будет инсталирована программа.
Lokhmati
дата: [ i ]
  • *
  • Любитель
  • Репутация: 75
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Тоже вариант. Спасибо!
adia
дата: [ i ]
  • *
  • Специалист
  • Репутация: 29
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
QUOTE (kiskus @ 04.12.2006 - время: 13:35)
Не лучше ли привязатся к серийному номеру тома где будет инсталирована программа.

Это варварство. Я сталкивался с такими. И не понимаю, почему, если я купил программу, я не могу установить ее на другой комп, если, скажем, сдох винт или сам комп?
AngeLR
дата: [ i ]
  • Group Icon
  • Спонсор форума
  • Репутация: 1195
  • Статус: чотокакто
  • Member OfflineМужчинаСвободен
любая защита приносит неудобства... и не дает гарантии взлома... ни когда не видел смысла в этом... если очень надо будет - словают или обойдут.
kiskus
дата: [ i ]
  • *
  • Новичок
  • Репутация: 14
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
QUOTE (adia @ 05.12.2006 - время: 23:56)
QUOTE (kiskus @ 04.12.2006 - время: 13:35)
Не лучше ли привязатся к серийному номеру тома где будет инсталирована программа.

Это варварство. Я сталкивался с такими. И не понимаю, почему, если я купил программу, я не могу установить ее на другой комп, если, скажем, сдох винт или сам комп?

Если Вы купили программу у производителя, то как правило, у Вас доллжен быть дистрибутив приложения
и в случае поломки жесткого диска устанавливаете и пользуетесь дальше.
Если у Вас "свистнули" или напрямую стянули ,что не редкость, программу
с компьютера, то для того чтобы приложение не запускалось делают "привязку" к железу заказчика. Некоторые заказчики специально оговаривают данный момент.
И маленькое замечание - купил диск с программой ,программами, и
купил программу. Это не одно и то же. При продаже программы производитель
или программист, в зависимости от договора с заказчиком, обеспечивает
"поддержку" программы , те помогает в установке,настройке и обучении персонала, а также в устранении скрытых ошибок приложения если таковые имеются.
Программирование труд, и далеко не самый лёгкий как может показатся. ИМХО

Это сообщение отредактировал kiskus - 06-12-2006 - 16:53
shworker
дата: [ i ]
  • *
  • Специалист
  • Репутация: 28
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Есть еще один метод - не самый красивый с точки зрения распространения, но зато действенный.
Писал как-то программу для организации - надо было вбивать данные в базу и выводить печатные формы.
Так вот, я намертво закодировал название организации в код.
Для тех, кто стырит программу (случаи были) взлом просто не имеет смысла, так как на всех выходных документах печатается другое название.
Для усиления защиты (а вдруг кто-то догадается ) предусмотрено шифрование.
Еще вариант - защита при помощи Flash USB Stick.
Можно держать на флешке скрытый раздел, который не виден винде.
И в нем - серийник, название организации и ее реквизиты, и тд.
Так как флешка только читается - работает достаточно надежно.


Это сообщение отредактировал shworker - 07-12-2006 - 00:44
дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
Если человек пишет на VB прикладные программы, то понятно, какой уровень там у пользователей. И привязать к тому или BIOS'у будет вполне достаточно.
Lokhmati
дата: [ i ]
  • *
  • Любитель
  • Репутация: 75
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
QUOTE
Если человек пишет на VB прикладные программы, то понятно, какой уровень там у пользователей. И привязать к тому или BIOS'у будет вполне достаточно.

Пишу для самого обычного ПТУ. Решил не парить остатки мозга и пишу на VB. Достаточно простой, если не тривиальной, защиты. Просто было уже такое, когда мои проги расходились по друзьям, знакомым, родственникам и т. д. Вот и хочу защититься. Понимаю, что кому надо - взломает. А тот, кому я продаю 100% не сломает.
adia
дата: [ i ]
  • *
  • Специалист
  • Репутация: 29
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
QUOTE (kiskus @ 06.12.2006 - время: 09:54)

Если Вы купили программу у производителя, то как правило, у Вас доллжен быть дистрибутив приложения
и в случае поломки жесткого диска устанавливаете и пользуетесь дальше.
Если у Вас "свистнули" или напрямую стянули ,что не редкость, программу
с компьютера, то для того чтобы приложение не запускалось делают "привязку" к железу заказчика. Некоторые заказчики специально оговаривают данный момент.

Ну в этом случае есть более простой вариант. При установке Setup прописывает в реестр какие-то значения, связанные с этой программой. Без этих записей программа просто не работает или работает в ограниченном демонстрационном режиме. Если ее тырить прямо с компа, то только вместе с реестром )). Ну а если диск уведут вместе с setup, то тут уж ничего не поделаешь.
Lokhmati
дата: [ i ]
  • *
  • Любитель
  • Репутация: 75
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Уж думал об этом. И передумал smile.gif
Всем спасибо! Остановлюсь на привязке к дате BIOS'а
himor
дата: [ i ]
  • *
  • Новичок
  • Репутация: нет
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Самый реальный вариант которым лично я пользовался - это привязка к серийному номеру тома где устанавливается программа. Но не думаю, что сейчас это актуально. Намного удобнее иметь USB ключ - недорогую флешку небольшого размера с ключевым файлом на ней. При выборе правильного метода шифрования получится довольно интересное решение.
дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
QUOTE (himor @ 22.04.2007 - время: 01:11)
Самый реальный вариант которым лично я пользовался - это привязка к серийному номеру тома где устанавливается программа.

Lokhmati правельно сказал про свой необходимый уровень. :) Cерийный номер тома меняется на ура. Можно привязать к связке MAC-HDD-BIOS-REGISTRY-XP (...) но таки все это фигня. Не катит. :) Единственный нормальный способ - привязать к аппаратному ключу.

Кстати, можно сделать нулевой драйвер, дистрибутив никому не давать и спрашивать про валидность через поимённые трубы. :) Напесать? wink.gif
дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
Блин, чего только не сделаешь... Лишь бы не работать.

Драйвер:
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
               }


Это сообщение отредактировал JeyLo - 22-04-2007 - 14:16
maxdiversexnarod1
дата: [ i ]
  • *
  • Любитель
  • Репутация: 30
  • Статус:
  • Member OfflineМужчинаСвободен
Позволю заметить, что толку от такой защиты не намного больше, чем от, скажем, привязки к BIOS'у. Если программа не запакована, то строка вида \\.\ЧТО-ТО будет заметно выделяться среди всех строк экзешника. Тыкаем по перекрёстной ссылке, видим CreateFile...
Даже если строки не будет в чистом виде в экзешнике, то когда дело дойдет до отладчика, трюк быстро обнаружится. Смотрим, при каких условиях на экране появляется окно, посылающее нас на, и добираемся до условного перехода на функции CreateFile. Многие даже не станут задумываться, и исправят условный переход на обратный - и все дела :)
Если же хорошенько запутать защитный код или запаковать файл крутым протектором, то тогда уже станет не важно, какая защита применена: одинаково хорошо будет действовать и проверка номера BIOS'а, и поиск драйвера.

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

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

А так согласен. Полностью.
maxdiversexnarod1
дата: [ i ]
  • *
  • Любитель
  • Репутация: 30
  • Статус:
  • Member OfflineМужчинаСвободен
QUOTE
Зато импорт функций не будет вызывать подозрений

Так-то оно так, да вот только достаточно проследить за вызовами функции CreateFile в API-мониторе, и трюк вскроется :) Тем более что первый шаг при взломе (по крайней мере, у меня) - изучение того, какие файлы программа пытается открыть. И в этом списке "белой вороной" будет смотреться запись \\.\ЧТО-ТО.
Если даже и использовать этот метод, то тогда юзать нативные API: ZwCreateFile, а лучше напрямую вызов SYSENTER.

Впрочем, я бы всё равно не выбрал мы метод с драйвером. Всё-таки достаточно сравнить списки файлов до установки и после установки, и тогда легко запалить появление нового драйвера (собственно, сравнение списков файлов и должно быть первым шагом во взломе, просто я всегда забываю сделать снимок системы перед инсталляцией :)
дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
Этот метод для ламеров. Все обсуждаемые тут вопросы не имеют отношения к нормальной защите. Обычный пользователь драйвер не найдет. В списке процессов его нет, установка скрыта и т.д. Впрочем, так же он не найдет привязку к тому, BIOS, etc.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)

Страницы: (1) 1

Closed TopicStart new topicStart Poll0


Рекомендуем почитать также топики:

Free BSD (UNIX)

Плата за соединение

два компа через блютуз для выхода в инет

Конкурс "И у компьютера бывает Новый Год..."

Как поделиться сетью со вторым компом?



>