Форум   Статьи   Новости   Файлы   Bugtraq   Сниффер   Друзья   О Клубе
Вернуться   HPC / Кодинг / .NET / VB.NET
   
  Страница 1
  , 07:12   #1
DWA
Местный
 
Аватар для DWA
 
Регистрация: 25.02.2010
Сообщений: 417

Репутация: 82 / 1
По умолчанию Привязка к железу [VB.NET + PHP]

Всем привет, решил набросать небольшой мануал для новичков по реализации банальной привязки ПО к железу компьютера. Реализовывать будем на VB.NET. Так же нам потребуется сервер с поддержкой PHP и MySQL, для тестов на локальной машине подойдет Denwer, именно его я и использовал. Думаю с его установкой и настройкой вы справитесь сами)

В случае реального использования данных наработок рекомендуется:
  1. Для сервера обязательное использование SSL.
  2. Передача данных только POST методом
  3. Приложение естественно необходимо пропускать через обфускатор, при этом шифровать все строки.

Перед началом программирования составим небольшой алгоритм действий.

Алгоритм для локального приложения:
  1. Генерируем случайным образом ID нашего приложения (Для каждой сборки свой уникальный ID)
  2. Собираем данные о железе компьютера, комбинируем все данные и шифруем алгоритмом MD5
  3. Посылаем запрос на сервер с ID нашего приложения, в случае если ID не зарегистрирован в базе, добавляем строку в базу данных - информацию о железе, и другой информации (IP к примеру)
  4. В случае если ID приложения находится в базе, передаем данные о железе на сервер, и сверяем с данными из базы (не забываем про MD5), если данные совпадают, разрешаем работу приложения, иначе в блэк лист)

Алгоритм для сервера:
  1. Все просто, принимаем данные от пользователя, и сверяем их с данными из MySQL базы. Все в основном описано в первом алгоритме

Кодировать мы начнем с сервера

