Category / Programavimas

Programinės įrangos licenzijavimas 2023.12.21 at 08:37

Kažkada sugalvojau, kad visai norėčiau apsaugoti savo programėles nuo nelegalaus kopijavimo. Ne tam, kad daugiau pinigų ar kažko gauti, bet tiesiog šiaip, dėl tvarkos. Nu ir – nes galiu 😋. Taigi, tikslas – padaryti, kad programėlė veiktų tik tame kompiuteryje, kuriame aš noriu. Reiškia, kad programėlė turi žinoti kuriame kompiuteryje jai galima veikti, o kuriame negalima. Kaip ir paprasta, bet – o tai kaip programėlė tą sužinos ? Yra keletas variantų, bet jeigu, tarkime apsiribotumėme Windows operacine sistema, tada, mano galva, paprasčiausi yra du būdai – rištis prie procesoriaus ID arba MAC adreso. MACas dar kai kada gali būti keičiamas, procesoriaus ID jau taip paprastai nepakeisi. Jo net standartiniai Windows įrankiai nerodo, bent jau man nepavyko aptikti. Todėl rašome nedidelė programėlę su Visual Studio, kuri tą dalyką sužinos ir mums parodys. Tam reikia parašyti dvi paprastas programėles:

        private string Get_MAC_Id()
        {
            foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (nic.OperationalStatus == OperationalStatus.Up)
                {
                    PhysicalAddress mac = nic.GetPhysicalAddress();
                    currentMacAddress = BitConverter.ToString(mac.GetAddressBytes()).Replace("-", "");
                    break;
                }
            }
            return currentMacAddress;
        }

Šita programėlė suranda aktyvios tinklo kortos MAC adresą ir pagražina jį pagrindinei programai.

        private string GetProcessorId()
        {
            ManagementClass managClass = new ManagementClass("win32_processor");
            ManagementObjectCollection managCollec = managClass.GetInstances();

            foreach (ManagementObject managObj in managCollec)
            {
                cpuInfo = managObj.Properties["processorID"].Value.ToString();
                break;
            }
            return cpuInfo;
        }

O šita programėlė tą patį padaro su CPU ID. Po to belieka tik susidėti tuos duomenis ten, kur mums reikia, pavyzdžiui, į programėlės grafinę sąsają (va kaip lietuviškai parašiau 🙃):

Veikimas paprastas, paleidus programėlę ji iš karto prasuka informacijos surinkimą ir parodo jį atitinkamuose laukeliuose. Vienintelis mygtukas tik uždaro programėlę. Paveiksliuke jau matosi ir mano kompiuterio MAC ir CPU ID. O kodėl reikia dviejų dalykų ? Principe, užtektų ir vieno – CPU ID. Logika paprasta – kompiuteryje gali nebūti jokios tinklo kortos, taigi MAC ID nieko nesugeneruos, o procesorius, nori nenori, o visada bus, todėl galima rištis prie jo ID. Savo programėlėse aš tikrinsiu abu ID ir, jeigu bent vienas atitiks, tuomet programėlė veiks. Programėlėse patikra daroma taip:

        private int get_MAC_Id()
        {
            string predefinedMacAddress = "B07D64766C0E";
            

            foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (nic.OperationalStatus == OperationalStatus.Up)
                {
                    PhysicalAddress mac = nic.GetPhysicalAddress();
                    string currentMacAddress = BitConverter.ToString(mac.GetAddressBytes()).Replace("-", "");

                    if (currentMacAddress.Equals(predefinedMacAddress, StringComparison.OrdinalIgnoreCase))
                    {
                        mac_flag = 1;
                        break; // No need to continue checking if we found a match
                    }
                }
            }
            return mac_flag;
        }

        private int getProcessorId()
        {

            string predefinedcpuInfo = "BFEBFBFF000A0652";
            string cpuInfo = string.Empty;

            ManagementClass managClass = new ManagementClass("win32_processor");
            ManagementObjectCollection managCollec = managClass.GetInstances();

            foreach (ManagementObject managObj in managCollec)
            {
                cpuInfo = managObj.Properties["processorID"].Value.ToString();
                break;
            }
            if (cpuInfo.Equals(predefinedcpuInfo, StringComparison.OrdinalIgnoreCase))
            {
                CpuID_flag = 1;
            }
            return CpuID_flag;
        }

Į pagrindinę programą grąžinamos vėliavėlės (flag), jeigu CPU ID arba MAC ID atitinka programėlėje jau įrašytus – tuomet vėliavėlės bus 1. Tuos vienetus pagauna pagrindinė programa ir padaro paprastą patikrą.

