ايران ويج

نسخه‌ی کامل: ايجاد يك قفل نرم افزاري
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2 3 4 5
ايجاد يك قفل نرم افزاري


با سلام
در اين مجموعه مقالات سعي خواهم كرد كه شما را بتدريج با انواع روشهاي ايجاد قفل آشنا كنم. اصولا" روشهاي زيادي براي ايجاد قفل بر روي نرم افزار ها وجود دارد ولي اولين روشي كه من ياد گرفتم ايجاد قفل بر مبناي شماره سريال درايو مورد نظر بود.


در تمامي مقاله ها روش كار بدين صورت خواهد بود كه برنامه يك كد را از كاربر خواهد خواست. در مقاله اول ابتدا روش بدست آوردن شماره سريال بك درايو را ياد خواهيم گرفت.

کد:
Private Declare Function GetVolumeSerialNumber Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long

با معرفي اين تابع در ويژوال بيسيك شما قادر خواهيد بود كه شماره سريال درايوي را كه در lpRootPathName وارد كرده ايد بدست آوريد

کد:
Public Function DiscSerialNumber(ByVal RootPath As String) As String
    Dim VolLabel As String
    Dim VolSize As Long
    Dim Serial As Long
    Dim MaxLen As Long
    Dim Flags As Long
    Dim Name As String
    Dim NameSize As Long
    Dim S As String
    Dim ret As Boolean
    ret = GetVolumeSerialNumber(RootPath, VolLabel, VolSize, Serial, MaxLen, Flags, Name, NameSize)
    If ret Then
        S = Format(Hex(Serial), "00000000")
        DiscSerialNumber = Left(S, 4) + "-" + Right(S, 4)
    Else
        DiscSerialNumber = "0000-0000"
    End If
End Function

تابع بالا كار شما را قدري آسانتر خواهد كرد. پس از بدست آوردن شماره سريال درايو مورد نظر ميتوانيد آن را زيپ كرده و به كاربر بدهيد و پس از ارئه آن از طرف كاربر به شما، شما آن را دوباره زيپ كرده و به كاربر برگردانيد برنامه پس از چك كردن سريال دوبار زيپ شده با مقدار داده شده اگر دو مقدار باهم برابر بودند اجازه استفاده را به كاربر خواهد داد.

و در آخر يك تابع مفيد ديگر براي بدست آوردن درايو سي دي و سريال آن:

کد:
Const DRIVE_CDROM = 5

Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long

Private Declare Function GetVolumeSerialNumber Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long

Public Function GetCdRomDrive() As String
    Dim tmp As Integer
    Dim tmpStr As String
    Dim Drives As String
    Dim CDsCount As Integer
    Dim CDsLetters As String
    Dim ret As Long
    
    Drives = Space(255)
    ret = GetLogicalDriveStrings(Len(Drives), Drives)
    For tmp = 1 To ret Step 4
        tmpStr = Mid(Drives, tmp, 3)
        If GetDriveType(tmpStr) = DRIVE_CDROM Then
            CDsLetters = Left(tmpStr, 3)
            Exit For
        End If
    Next tmp
    GetCdRomDrive = CDsLetters
End Function

در ضمن در مقاله های آینده سعی می کنم شما رو با روش های زیپ کردن ، کد و دیک کردن و در نهایت طریقه شکستن این نوع قفل ها آشنا کنم. البته اگه دوستان مایل بودن Wink
سلام.
عالی بود.
اما در مورد سریال درایو، فکر کنم با فرمت کردن (یا FDisk) یا با استفاده از روش های نرم افزاری عوض بشه. البته فکر کنم، شما خودت استادی.
در کل روش جالبی بود که شماره سریال رو زیپ (فشرده!) کنم و دوباره یه شماره زیپ شده به کاربر برگردونیم.Heart
سلام
من از این کد ها هیچی نفهمیدم!!!
یعنی اگر این کدها توی برنامه ی من باشه روی کامپیوتر کسی دیگه ای اجرا نمی شه؟ لطفا یه مثال بزنید
عالی بود جناب didi ولی منظورتون از زیپ شده همون مقدار کد شده هست؟چرا کدی رو که از سریال بدست اوردیم و زیپ کردیم بدیم به کاربر؟ومنتظر ارائه دوباره اون از کاربر باشیم
(شاید منظورتون چیز دیگست و من بد متوجه شدم)
mohsen_f نوشته است:سلام
من از این کد ها هیچی نفهمیدم!!!
یعنی اگر این کدها توی برنامه ی من باشه روی کامپیوتر کسی دیگه ای اجرا نمی شه؟ لطفا یه مثال بزنید
این تقریبا اساس کار قفلهای تلفنی هستش
بله شما میتونین سریال هارد خودتونو بدین و هنگام شروع برنامه سریال هارد رو با اون مقدار چک کنین که اگه یکی نبود برنامه بسته بشه
سلام
در این مقاله ها سعی دارم کار رو از سطوح ابتدائی شروع کنم .
یعنی روال کار بر این هست که در مرحله اول یک قفل خیلی ساده رو طراحی کنیم و بعد به بررسی نقاط ضعف اون بپردازیم و با توجه به این نقاط ضعف قفل قوی تری طراحی کنیم و باز هم این قفل رو بشکنیم و این کار رو اونقدر ادامه بدیم تا در نهایت به دانش کافی برای طراحی قفل های کارآمد و مقاوم در برابر کراکرها دست پیدا کنیم. ان شاالله

