به وبلاگ سید محمد حسینی خوش آمدید

شهر زیبای بلداجی

نحوه کاربرد قفل های سخت افزاری و نرم افزاری
نویسنده : سید محمد حسینی - ساعت ٩:۳٧ ‎ب.ظ روز ۱۳٩٢/٥/۱٤
 

عنوان پروژه :

نحوه کاربرد قفل های سخت افزاری و نرم افزاری

 

تهیه کننده :

سید محمد حسینی

MOHAMMADHOSSEINIA@YAHOO.COM           

مقدمه

 آشنایی با قفل های نرم افزاری و سخت افزاری و اختلاف قفل های نرم افزاری با قفل های سخت افزاری

 

متاسفانه هنوز در کشور ما ایران, نرم افزار جای خود را به عنوان یک محصول صادراتی پیدا نکرده چرا که یکی از دلایل اصلی آن عدم توجه جدی به حمایت از تولید کنندگان نرم افزار می باشد. به هر حال قصد اینجانب از ارایه مقاله, بررسی کم و کاستی های نرم افزار در ایران نیست بلکه طریقه حل مشکل موجود در این بازار نابسامان می باشد. با توجه به کپی های غیرمجازی که روزانه بصورت کاملا عادی و بدون اطلاع سازنده آن صورت می گیرد, جلوگیری از این عمل و کنترل جدی آن امری ضروری و واجب بنظر می رسد. در ادامه مطلب به توضیح درباره قفل های نرم افزاری و سخت افزاری می پردازیم.


آشنایی با قفل های نرم افزاری و سخت افزاری

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

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

با توجه به تعاریف فوق می توان به تفاوت قفل های سخت افزاری و نرم افزاری پی برد. قفل های سخت افزاری با توجه به اضافه کردن یک سخت افزار جدید به کامپیوتر ( اغلب از طریق ارتباط با پورت چاپگر ) برنامه خود را کنترل می کنند. برنامه قبل از اجرا ابتدا با توجه به مراجعه به آدرس سخت افزار نصب شده ( اضافه شده با استفاده از دستور Port ) به سخت افزار مورد نظر خود مراجعه کرده و در صورت یافتن آن, تست های مختلف اعم از تست رمز, خواندن اطلاعات و ... می تواند تصمیم گیری نماید. اما در قفل های نرم افزاری برنامه بدون نیاز به سخت افزار اضافی و با کنترل رسانه ذخیره سازی می تواند تصمیم گیری کند. ضمنا لازم به توضیح است که هدف از طراحی قفل های نرم افزاری/ سخت افزاری این نیست که هیچکس توانایی شکستن ( باز کردن ) آنرا ندارد بلکه مقصود بالا بردن سطح کنترل کپی های غیر مجاز تا حد ممکن می باشد. ( چرا که می دانیم اطلاعات همه در یک سطح نیست. )

طریقه استفاده از قفل نرم افزاری در برنامه مورد نظر

با توجه به نوع کاربرد برنامه ( کوچک وقابل کپی بر روی یک دیسکت, تحت شبکه و ... ) می توانیم از انواع روش هایی که جهت حفاظت از نرم افزار در نظر داریم ( و متعاقبا توضیح داده خواهد شد ) استفاده کنیم. اما مساله قابل بحث این است که چگونه از یک قفل منتخب استفاده نماییم؟

جواب این سوال متغییر و وابسته به شرایط زیر می باشد:

الف: اعتقاد طراح نرم افزار به اینکه کاربر حتما باید آنرا خریداری نماید تا از امکانات آن مطلع گردد.

در این حالت قفل نرم افزاری در ابتدای شروع به کار برنامه کنترل می گردد حتی طراح می تواند در مواقع حساس نیز قفل را مجددا کنترل کند و یا در حالتی که طراح واقعا سخت گیر باشد, می تواند در زمان های مشخصی از وجود قفل اطمینان حاصل نماید ( مثلا هر 4 ثانیه ). البته در این حالت طراح باید روشی را که جهت کنترل قفل استفاده می کند, نیز در نظر بگیرد.

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