Nepamirštam inicializuoti flag’us :

        int mac_flag = 0;
        int CpuID_flag = 0;
Tuomet kažkur kode, ten kur norime patikros:
            get_MAC_Id();
            getProcessorId();
            if (mac_flag == 1 || CpuID_flag == 1)
            {
                // Darome tą, ką reikia, jeigu ID atitinka. Loginis "arba" || leis veikti jeigu bent vienas flag'as = 1, jeigu naudoti loginį "ir" && tuomet leis veikti tik jeigu abu flag'ai bus vienetukai.
            }
            else
            {
                MessageBox.Show("Contact creator of this program.", "Error", MessageBoxButtons.OK);
            }

O čia Visual Studio failiukai, išeitinis kodas, sukompiliuotas exec’as.

STM32F466 dev bordas ! 2022.01.27 at 14:59

Taip, pagaliau šiais visuotinio elektronikos komponentų deficito laikais, tiesiai iš „ST” (nu ok ok, per Lemoną) atvažiavo senokai užsakytas kūrybinis modulis (© vertimas development board) STM32F466RE. Modulyje gyvena Arm® 32-bit Cortex®-M4 procesorius su integruotu FPU. Ir šitas modulis, bent jau man, turėtų pakeisti visus Arduino modulius ir projektus, o kadangi šitas procesorius yra stipriai greitesnis už Arduino valdiklį (ne šiaip pasakiau procesorius ir valdiklis), bus įdomu jį visaip išsibandyti.

Pradžioje – kodėl pasirinkau būtent šitą modelį. Pradžioje žiūrim į bendrą paveiksliuką, paimtą iš „ST” puslapio (visa informacija paimta iš „ST” puslapių, taigi, norintys ras ją ir ten):

Taigi, galvoju, kad mokytis visus procesorius visai neturiu laiko, todėl rinkausi tokį aukso viduriuką, kad būtų greitas, ir sąlyginai nebrangus. Taigi, taikiau į „High Performance” segmentą. O jame gyvena procesoriukų linijos:

Taigi, STM32H7 ir F7 du patys galingiausi, prikimšti visokių funkcijų (detalesnį aprašymą jau teks žiūrėti pas „ST”), kurių aš nepanaudosiu, todėl juos atmečiau. Bet kadangi norėjau tokio aukso viduriuko, tai patį silpniausią, STM32F4 (kurio man greičiausiai būtų pakakę su kaupu) irgi išmečiau iš kandidatų sąrašo. Beliko tik STM32F2 ir STM32F4. Iš tų dviejų truputį geresnis F4. Jis gali būti Foundation arba Advanced, bet našumo atžvilgiu jie beveik vienodi, todėl pasirinkau paprastesnį Foundation, štai ir atvažiavom prie pasirinkimo :D. Ir dar dėl to, kad nujaučiu tarp jų nesudėtinga būtų migruoti vos panorėjus. Bent jau Foundation → Advanced kryptimi. kadangi jau pasirinkome konkrečią seriją, žiūrim dar vieną paveiksliuką:

Čia jau yra konkretūs procesoriukai, ne modelinė gama. Taigi, iš mūsų pasirinktos Foundation STM34F4 gamos pats geriausias STM32F446 procesorius. Dažnis geras, atminties per akis, funkcionalumas pats tas. Štai ir turim pasirinkimą :). O kūrybinis modulis su šiuo procesoriuku yra STM32F446RE. Nors rašant straipsnelį vis dar kirba mintis, kad toks žvėris bus gerokai per galingas mano projektams, bet vis tiek džiaugiuosi kaip vaikas per Kalėdas, gavęs norimą dovanėlę :D.

Dar kažkur skaičiau (turbūt modulio aprašyme), kad viršutinė dalis gali būti naudojama kaip ST-LINK programatorius kitiems „ST” procesoriams/valdikliams. Turiu ir atskirą ST-LINK’ą V2, bet vis tiek naudinga informacija :). Štai ir prasidės ne už ilgo „Hello world” su šituo moduliuku :). O čia beveik 200 puslapių aprašymas :D, mokykis ! O čia modulio aprašymas. Ir dar vienas labai reikalingas failas – HAL komandos su aprašymais.

Pirmasis C „Hello world” 2017.02.07 at 16:12

Štai, pirmoji mano programa, parašyta grynai C kalba, mirksinanti LEDus, kas atitinka standartinį „Hello world” kai nėra ekraniuko.

 

Paveiksliuke primityvus, bet veikiantis mirksiukas. RC7 ir RC9 per tranzus valdo porą LEDų, o LEDų maitinimas enablinasi RA1. Čia tokia schema, ne visai devbordas, pritaikiau tik nuo kito prietaiso.