با توجه به این مقدمه طبیعی هست که این قفل اولیه ما کاملا آسیب پذیر باشه و همونطور که آقا سید گفتن با تغییر شماره سریال هارد دیسک یا فرمت کردن هارد ، این قفل متزلزل می شه.

معنی زیپ کردن تقریبا دیکد کردن هست. یعنی در اکثر مواقع همون کد رو مجددا طبق یک فرایند خاص تبدیل به کد جدیدی می کنن که به اون اصطلاحا زیپ کردن می گن و برنامه این کد تغییر شکل یافته رو طبق همون فرایند خاص _ ولی بر عکس عمل می کنه _ به کد اولیه تبدیل می کنه و در صورت صحت کد برنامه فعال می شه.

فکر می کردم این کدها به اندازه کافی ساده و گویا باشن ولی در هر حال یه برنامه ساده هم طراحی کردم تا قضیه ملموس تر بشه. اما اگه بازهم بعضی قسمتها رو خوب متوجه نمی شید اشکالی نداره من به مرور کمکتون می کنم تا همه اینها رو یاد بگیرد.

[attachment=693]
سلام Di Di
کد فعال سازی رو باید چی بزنم؟
داخل سورس برنامه رو دقیق نگاه کن
اون پروسه کلیک بر روی کامند بوتون رو اگه دقت کنی از تابع Decode استفاده می کنه . می تونه قبل از دستور If مقدار اون رو داخب یه تکست باکس دیگه قرار بدی و بعد اون رو کپی کنی.
محسن جان قضیه خیلی ساده است یکم تو بحرش بری حتما می تونی ازش سر دربیاری.
نشد ConfusedConfusedConfused
سلام.
یه راه خیلی راحت: Biggrin
این قسمت
کد:
TrueActCode = 'DeCode(InCode(GetDriveSN()))
تو دکمه رو به
کد:
TrueActCode = "Test"
تغییر بده بعد تو باکس Test رو بنویس.
سلام
خوب این که نمیشه قفل، اینجوری همیشه کد Test است
سلام.
کد دکمه رو به این صورت تغییر بده تا با فشردن اون تو مسیج باکس کد رو بهت نشون بده:
کد:
Private Sub Command1_Click()
'If Text2 <> "" Then
EntryCode = Text2
TrueActCode = DeCode(InCode(GetDriveSN()))

MsgBox TrueActCode
If EntryCode = TrueActCode Then
    MsgBox "ÈÇ ÊÔ˜Ñ ÈÑäÇãå ÔãÇ ÈÇ ãæÝÞíÊ ËÈÊ ÔÏ", vbInformation, "ÈÑäÇãå ÑÌíÓÊÑ ÔÏ"
Else
    MsgBox "˜Ï æÇÑÏ ÔÏå ãÚÊÈÑ äãí ÈÇÔÏ. áØÝÇ ˜Ï ÕÍíÍ ÑÇ æÇÑÏ äãÇÆíÏ", vbCritical, "ÎØÇ"
End If
'End If
End Sub
Exclamation لبته فارسی ها را با همون کد جایگزین کنید، اینجا به هم ریخته.
صفحه‌ها: 1 2 3 4 5