طراح در این حالت می بایست در مکان های خاصی از برنامه, قفل را کنترل کند. مثلا در یک برنامه حسابداری می توان تمام بخش های سیستم را آزاد گذاشته ( یعنی برنامه نیازی به قفل نداشته باشد ) اما در صورتی که کاربر مایل به استفاده از امکانات گزارشگیری سیستم باشد, قفل نرم افزاری در خواست گردد. مزیت این روش بر روش قبلی این است که دیگر نیاز به طراحی نسخه نمایشی جهت مشاهده کاربران وجود ندارد.

آشنایی با نحوه قفل گذاری بر روی یک برنامه

الف: طراح به سورس برنامه دسترسی دارد.

در این حالت طراح پس از انتخاب روش قفل گذاری, کافیست آنرا به زبان مورد نظر خود پیاده سازی نموده و در برنامه خود بگنجاند. ( که مکان های قرار دادن قفل در عنوان قبلی توضیح داده شد. )

ب: طراح ( مجری پروژه ) به سورس برنامه دسترسی ندارد.

گاهی اوقات به یکسری برنامه های ارزشمندی برخورد می کنیم که فاقد قفل هستند, بنابراین نیاز به قفل گذاری وجود دارد. ( البته این حالت بیشتر در کشور ما و چند کشور دیگر که در آن ها قانون Copyright معنی ندارد, کاربرد دارد. ) جهت تزریق قفل به این گونه برنامه ها, نیاز به آشنایی کامل به ساختار فایل های اجرایی (EXE, COM, SYS, …) وجود دارد چرا که باید برنامه ای طراحی کنیم تا همانند یک ویروس کامپیوتری به فایل اجرایی مشخصی بچسبد. البته جهت اینکار بهترین زبان برنامه نویسی, اسمبلی می باشد. ( بدلیل توانایی دخالت در روند اجرای برنامه )

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

ضمنا برای بالا بردن سطح امنیت برنامه لازم است تا یکسری کد های ضد دیباگ در برنامه گنجانده شوند. کدهای ضد دیباگ, دستوراتی به زبان اسمبلی هستند که در حالت اجرای عادی برنامه, هیچ تغییری در روند اجرای نمی گذارند بلکه در صورتی که برنامه توسط دیباگرها اجرا گردد ( مورد ارزیابی قرار گیرد ) بتواند از اجرای آن جلوگیری نماید. با اضافه کردن کد های ضد دیباگ به ابتدای برنامه ( یا قبل از کنترل قفل ) می توان احتمال دستکاری در برنامه را پایین آورد. ( نحوه نوشتن کد های ضد دیباگ در پیوست A آورده شده است.)

 

روش های قفل گذاری نرم افزاری و نحوه طراحی آن ها

1- قفل گذاری با استفاده از شماره سریال اصلی دیسکت

همانطور که می دانید, سیستم عامل جهت هر دیسکت یک شماره سریال واحد (UNIQUE) اختصاص می دهد, بطوریکه شماره سریال هر دو دیسکت با هم یکی نیستند. بنابراین همین خود یک راه تشخیص دیسکت کلید ( قفل ) می باشد.

جهت استفاده از این قفل می بایست شماره سریال دیسکت را خوانده و سپس در داخل برنامه آنرا کنترل نماییم. یک راه ساده جهت خواندن شماره سریال, اجرای دستور VOL بصورت شکل مقابل است:

VOL >>C:\DOS\LCK.TMP

بعد با باز کردن فایل LCK.TMP, می توانیم به محتویات آن دسترسی پیدا کنیم. راه دیگر مراجعه به Boot Sector جهت کنترل قفل می باشد.

ضریب اطمینان این قفل در مورد دیسکت ها, 5%-2% بوده و در رابطه با هارد دیسک 60%-50% می باشد. دلیل این اختلاف این است که در حالت قفل دیسکتی با کپی Boot Sector, قفل بر روی دیسکت دیگر قرار خواهد گرفت اما در رابطه با هارد دیسک اینکار به سادگی انجام پذیر نیست.

2- قفل گذاری با استفاده از مشخصات سیستم