Для начала создадим новую MySQL базу данных, и импортируем для создания таблицы туда следующий запрос:
PHP highlight
CREATE TABLE `<Имя базы данных>`.`data` (
`
IDINT NOT NULL ,
`
IPTEXT NOT NULL ,
`
TextTEXT NOT NULL
ENGINE MYISAM 
IMAGE http://savepic.ru/2762071.png

"<Имя базы данных>" - заменяем на свое.

Далее создадим index.php, откроем его любым текстовым редактором и начнем понемногу писать (код максимально возможно прокомментирован):
PHP highlight
<?php
    
# Конфиг для MySQl 
    
$mysql['server']   = "localhost"# MySQL сервер (обычно localhost)
    
$mysql['login']     = ""# Логин от MySQL
    
$mysql['password'] = ""# Пароль от MySQL
    
$mysql['database'] = ""# База данных

    # Получаем данные от программы GET методом
    
$id   =(int)$_GET['id'];    # Собственно уникальный ID приложения
    
$data md5($_GET['data']); # Данные о железе, шифруем в MD5
    
    # Получаем IP адрес клиента
    
$ip $_SERVER['REMOTE_ADDR'];
    
    
# Подключаемся к MySQL
    
$db mysql_connect($mysql['server'], $mysql['login'], $mysql['password']);
    if (!
$db) {
    
# В случае ошибки прерываем работу скрипта
        
die();
    }
    
# Выделяем нашу базу
    
mysql_select_db($mysql['database'], $db);
    
    
#  Выдергиваем ID из базы
    
$result mysql_query("SELECT id FROM data WHERE id='".$id."'");
    
$text  mysql_fetch_array($result);
    
# Сверяем полученный ID и ID записанный в базе
    
if($text['id'] != $id) { 
    
# Если записи нету, добавляем информацию о проге и железе в базу
        
mysql_query("INSERT INTO data (id, ip, text) VALUES ('".$id."','".$ip."','".$data."')");
        die();
    }
    else { 
    
# В случае если ID существует в базе, проверяем данные о железе клиента, с данными из базы
        # Получаем информацию о железе по ID
        
$query mysql_query("SELECT text FROM data WHERE id='".$id."'");
        
$text mysql_fetch_array($query);
        
# Сверяем информацию из базы с полученными данными
        
if($text['text'] == $data){
            
# Если совпадают, пропускаем 
            
die("Access Allowed");
        }
        else {
            
# Иначе фейл
            
die("Access Denied");
        }
    }
?>
По сути серверная часть закончена, можно заливать данный файл на хостинг, и настраивать базу данных

Ну, а теперь перейдем к локальному приложению, как уже наверное стало ясно, передавать данные мы будем GET методом (Не самое лучшее решение, но для обучающих целей самое то ;))

Привязывать прогу мы будем старым, боянистым способом, т.е. по MAC адресу сетевой карты, даже набросал небольшую функцию для этого
code:
    Public Function GetMACAddress() As String
        Dim mc As New ManagementClass("Win32_NetworkAdapterConfiguration")
        Dim moc As ManagementObjectCollection = mc.GetInstances()
        Dim MACAddress As String = String.Empty
        For Each mo As ManagementObject In moc
            If MACAddress = String.Empty Then
                If CBool(mo("IPEnabled")) = True Then
                    MACAddress = mo("MacAddress").ToString()
                End If
            End If
            mo.Dispose()
        Next

        MACAddress = MACAddress.Replace(":", "")
        Return MACAddress
    End Function
И не забываем:
PHP highlight
Imports System.Management 
Иначе не скомпилируется ;)

После того как мы выдрали системную информацию, необходимо передать ее на сервер, инструментов в .NET'е для этого огромное количество, от сокетов до HttpWebRequest, но т.к. мы используем простенький GET метод общения с сервером, нам хватит обыкновенного WebClient'a. Общая реализация такой функции для проверки:
code:
    Public Function gets(ByVal id As Integer, ByVal data As String)
        Dim wc As New WebClient
        Dim i As Byte = 0
start:
        Try
            Select Case wc.DownloadString("http://127.0.0.1/index.php?id=" & id & "&data=" & data)
                Case ""
                    i += 1
                    If i = 3 Then
                        Return False
                    Else
                        GoTo start
                    End If
                Case "Access Allowed"
                    Return True
                Case "Access Denied"
                    Return False
            End Select
        Catch
            Return False
        End Try
    End Function
Собственно у функции два аргумента: уникальный номер приложения (Для каждой сборки должен быть свой), и передаваемые параметры железа. Так же имеется небольшой счетчик, в случае 3-х неудачных попыток загрузки результата, возвращается значение False. Так же не забываем импортировать Net

А вот пример использования сие чуда:
code:
        If gets(312352, GetMACAddress()) Then
            MsgBox("Все ок, можно пользоватся программой :)")
        Else
            MsgBox("Программа предназначена для другого ПК")
            Me.Close()
        End If
Привязка в действии:
IMAGE http://savepic.ru/2768011.png


(c) DWA, Hacker-Pro.net
 

Последний раз редактировалось DWA; 06.07.2011 в 15:08. Причина: спойлеры убрал =)
Пользователь вне форума    
Наши Спонсоры
  , 14:36   #2
Новичок
 
Аватар для AngryBSOD
 
Локация: so empty();
Регистрация: 04.06.2015
Сообщений: 7

Репутация: 9 / 0
По умолчанию

Dim wc As New WebClient
wc.DownloadString
Можно заменить на
new WebClient().DownloadString()
 
Пользователь вне форума    
 

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
бан по железу! fatality Новичкам 19 27.11.2010 21:26



Часовой пояс GMT +2
Powered by vBulletin® 3.x.x Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.

Copyright © 2008 - 2013 «HPC» Реклама на сайте Правила Форума Пользовательское соглашение Работа на сайте
При копировании материалов ставьте ссылку на источник
Все материалы представлены только в ознакомительных целях, администрация за их использование ответственности не несет.