• 15-10-2021, 14:32:16
    #1
    Üyeliği durduruldu
    Selamlar herkese, sık sık kullandığım lisanslama kod türevini burada can sıkıntısından paylaşmak istedim Umarım birilerinin ihtiyacını karşılar. Sistem MySQL Remote bağlantısı ile çalışıyor. Gecikmeden başlayalım

    Form1 Public Class içerisinde yazılacak olan kodlar şunlar;

            public MySqlCommand CommandDB;
            public MySqlDataReader DataReaderDB;
            public MySqlConnection ConnectDB = new MySqlConnection("Server=localhost;Database=licdb;Uid=root;Pwd='secretpass';SSLMode=none;AllowUserVariables=True;UseCompression=True");
    Daha sonra, bize lisans hash'i üretecek kodu yazalım, bunu da giriş seviyesi olarak MD5 ile tasarladım, bilginiz dahilinde değiştirebilirsiniz.
            public static string MD5Sifrele(string sifrelenecekMetin)
            {
    
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                byte[] dizi = Encoding.UTF8.GetBytes(sifrelenecekMetin);
                dizi = md5.ComputeHash(dizi);
                StringBuilder sb = new StringBuilder();
                foreach (byte ba in dizi)
                {
                    sb.Append(ba.ToString("x2").ToLower());
                }
                return sb.ToString();
            }
    Akabinde, form load kodlarını yazalım onlar da şu şekilde ;
     try
                {
                    ConnectDB.Open();
                    if (ConnectDB.State != ConnectionState.Closed)
                    {
                        //Eğer bağlantı sağlandıysa lisansı kontrol et
                        listBox1.Items.Add("DB Server Connect OK !");
                        string hostname = System.Environment.MachineName;
                        string username = System.Environment.UserName;
                        Thread.Sleep(3500);
                        string GetIPAddress()
                        {
                            String address = "";
                            WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
                            using (WebResponse response = request.GetResponse())
                            using (StreamReader stream = new StreamReader(response.GetResponseStream()))
                            {
                                address = stream.ReadToEnd();
                            }
    
    
                            int first = address.IndexOf("Address: ") + 9;
                            int last = address.LastIndexOf("</body>");
                            address = address.Substring(first, last - first);
    
    
                            return address;
                        }
                        string sifre = MD5Sifrele(username + hostname + GetIPAddress());
                        label2.Text = sifre;
                        listBox1.Items.Add("Checking License. Please Wait.");
                        listBox1.Items.Add("Your External IP Address : " + GetIPAddress());
                        CommandDB = new MySqlCommand();
                        CommandDB.Connection = ConnectDB;
                        CommandDB.CommandText = "SELECT * FROM licenses where  externalip='" + GetIPAddress() + "' AND hostname='" + hostname + "' AND username='" + username + "' AND hashed='" + sifre + "'";
                        DataReaderDB = CommandDB.ExecuteReader();
                        if (DataReaderDB.Read())
                        {
                            listBox1.Items.Add("Your license valid. Hello "+ username + " !");
                            Thread.Sleep(3500);
                            //Yapılacak olan işlem komutunu buraya yazın 
    
    
                        }
                        else
                        {
                            listBox1.Items.Add("Your license not valid !");
                            listBox1.ForeColor = Color.Red;
                        }
                        ConnectDB.Close();
                        
    
    
    
    
    
    
                    }
                    else
                    {
                        listBox1.Items.Add("DB Server Connection FAİL!!");
                        MessageBox.Show("Internet bağlantınızı kontrol edin. Eğer Internet bağlantınız mevcut ise, programı aldığınız yere bu kodu gösterin : DB-012CON");
                    }
                }
                catch (Exception err)
                {
                    listBox1.Items.Add("DB Server Connection FAİL!!");
                    label2.Text = "DB Connection FAİL !!";
                    label2.ForeColor = Color.Red;
    
    
    
    
                }
    Veee unutmadan, Using kısmını da şu şekilde yapın ;

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using MySql.Data;
    using MySql.Data.MySqlClient;
    using System.Threading;
    using System.Management;
    using System.Threading.Tasks;
    using Microsoft.Win32;
    using System.Net;
    using System.IO;
    using System.Security.Cryptography;
    Önemli not : MySQL eklentisini NuGET üzerinden kurun.

    Ücret : Bir adet beğeni
  • 15-10-2021, 14:35:24
    #2
    Veritabanı bağlantı bilgilerini programa bu şekilde açıktan yazmak pek iyi bir şey değil. Elinize sağlık.
  • 15-10-2021, 14:36:25
    #3
    Üyeliği durduruldu
    YuqseLX adlı üyeden alıntı: mesajı görüntüle
    Veritabanı bağlantı bilgilerini programa bu şekilde açıktan yazmak pek iyi bir şey değil. Elinize sağlık.
    E artık onu şifrelemek sizin göreviniz hocam Sağlam bir obfuscator ile şifrelerseniz kırılması imkansızlaşır. Ve ya oradaki kodu bir sınıf haline döküp DLL parçacığına çevirirseniz de işinizi görür.
  • 15-10-2021, 14:47:18
    #4
    öncelikle paylasimin icin tesekkürler. Müsadenle bir kac sey eklemek istiyorum


    1- Ilk gözüme takilan sey IP üzerinden "lisanslama" olayini yapman.
    Burada statik IP'ye göre kullanilmis ancak türkiye'de bildigim kadariyla cogu kullanicida dinamik IP var, yani modem resetlendiginde IP degisiyor. Bu sekilde lisanslama yapmak pek mantikli degil
    Cözüm: IP yerine bilgisayarin cesitli parcalarinin unique IDleri/seri numaralari alinip birlestirilip bir key olusturulabilir

    2- MySql Remote baglantisi olayi.
    Veritabaninin disardan bu sekilde ulasilmasi dogru bir yaklasim degil. Obfuscate yapip yapmamaniz önemli degil (yapsaniz da kirilabilir), burada network baglantilari takip edilebilir.
    Cözüm: Lisans yönetimi icin her zaman bir tane API ile hareket etmek gerektigini düsünüyorum. Bu sekilde bir cok bilgi güvende kalacaktir.
    3- Lisans Yönetimi
    Bu konuda herhangi bir kod yazmamissin. Yani sadece kontrol var ama birisinin bir müsteriyi nasil lisanslayacagi ile ilgili kod yok.
    Cözüm: Üstte söyledigim gibi bu olayi bir API ile yaparsan, ve yönetici icin de bir Admin Paneli hazirlarsan, lisans yönetimi gayet güzel sekilde yapilir.

    Bahsettigim öneriler dogrusultusunda calisan bir cok yazilim var, hatta r10'da bu tarz bir lisans modülünün satildigini hatirliyorum. Belki uygunsaniz ve bu modülü gelistirmek isterseniz, web tabanli bir lisanslama kontrol modülü yazip paylasabilirsiniz.

    Iyi calismalar dilerim
  • 15-10-2021, 15:08:06
    #5
    Üyeliği durduruldu
    ertan2002 adlı üyeden alıntı: mesajı görüntüle
    öncelikle paylasimin icin tesekkürler. Müsadenle bir kac sey eklemek istiyorum


    1- Ilk gözüme takilan sey IP üzerinden "lisanslama" olayini yapman.
    Burada statik IP'ye göre kullanilmis ancak türkiye'de bildigim kadariyla cogu kullanicida dinamik IP var, yani modem resetlendiginde IP degisiyor. Bu sekilde lisanslama yapmak pek mantikli degil
    Cözüm: IP yerine bilgisayarin cesitli parcalarinin unique IDleri/seri numaralari alinip birlestirilip bir key olusturulabilir

    2- MySql Remote baglantisi olayi.
    Veritabaninin disardan bu sekilde ulasilmasi dogru bir yaklasim degil. Obfuscate yapip yapmamaniz önemli degil (yapsaniz da kirilabilir), burada network baglantilari takip edilebilir.
    Cözüm: Lisans yönetimi icin her zaman bir tane API ile hareket etmek gerektigini düsünüyorum. Bu sekilde bir cok bilgi güvende kalacaktir.
    3- Lisans Yönetimi
    Bu konuda herhangi bir kod yazmamissin. Yani sadece kontrol var ama birisinin bir müsteriyi nasil lisanslayacagi ile ilgili kod yok.
    Cözüm: Üstte söyledigim gibi bu olayi bir API ile yaparsan, ve yönetici icin de bir Admin Paneli hazirlarsan, lisans yönetimi gayet güzel sekilde yapilir.

    Bahsettigim öneriler dogrusultusunda calisan bir cok yazilim var, hatta r10'da bu tarz bir lisans modülünün satildigini hatirliyorum. Belki uygunsaniz ve bu modülü gelistirmek isterseniz, web tabanli bir lisanslama kontrol modülü yazip paylasabilirsiniz.

    Iyi calismalar dilerim
    Belirttiğim gibi, "Lisans Doğrulama" bu lisanslama değil Network kısmına da gelecek olursak, sunucu bazlı çeşitli önlemler de alınabilir. Dinamik IP kısmında da yazdığım yazılım VDS üzerinde çalışma gereksinimi duyduğu için ekleme gereği duydum. Obfuscate türleri vardır. En güvenli şekilde obfuscate yaparsak sorun olacağını düşünmüyorum.