در این نوع قفل نرم افزاری, برنامه قبل از اجرا ابتدا مشخصات سیستم را خوانده ( که اینکار از طریق مراجعه به بخش های خاصی از حافظه و یا مراجعه به اطلاعات BIOS انجام می شود. ) سپس آنرا با فایلی که قبلا توسط نویسنده نرم افزار بر روی کامپیوتر کپی گردیده, مقایسه می کند و در صورت عدم برابری, اجرای برنامه پایان می پذیرد.

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

درصد اطمینان این نوع قفل 75%-65% می باشد.

 

3- قفل با استفاده از موقعیت فایل روی هارد دیسک

این نوع قفل فقط بر روی هارد دیسک قابل استفاده بوده و به این صورت است که فایل اجرایی به موقعیت خود بر روی هارد حساس می باشد چرا که قبل از اجرا ابتدا موقعیت خود را از روی سکتورهای ROOT خوانده و سپس شماره کلاستر اشاره گر به خودش را بدست می آورد, سپس آنرا با شماره کلاستری که قبلا توسط برنامه نویس بر روی یکی از فایل های برنامه ( ممکن است بصورت کد شده باشد ) قرار داده شده, مقایسه کرده و در صورت برابر بودن اجرا می شود. این نوع قفل نسبت به قفل قبلی ( شماره 2 ) استفاده کمتری داشته چرا که در صورتیکه برنامه از روی بخشی از هارد به ناحیه دیگری انتقال یابد, اجرا نخواهد شد و این از نظر کاربر بسیار ناپسند می باشد. ( ضمنا امکان Defra, Scandisk, و ... نیز وجود ندارد چرا که شماره کلاستر اشاره گر به فایل تغییر خواهد کرد. )

ضریب اطمینان این نوع قفل نیز 80%-70% می باشد.

4- قفل با استفاده از فرمت غیر استاندارد

این شیوه یکی از رایج ترین قفل های نرم افزاری است که هنوز هم بصورت جدی مورد استفاده قرار می گیرد. برخی از دلایل اهمیت آن عبارتند از:

- امکان استفاده از روش های متفاوت در این روش

- راحتی و سرعت زیاد به هنگام استفاده آن

- وجود ضریب اطمینان بالا و انعطاف پذیری زیاد آن

- عدم وجود نرم افزار خاصی جهت باز کردن این نوع از قفل ها

همان طور که می دانیم سیستم عامل جهت دسترسی به اطلاعات یک دیسکت از فرمت خاصی ( 18 سکتور در هر تراک ) استفاده می کند اما اگر یه تراک به صورت غیر استاندارد فرمت شود, ( مثلا 19 سکتور در تراک ) سیستم عامل دیگر توانایی استفاده از سکتورهای غیرمجاز را نخواهد داشت و بنابراین تمام نرم افزارهای تحت سیستم عامل مزبور نیز از سکتورهای مخفی استفاده نکرده, در نتیجه امکان کپی برداری از آنها بسیار ضعیف است. مانیز از همین روش جهت طراحی قفل مورد نظر مان استفاده می کنیم. بصورتیکه تراک آخر دیسک را بصورت یک سکتوری و با شماره 20 فرمت می کنیم. سپس جهت کنترل دیسکت به سکتور فوق مراجعه کرده و در صورت وجود, کنترل برنامه را پی می گیریم. البته غیر از تغییر شماره سکتور می توان از اندازه غیر مجاز نیز استفاده کرد یعنی بجای اینکه سکتورها را بصورت 512 بایتی فرمت کنیم, از اندازه 1024, 2048 و ... استفاده می کنیم. ( قفل نرم افزاری Copy Control که معروفترین در نوع خود می باشد, از همین روش استفاده می کند. )

این قفل فقط جهت فلاپی دیسک قابل استفاده می باشد و در صد اطمینان در این روش حدود 95%-85% می باشد.

 

5- قفل با استفاده از شماره سریال ساختگی

این روش قفل گذاری که قویترین قفل می باشد, بصورت مخلوطی از روش های 1 و 4 می باشد یعنی ابتدا تراک خاصی را بصورت غیر استاندرد فرمت کرده و سپس اطلاعات خاصی را درون آن قرار می دهند ( شماره سریال فرضی ). این قفل فقط جهت فلاپی دیسک قابل استفاده بوده و ضریب اطمینان آن حدود 98%-90% می باشد.

 

 

 

