在单独的表格上验证许可证密钥?

Validating License Key on separate form?

我有一个具有许可证密钥功能的应用程序。

用户获取他们的许可证密钥,然后将其键入许可证密钥所在的文本框,如果许可证密钥有效,他们将被带到主窗体,其中包含所有功能。

现在,为了使我的程序更安全,我需要能够检查用户是否确实输入了他们的许可证密钥,并且他们没有执行删除(通过反编译)许可证密钥表单之类的操作,所以他们可以访问包含所有功能的主窗体。

Note: My license keys are stored on a server.

我如何检查用户是否确实输入了许可证密钥?

下面是代码。


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

相信您想要的是阻止用户反编译您的程序并完全删除许可证密钥形式...

遗憾的是,这是不可能阻止的,只要一个程序可以在普通计算机上运行,就可以反编译,否则处理器无法处理它。

这意味着,可以删除相关指令,并且 C# 和 VB 很容易反编译 - dotPeek 之类的工具可以得到 valid 源代码(它不会与原始代码完全相同,但仍然可读并且 运行 与原始代码一样)只需单击一下即可。

请记住,即使是整个公司制作的适当的商业程序也会有这个问题。


那么,你能"do"做什么?好吧,我真的只有两个建议......但它们不会太有效。

一个只会让它变得更难,而另一个需要一直访问互联网。


混淆

混淆本质上使反编译后的代码更难阅读,但是,它不会阻止人们删除表单,它只会使它稍微更难一些。

我将它作为一个选项发布,因为它会使代码 非常 在重新编译时变得混乱,它可能对 "protect" 一点。但是,请记住这一点:"It's a weak layer of defence for a weak attacker."

您可以使用的混淆器是 Eazfuscator.NET,我发送的那个网页也基本上描述了它的作用以及如何使用它 - 可能值得一看。


在线服务器

这个需要连接到互联网...但是,这是您唯一的其他选择 - 要么是这个要么...能够摆脱-产品密钥.

从本质上讲,在这个想法中,您让服务器完成应用程序必须完成的所有工作,然后 return 它的结果。

假设用户的计算机是服务器。他们的"server"运行是代码,所以代码在他们的"server"(否则与 运行) 无关,一切都在他们的服务器上处理。现在,如果你 运行 它在 你的 服务器上,所有代码都在你的服务器上,你的服务器 仅return得到结果,意思是,他们无法获得提供该结果的过程。

最后,这意味着应用程序 如果没有许可证密钥,实际上将无法执行任何操作,因为它处理数据的唯一方法是通过服务器,如果没有产品密钥,服务器将不会处理数据。

唯一的缺点是您必须有互联网连接并且如果互联网连接速度很慢- 程序会很慢。

既然您想知道如何在 vb.net 中执行此操作,请看一下 ASP.NET 可能会有所帮助,但它确实旨在制作一个完整的网站 - 而不仅仅是处理一些任务.

我可以让您自行决定如何处理此任务,但这是 一种方法:

下面的代码将使 "request" 到某个 URL 然后得到结果 - 有了这个,你可以做到,所以当它到达那个 URL 时服务器处理给定的数据(包括产品密钥)并return返回结果。

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)

您可以通过Query String向服务器传递数据,例如:

my.website/processSomething?license=AAAAAAAA&sizeInput=241&somethingElse=asagsag

但是,实际上,这取决于您如何操作。


很抱歉,我无法为您提供确切的解决方案,但确实没有。无论哪种方式,你最终都会牺牲一些东西。

希望这至少对您有所帮助,并帮助您了解要防止人们在不丢失任何东西的情况下入侵您的软件是真的不可能的。