Проверка лицензионного ключа в отдельной форме? - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть приложение с функцией лицензионного ключа.

Пользователь получает свой лицензионный ключ, затем вводит его в TextBox, куда должен идти лицензионный ключ, и , если лицензионный ключ действителен , они переносятся в основную форму, где все функции.

Теперь, чтобы сделать мою программу более безопасной, мне нужно иметь возможность проверить, что пользователь определенно набрал свой лицензионный ключ, и он не сделал ничего, кроме удаления (путем декомпиляции) формы лицензионного ключа, чтобы он мог получить доступ к основной форме, где все функции.

Примечание: Мои лицензионные ключи хранятся на сервере.

Как мне проверить, что пользователь определенно набрал лицензионный ключ?

Ниже приведен код.


AddLicense.vb:

Imports SKM.V3
Imports SKM.V3.Models
Imports SKM.V3.Methods

Public Class AddLicense

    Private p_oRandom As Random

    Private Const INTERVAL_MIN_SEC As Integer = 4
    Private Const INTERVAL_MAX_SEC As Integer = 25

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

        If BunifuProgressBar1.Value = 50 Then
            Label3.Show()
            Label2.Hide()
        End If


        BunifuProgressBar1.Value += 1
        If BunifuProgressBar1.Value = BunifuProgressBar1.MaximumValue Then
            BunifuProgressBar1.Hide()
            Label3.Hide()
            Label2.Hide()
            Timer1.Stop()
            BunifuMaterialTextbox1.Show()
            BunifuThinButton21.Show()
            Label4.Show()
            LinkLabel1.Show()
            BunifuThinButton22.Show()
        End If

        Timer1.Interval = p_oRandom.Next(INTERVAL_MIN_SEC, INTERVAL_MAX_SEC) * 3

    End Sub

    Private Sub BunifuImageButton1_Click(sender As Object, e As EventArgs) Handles BunifuImageButton1.Click
        Me.Close()
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        p_oRandom = New Random
    End Sub

    Private Sub LinkLabel1_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
        Try
            Process.Start("https://selly.gg")
        Catch ex As Exception

        End Try
    End Sub

    Sub Nolicense()
        BunifuThinButton21.Enabled = False
    End Sub

    Private Sub BunifuThinButton21_Click_1(sender As Object, e As EventArgs) Handles BunifuThinButton21.Click
        Dim token = "WyIxMDM2IiwiZ082d2dnS0FmTkRuTXNPcGhlSkllVEx6ckFWMFhhSzlMM3Rvc01xUSJd"
        Dim key = BunifuMaterialTextbox1.Text.Replace(" ", "")

        Dim license = New LicenseKey() With
        {
            .ProductId = 3888,
            .Key = key
        }

        If license.Refresh(token, True) Then
            ' we are able to auto complete missing key info

            Me.BunifuThinButton21.Enabled = license.HasFeature(1).IsValid() ' either we have feature1 or not.

            MsgBox("License is valid! Thanks for purchasing.")
            Me.Hide()
            Sploitbase.Show()

            If license.HasFeature(4).HasNotExpired().IsValid() Then
                Me.Hide()
                Sploitbase.Show()
            ElseIf license.HasNotFeature(4).IsValid() Then



            Else
                MsgBox("Your license has expired and cannot be used.")
                Nolicense()

            End If

            license.SaveToFile()

        Else
            ' something went wrong.
            MsgBox("Unable to access the license server or the key is wrong.")

        End If

        Me.Close()
    End Sub

    Private Sub BunifuThinButton22_Click(sender As Object, e As EventArgs) Handles BunifuThinButton22.Click

    End Sub
End Class

Sploitbase.vb - основная форма:

Imports SKM.V3

Public Class Sploitbase
    Private Sub Sploitbase_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Public Sub NoLicense()


    End Sub

    Private Sub TabPage1_Click(sender As Object, e As EventArgs)

    End Sub

    Private Sub LinkLabel1_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs)
        Try
            Process.Start("https://selly.gg")

        Catch ex As Exception

        End Try
    End Sub