روش های قفل گذاری سخت افزاری و نحوه  طراحی  آنها

 قفل گذاری کلا به دو روش نرم افزاری و سخت افزاری انجام می شود . قفل سخت افزاری ( Hardware lock ) چنانچه ازسخت افزارخاصی برای قفل گذاری استفاده شود، به آن قفل سخت افزاری می گوییم. این قفلها بعضی به صورت یک رابط، بر روی پورت پارالل سیستم نصب می شوند که البته هر دو نوع آن عملکرد مشابه دارند. بخش اصلی قفل، از یک حافظه قابل پاک شدن تشکیل شده که با توجه به نوع و حجم آن، دارای عملکردی متفاوت می باشد و عمدتا به یکی از دو روش زیر عمل می کند :
الف) روش اول قفل گذاری به این صورت است که تولید کننده نرم افزار یک یا چند بایت از اطلاعات را در قفل نوشته و برنامه در هنگام اجرا آن را چک می کند. در صورتیکه قفل وجود داشته باشد، برنامه به کار خود ادامه می دهد و اگر قفل وجود نداشته باشد و یا اطلاعات خوانده شده از روی قفل صحیح نباشد، برنامه متوقف شده و با اعلام خطا، از اجرای صحیح، سرباز می زند. این نوع قفل ها دارای ساختاری ساده، حافظه ای در حد چند بایت، و قیمتی ارزان هستند. استفاده از این قفل ها بسیار ساده بوده و نیاز به تخصص خاصی ندارد،تنها کافیست که نرم افزار ویژه قفل را ( که توسط شرکت تولید کننده قفل ارائه شده ) اجرا نمود. در ابتدا که قفل فاقد اطلاعات است، اول یک کلمه دلخواه، به عنوان کلمه عبور درخواست کرده و سپس با توجه به نوع قفل، یک یا چند کلمه اطلاعات را دریافت و در حافظه قفل ثبت کنید. در دفعات بعد می بایست کلمه عبوری که اولین بار ثبت شده، وارد شود تا بتوان به اطلاعات

