آخرین به روز رسانی در جمعه 24 مهر 1388 ساعت 17:15
نوشته شده توسط مدیر سایت
جمعه 24 مهر 1388 ساعت 17:06
سطح: پیشرفته
یکی از روشهای مرسوم در قفل گذاری نرم افزارها، استفاده از کد یکتای دستگاه مشتری است. برای این منظور باید اطلاعات سخت افزار کامپیوتر مقصد را به دست آوریم. مثلا اطلاعات CPU، Main Board و Hard Disk. برای این منظور در سیستم عامل ویندوز می توانیم از دو تابع API به نامهای GetVolumeInformation و GetSystemInfo کمک بگیریم و با یک الگوریتم ابتکاری یک کد یکتا بر اساس آنها تولید کنیم و آن را به کاربر نشان دهیم. ضمنا باید الگوریتمی برای تولید کد فعالسازی بر مبنای این کد طراحی کنیم تا بتوانیم احراز هویت کنیم. این الگوریتم هم باید در نرم افزاری که در دست مشتری است قرار گیرد و هم خود ما آن را بدانیم تا بتوانیم در ازای درخواست کاربر کد فعالسازی را تولید کنیم (می توان برای آن یک برنامه ساده نوشت که البته فقط در اختیار خود ما به عنوان توسعه دهنده خواهد بود). الگوریتم مذکور می تواند یک الگوریتم رمز گذاری غیر متقارن باشد که به هیچ وجه قابل شکسته شدن نیست. برای رمز گذاری، سیستم عامل ویندوز APIی خاص خودش را دارد که در wincrypt.h یافت می شود (تابع CryptDecrypt). همه این کارها توسط اغلب زبانهای برنامه نویسی تحت ویندوز مثل ویژوال سی و دلفی قابل انجام است. چرا که توابع مذکور در dllهای استاندارد ویندوز قرار دارند.
در کد زیر که در visual c++ نوشته شده است یک برنامه ساده برای تولید کد یکتای وابسته به سخت افزار مشاهده می شود:
SYSTEM_INFO s;
GetSystemInfo(&s);
DWORD SN;
GetVolumeInformation("C:\\", NULL, 0, &SN, 0, 0, 0, 0);//Every hard disk has a C: drive. Get its serial
long tmpCode = SN / 3 + s.dwActiveProcessorMask*10+s.dwAllocationGranularity*220+s.dwNumberOfProcessors*55+
s.dwOemId*5+s.dwPageSize*12+s.dwProcessorType*16+s.dwOemId*19+s.wProcessorLevel*7+
s.wProcessorRevision*18;
int Code = sqrt(tmpCode)*(log(tmpCode)*14+log10(tmpCode)*113);
متغیر Code همان کد یکتا ( یا بهتر است بگوییم وابسته به سخت افزار دستگاه) است که در این مثال به دیسک سخت، مادر برد و سی پی یو وابسته است.