End Class

1 Ответ

0 голосов
/ 28 апреля 2018

Я верю , что вы хотите, чтобы запретить пользователям декомпилировать вашу программу и полностью удалить форму лицензионного ключа ...

К сожалению, невозможно остановить это, поскольку программу можно запускать на обычном компьютере, ее можно декомпилировать, иначе процессор не сможет ее обработать.

Это означает, что было бы возможно удалить соответствующие инструкции для этого, а C # и VB легко декомпилировать - такие инструменты, как dotPeek get valid source code (выиграл не совпадает с оригиналом, но все же читается и работает как оригинал) одним щелчком мыши.

Имейте в виду, что даже в правильных коммерческих программах, разработанных целыми компаниями, есть эта проблема.


Итак, что вы могли бы "сделать"? Ну, у меня есть только два предложения ... но они не будут работать слишком хорошо.

Один только усложняет, а другому требуется постоянный доступ к Интернету.


запутывание

Запутывание существенно затрудняет чтение кода после декомпиляции, однако это не остановит людей от удаления формы, а лишь сделает ее немного сложнее.

Я опубликовал его как опцию, потому что он сделает код очень сбивающим с толку при перекомпиляции, и может быть полезно "защитить" его немного больше. Однако помните: «Это слабый слой защиты для слабого атакующего».

Обфускатор, который вы можете использовать: Eazfuscator.NET , эта отправленная мной веб-страница также содержит описание того, что она делает и как ее использовать - возможно, стоит взглянуть.


Онлайн серверы

Для этого требуется подключение к Интернету ... но это единственный другой вариант, который у вас есть - либо этот, либо ... ключ, способный избавиться от продукта .

По сути, в этой идее вы заставляете сервер выполнять всю работу, которую должно выполнить приложение, а затем возвращаете результат.

Представьте, что компьютер пользователя является сервером . Их «сервер» выполняет код, и поэтому код находится на их «сервере» (в противном случае ему нечего запускать), и все обрабатывается на их сервере. Теперь, если вы запустите его на на вашем сервере, весь код будет на вашем сервере, а ваш сервер вернет только результат , что означает они не могут получить доступ к процессу, который обеспечивает такой результат.

В конце концов, это будет означать, что приложение физически не сможет ничего сделать без лицензионного ключа , поскольку единственный способ обработки данных - через сервер и сервер. не будет обрабатывать данные без ключа продукта.

Единственным недостатком является то, что должен иметь подключение к Интернету , а если подключение к Интернету медленное - программа будет работать медленно.

Поскольку вы хотите знать, как это сделать в vb.net, взгляните на ASP.NET , может помочь, но он действительно предназначен для создания полноценного веб-сайта, а не просто для обработки нескольких задач. .

Я могу оставить на ваше усмотрение то, как вы хотели бы подойти к этой задаче, но вот один из способов сделать это:

Приведенный ниже код отправит «запрос» на определенный URL-адрес, а затем вернет результат. Таким образом, вы можете сделать так, чтобы при переходе по этому URL-адресу сервер обрабатывал данные (включая ключ продукта) и возвращает результат.

Dim request As System.Net.HttpWebRequest
Dim response As System.Net.HttpWebResponse

request = System.Net.HttpWebRequest.Create("https://URLHERE")
response = askforupdate.GetResponse

Dim result As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream)

result теперь содержит String - но имейте в виду, что вы можете использовать его практически для всего - даже для изображений! (Изображения просто New Bitmap(response.GetResponseStream))

Вы можете передавать данные на сервер с помощью Строка запроса , например:

my.website / processSomething? Лицензия = AAAAAAAA & sizeInput = 241 & somethingElse = asagsag

Но, на самом деле, это зависит от вас, как вы это делаете.


Извините, я не смог дать вам точное решение, но на самом деле его нет. Вы собираетесь в конечном итоге пожертвовать чем-либо.

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

...