برای جلوگیری از استفاده غیرمجاز از برنامه ها ویا تکثیرغیرقانونی آنها، اصطلا حا به آنها قفل می زنند. قفل گذاری کلا به دو روش نرم افزاری و سخت افزاری انجام می شود . قفل سخت افزاری ( Hardware lock ) چنانچه ازسخت افزارخاصی برای قفل گذاری استفاده شود، به آن قفل سخت افزاری می گوییم. این قفلها بعضی به صورت یک رابط، بر روی پورت پارالل سیستم نصب می شوند که البته هر دو نوع آن عملکرد مشابه دارند. بخش اصلی قفل، از یک حافظه قابل پاک شدن تشکیل شده که با توجه به نوع و حجم آن، دارای عملکردی متفاوت می باشد و عمدتا به یکی از دو روش زیر عمل می کند :
الف) روش اول قفل گذاری به این صورت است که تولید کننده نرم افزار یک یا چند بایت از اطلاعات را در قفل نوشته و برنامه در هنگام اجرا آن را چک می کند. در صورتیکه قفل وجود داشته باشد، برنامه به کار خود ادامه می دهد و اگر قفل وجود نداشته باشد و یا اطلاعات خوانده شده از روی قفل صحیح نباشد، برنامه متوقف شده و با اعلام خطا، از اجرای صحیح، سرباز می زند. این نوع قفل ها دارای ساختاری ساده، حافظه ای در حد چند بایت، و قیمتی ارزان هستند. استفاده از این قفل ها بسیار ساده بوده و نیاز به تخصص خاصی ندارد،تنها کافیست که نرم افزار ویژه قفل را ( که توسط شرکت تولید کننده قفل ارائه شده ) اجرا نمود. در ابتدا که قفل فاقد اطلاعات است، اول یک کلمه دلخواه، به عنوان کلمه عبور درخواست کرده و سپس با توجه به نوع قفل، یک یا چند کلمه اطلاعات را دریافت و در حافظه قفل ثبت کنید. در دفعات بعد می بایست کلمه عبوری که اولین بار ثبت شده، وارد شود تا بتوان به اطلاعات درونی قفل دسترسی داشت. البته بعد از ورود به برنامه این کلمه قابل تغییر است. در هر صورت، پس از ثبت اطلاعات در قفل، تولید کننده نرم افزار، اطلاعات ثبت شده در یک برنلمه چک می کند که نحوه چک کردن اطلاعات، با توجه به نوع قفل متفاوت است. در بعضی فقط اطلاعات درون قفل چک می شود و در بعضی دیگر، در مرحله اول وجود قفل چک شده و در مرحله بعدی، اطلاعات درون آن چک می شود.
ب) روش دیگر قفل گذاری به این صورت است که تولید کننده نرم افزار، بخش کوچکی از برنامه را در حافظه قفل قرار می دهد که در این حالت، چنانچه قفل وجود نداشته باشد برنامه به هیچ وجه، قادر به اجرا و ادامه کار نخواهد بود. این نوع قفل ها، دارای ساختاری کمی پیچیده، حافظه ای بعضا تا چند کیلو بایت، و قیمتی نسبتَََا گران هستند. استفاده از این قفل ها، به سادگی نوع قبلی نیست. البته نحوه کلی کار مشابه روش قبلی است. با اجرای نرم افزار ویژه قفل و وارد نمودن کلمه عبور، باید نام فایلی را که می خواهیم بر روی آن قفل بزنیم، مشخص کنیم، تا بخشی از آن در قفل ثبت گردد. البته در بعضی دیگر از این نوع قفل ها، که حفاظت بیشتری را انجام می دهند، می بایست توسط تولید کننده نرم افزار دقیقا کنترل شود که چه بخش هایی از فایل باید در قفل ثبت گردد که ابته انجام این کار نیاز به تخصص و تجربه کافی دارد، چرا که بعضا ممکن است که خطا در انجام کار، باعث بروز اشکال در برنامه تولیدی بشود. چون با این کار در واقع بخشی از برنامه در قفل ثبت می گردد، واضح است که هر قفل فقط برای یک نسخه از برنامه می تواند مورد استفاده قرار بگیرد و به همین علت کاربرد این قفل، کمتر است. ضمنا نوع دیگری از قفل ها هستند که هر دو روش فوق استفاده می کنند، اما طرفدار چندانی ندارند.
قفل نرم افزاری (SoftwareLock) چنانچه از روش ها و ترفند های نرم افزاری، برای قفل گذاری استفاده شود، به آن قفل نرم افزاری می گوییم. قفل های نرم افزاری دارای تنوع بیشتری بوده و بعضا از لحاظ طراحی و اجرا سلیقه ای و ابتکاری می با شند. اما می توان نحوه عملکرد اکثر آنها را، توسط یکی از 3 روش ذیل، تشریح نمود:
1) محدودیت در تعداد کپی(CopyLimited) در این حالت برنامه نصب کننده نرم افزار، فضای مشخصی در دیسک را با روش خاصی مرمت کرده، و تعداد مجاز نسخه برداری را در آن درج می کند. بدین طریق با هر بار کپی کردن برنامه، یک واحد از این عدد کم می شود و هنگامی که تعداد مجاز آن به صفر رسید، دیگر نمی توان برنامه را بر روی سیستم نصب نمود. حال ممکن است این سوال مطرح شود که مگر نمی توان پس از نصب برنامه، از آن پشتیبانی(Back Up) گرفته و سپس از نسخه پشتیبان نیز، بر روی سیستم دیگری استفاده نمود؟ پاسخ منفی است. زیرا هنگام نصب، اطلاعاتی راجع به سخت افزار سیستم که می تواند مثلا شامل نوع قطعات و یا شماره سریال قطعات باشد، در جایی، در محدوده قفل ذخیره می شود و از این پس هر بار در هنگام اجرای برنامه، این اطلاعات به دقت چک می شود و در صورت هرگونه تغییر، برنامه اجرا نمی شود.
2) استفاده از دیسکت، در هنگام اجرای برنامه (Disk Required) در این حالت، دیسکت مورد نظر، یا به روش خاصی فرمت می شود و سپس در هنگام اجرا، اطلاعات روی آن بررسی می شود، و یا اینکه قسمتی از دیسکت را بصورت فیزیکی و عمدی خراب می کنند و در اینجا، در واقع همان صدمه ای که به عمد، بر سطح دیسکت وارد شده است، به عنوان قفل و محافظ نرم افزار عمل می کند. از این پس برای انتقال برنامه از یک سیستم به سیستم دیگر، این فلاپی مانند قفل سخت افزاری عمل می کند و می بایست مختصات آن توسط برنامه تایید شود و چنانچه این فلاپی در درایو نباشد، برنامه اجرا نخواهد شد.
3) قفل سی دی (اجرا از روی سی دی) با متداول شدن سی دی ویا لوح فشرده، روش جدیدی در قفل گذاری ابداع شد و آن اجرای برنامه از روی سی دی است. در این حالت برنامه هنگام اجرا، به سی دی رجوع کرده و نقاط خاصی از آن را چک می کند. این نقاط بخش هایی هستند که به صورت فیزیکی علامت گذاری شده اند ودر واقع به نوعی صدمه دیده اند و معمولا این خرابی با تابش اشعه لیزر انجام می شود. به این ترتیب به اصطلاح نقاط معینی از سی دی لیزرسوز می شود. این نقطه یا نقاط، به عنوان قفل سی دی عمل می کند و از عمل تکثیر یا کپی برداری و همچنین استفاده غیر مجاز از آن جلوگیری به عمل می آورد.
در خاتمه سوالی که در مورد سه روش فوق الذکر مطرح است، این است که آیا می توان قبل از نصب، از دیسکت ها و سیدی های قفل گذاری شده کپی تهیه کرد و سپس آنها را نصب کرد؟
پاسخ منفی است، زیرا همانگونه که اشاره شد، یا بخشی از دیسکت و یا تمامی ان، به روش خاصی فرمت می شود که قابل کپی برداری نیست و یا اینکه محل ونقاطی که بر روی دیسکت و یا سی دی، به صورت فیزیکی و عمدی صدمه دیده اند، اجازه کپی برداری را نمی دهند و مانع از انجام این کار می شوند.

