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

Posted

技术标签:

【中文标题】在单独的表格上验证许可证密钥?【英文标题】:Validating License Key on separate form? 【发布时间】:2018-10-09 03:19:15 【问题描述】:

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

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

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

注意:我的许可证密钥存储在服务器上。

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

下面是代码。


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

【问题讨论】:

'删除许可证密钥表格'?你的意思是密钥表格可以关闭?尝试使用 frm.showdialog(),而不是 form.show... 不,他不是那个意思,他的意思是从字面上反编译它并删除表单(很可能)。 【参考方案1】:

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

不幸的是,这是无法阻止的,只要程序可以在普通计算机上运行,​​就可以对其进行反编译,否则处理器将无法处理。

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

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


那么,你能“做什么”呢?好吧,我真的只有两个建议……但它们不会很好用。

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


混淆

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

我将它作为一个选项发布,因为它会使代码在重新编译时非常令人困惑,并且可能有助于“保护”它a多一点。但是,请记住这一点:“对于弱攻击者来说,这是一个薄弱的防御层。”

你可以使用的混淆器是Eazfuscator.NET,我发送的那个网页也有一个关于它的基本作用和使用方法的描述——它可能值得一看。


在线服务器

这个需要连接到互联网......但是,它是您唯一的其他选择 - 要么是这个,要么...... able-to-get-rid-of-product-key。

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

假设用户的计算机是一个服务器。他们的“服务器”运行代码,因此代码在他们的“服务器”上(否则它没有什么可运行的),一切都在他们的服务器上处理。现在,如果你在你的服务器上运行它,所有代码都在你的服务器上,你的服务器只返回结果,意思是,他们无法获得提供该结果的过程。

最后,这意味着应用程序如果没有许可证密钥,物理上将无法做任何事情,因为它可以处理其数据的唯一方法是通过服务器,并且如果没有产品密钥,服务器将不会处理数据。

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

既然您想知道如何在 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)

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

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

但是,实际上,这取决于你如何做到这一点。


很抱歉,我不能给你一个确切的解决方案,但是,真的没有。无论哪种方式,你最终都会牺牲一些东西。

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

【讨论】:

以上是关于在单独的表格上验证许可证密钥?的主要内容,如果未能解决你的问题,请参考以下文章

使用许可证密钥验证保护 wordpress 主题

是否可以在客户端安全地验证离线许可证密钥?

在 Python 中使用 RSA 公钥验证签名的许可证密钥

许可证密钥验证框架(OS X、Cocoa)?

Java:通过软件或服务器进行许可证身份验证和验证?

linux的许可证替代[关闭]