نحوه ساخت قفل های نرم افزاری

تا وقتی که قانون Copyright نرم افزار در ایران به صورت کامل اجرا نمی شود، لزوم پرداختن به بحث قفل های نرم افزاری بیشتر احساس می شود. در این مقاله سعی بر این است تا علاوه بر آشنایی با انواع قفل های نرم افزاری و بررسی اختلاف آن ها با قفل های سخت افزاری، بتوانیم به عنوان طراح یک قفل نرم افزاری از محصولات نرم افزاری خودمان حمایت کنیم. ضمنا علاوه بر آشنایی با مفاهیم فوق، نوشتن روتین های ضد دیباگ (Debug) و همچنین نحوه کد کردن اطلاعات نیز تا حدی مورد بررسی قرار خواهد گرفت.
 

قفل های نرم افزاری

قفل های نرم افزاری به برنامه هایی گفته می شود که کنترل کپی نمودن آنها فقط از طریق نرم افزار و بدون نیاز به سخت افزار اضافی، قابل انجام باشد. قفل های سخت افزاری به برنامه هایی اطلاق می شود که کنترل کپی نمودن آنها از طریق سخت افزار اضافی (که بر روی سیستم نصب می گردد) صورت می پذیرد.

با توجه به توضیحات فوق می توان به تفاوت قفل های سخت افزاری و نرم افزاری پی برد. قفل های سخت افزاری با اضافه کردن یک سخت افزار جدید به کامپیوتر (اغلب از طریق ارتباط با پورت چاپگر) برنامه خود را کنترل می کنند. برنامه قبل از اجرا، ابتدا با مراجعه به آدرس سخت افزار نصب شده (اضافه شده با استفاده از دستور Port ) به سخت افزار مورد نظر خود مراجعه کرده و در صورت یافتن آن، تست های مختلف اعم از تست رمز، خواندن اطلاعات و ... را انجام داده و در نهایت می تواند تصمیم گیری نماید.

اما در قفل های نرم افزاری برنامه، بدون نیاز به سخت افزار اضافی و با کنترل رسانه ذخیره سازی، تصمیم گیری می کند. ضمنا لازم به توضیح است که هدف از طراحی قفل های نرم افزاری/سخت افزاری این نیست که هیچکس توانایی شکستن (باز کردن ) آن را ندارد بلکه هدف بالا بردن سطح کنترل کپی های غیر مجاز تا حد ممکن می باشد.
 

طریقه استفاده از قفل نرم افزاری

در برنامه مورد نظر با توجه به نوع کاربرد برنامه (کوچک و قابل کپی بر روی یک دیسکت, تحت شبکه و ... ) می توانیم از انواع روش هایی که جهت حفاظت از نرم افزار در نظر داریم (و متعاقبا توضیح داده خواهد شد) استفاده کنیم. اما مساله قابل بحث این است که چه قفلی را انتخاب نمائیم؟ جواب این سوال متغییر و وابسته به شرایط زیر می باشد:

الف: اعتقاد طراح نرم افزار به اینکه حتما باید کاربر آن را خریداری نماید تا از امکانات آن مطلع گردد. در این حالت قفل نرم افزاری در ابتدای شروع به کار برنامه کنترل می گردد حتی طراح می تواند در مواقع حساس نیز قفل را مجددا کنترل کند و یا حتی در حالتی که طراح واقعا سخت گیر باشد، می تواند در زمان های مشخصی نیز از وجود قفل اطمینان حاصل نماید (مثلا هر 4 ثانیه یک بار). البته در این حالت طراح باید روشی را که جهت کنترل قفل استفاده می کند، نیز در نظر بگیرد.

ب: اعتقاد طراح نرم افزار به این که کاربر می تواند از نرم افزار به عنوان نسخه نمایشی نیز استفاده کند. طراح در این حالت می بایست در مکان های خاصی از برنامه، قفل را کنترل کند. مثلا در یک برنامه حسابداری می توان تمام بخش های سیستم را آزاد گذاشت (یعنی در بخش های برنامه قفل  وجود نداشته باشد) اما در گزارشگیری ها قفل گذاشت. یعنی در صورتی که کاربر مایل به استفاده از امکانات گزارشگیری سیستم باشد، قفل نرم افزاری در خواست گردد. مزیت این روش بر روش قبلی این است که دیگر نیاز به طراحی نسخه نمایشی خاصی جهت مشاهده کاربران وجود ندارد.
 

نحوه قفل گذاری بر روی یک برنامه

الف: طراح به سورس برنامه دسترسی دارد. در این حالت طراح پس از انتخاب روش قفل گذاری، کافی است آن را به زبان مورد نظر خود پیاده سازی نموده و در برنامه خود بگنجاند. (که مکان های قرار دادن قفل در عنوان قبلی توضیح داده شد.)

ب: طراح (مجری پروژه) به سورس برنامه دسترسی ندارد. گاهی اوقات به یک سری برنامه های ارزشمندی برخورد می کنیم که فاقد قفل هستند و بنا به دلایلی نیاز به قفل گذاری وجود دارد. (البته این حالت بیشتر در کشور ما و چند کشور دیگر که در آن ها قانون Copyright اجرا نمی شود، کاربرد دارد.)

جهت تزریق قفل به این گونه برنامه ها، نیاز به آشنایی کامل با ساختار فایل های اجرایی (EXE, COM, SYS, …) وجود دارد چرا که باید برنامه ای طراحی کنیم تا همانند یک ویروس کامپیوتری به فایل اجرایی مشخصی بچسبد. البته جهت این کار بهترین زبان برنامه نویسی، اسمبلی می باشد. (به دلیل توانایی دخالت در روند اجرای برنامه و برای مطالعه بیشتر در مورد برنامه نویسی اسمبلی به سایر مقالات سایت میکرو رایانه مراجعه نمایید) البته در رابطه با نحوه نوشتن این گونه برنامه ها، روش های زیادی وجود دارد که خود بحثی مجزا را می طلبد و از حوصله این مقاله خارج است.

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

با اضافه کردن کد های ضد دیباگ به ابتدای برنامه (یا قبل از کنترل قفل) می توان احتمال دست کاری در برنامه را پائین آورد. (نحوه نوشتن کد های ضد دیباگ در زیر آورده شده است.)
 

 

 

روتین های ضد دیباگ Anti Debug Procedures

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

 

الف: غیر فعال کردن وقفه ها جهت جلوگیری از اجرای مرحله به مرحله ( Trace کردن ) برنامه:

می توان وقفه های کنترلر 8359 را غیر فعال ساخت. (در مورد وقفه ها بحث های نسبتا مفصل و کاملی در سایت میکرو رایانه انجام شده برای مطالعه بیشتر دراین مورد به سایر مقالات سایت میکرو رایانه مراجعه نمایید) آدرس این کنترلر 21h بوده و IRQ های 7-0 را کنترل می کند IRQ1 همان وقفه مربوط به صفحه کلید می باشد. پس با غیر فعال کردن این وقفه می توان صفحه کلید را غیر فعال نمود. طریقه استفاده:

CS:0100 E421   IN   AL,21
CS:0102 0C02  OR   AL,02
CS:0104 E621  OUT 21,AL

ب: تغییر بردار وقفه ها

یکی از روش های ساده و راحت جهت ضد دیباگ کردن برنامه ها تغییر برداری است که دیباگر از آن استفاده می کند. (03 ) حتما بخاطر بسپارید که در پایان برنامه دوباره آدرس بردار وقفه تغییر داده شده را بازیابی کنید. طریقه استفاده:

 

CS:0100 EB04 JMP 0106
CS:0102 0000 ADD [BX+SI],AL
CS:0104 0000 ADD [BX+SI],AL
CS:0106 31C0 XOR AX,AX
CS:0108 8EC0 MOV ES,AX
CS:010A 268B1E0C00 MOV BX,ES:[000C]
CS:010F 891E0201 MOV [0102],BX
CS:0113 268B1E0E00 MOV BX,ES:[000E]
CS:0118 891E0401 MOV [0104],BX
CS:011C 26C7064C000000 MOV Word Ptr ES:[000C],0000
CS:0123 26C7064E000000 MOV Word Ptr ES:[000E],0000

 

ج:گیج کردن دیباگر

 این راه یکی از قویترین تکنیک های ضد دیباگ بوده که در آن به وسط یک دستور، پرش می شود و اینکار باعث قفل کردن (Hang) دیباگر خواهد شد. طریقه استفاده:

CS:0100 E421 IN AL,21
CS:0102 B0FF MOV AL,FF
CS:0104 EB02 JMP 0108
CS:0106 C606E62100 MOV Byte Ptr [21E6],00
CS:010B CD20 INT 20

 د: کنترل پرچم های CPU

این روش در برابر دیباگرها بسیار مفید می باشد و به این صورت است که ابتدا پرچم Trace از CPU را خاموش کرده و در بین برنامه آنرا کنترل کنیم. در صورتی که این پرچم روشن شده باشد، مشخص است که دیباگر در پشت صحنه در حال اجراست. طریقه استفاده:

CS:0100 9C PUSHF
CS:0101 58 POP AX
CS:0102 25FFFE AND AX,FEFF
CS:0105 50 PUSH AX
CS:0106 9D POPF

و در بین برنامه از دستورات ذیل استفاده کنید:

CS:1523 9C PUSHF
CS:1524 58 POP AX
CS:1525 250001 AND AX,0100
CS:1528 7402 JZ 152C
CS:152A CD20 INT 20

 ه: متوقف ساختن دیباگر

این روش باعث متوقف شدن دیباگر می شود که با اجرای دستور ساده INT 03 می توان این کار را انجام داد. طریقه استفاده:

CS:0100 B96402 MOV CX,0264
CS:0103 BE1001 MOV SI,0110
CS:0106 AC LODSB CS:0107 CC INT 3
CS:0108 98 CBW
CS:0109 01C3 ADD BX,AX
CS:010B E2F9 LOOP 0106

 

نویسنده : سید محمد حسینی

MOHAMMADHOSSEINIA@YAHOO.COM