# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > امنیت در نرم افزار و برنامه نویسی > سوال: به نظر شما ميشه با كول ديسك قفل سخت افزاري ساخت

## majid_vb_2008

سلام دوستان

به نظر شما ميشه اين كارو كرد يا نه البته من يك سورس براي كار با كول ديسك دارم كه اطلاعاتي مثل حجم , شماره سريال , نوع فرمت و .... رو ميشه به دست آورد.

حالا بنظر شما ميشه با اين اطلاعات يك قفل سخت افزاري طراحي كرد.

قبلا از راهنمايي هايي كه مي كنيد متشكرم. :قلب:

----------


## دنیای دلفی

يعني شما سورس كدي داري كه شماره سريال *فيزيكي* يك Flash Memory را بدست مي آورد. جالبه اگر كد را بگذاري و درست باشد كمكت مي كنم تا قفلتو بسازي

خوب به رنگ قرمز توجه كن

----------


## majid_vb_2008

سلام  اينم سورس من البته با vb6 نوشته شده ولي ميشه به دات نت تبديل كرد منم قفل رو براي دات نت ميخوام.

از وقتي كه براي من  گزاشتي و ميگذاري ممنونم :خجالت:

----------


## Nima NT

این کار اصولی نیست , شما اگر بخوای 100 نسخه از محصول خودت رو ارائه کنی باید 100 بار سریال فیزیکی رو بخونی  :متعجب:

----------


## majid_vb_2008

سلام نرم افزار من سفارشي است و قرار نيست 100 ازش كپي كنيم.

حالا اكه اينجوريه قفلهاي usb چجوري كار مي كنه.

از راهنمايي هاتون ممنونم.

----------


## Nima NT

این روش قفل گذاری هیچ امنیتی نداره , قفل سخت افزاری امن اونهایی هستن که مقداری از برنامه کاربر دورن حافظه اونها قرار میگیره.

----------


## majid_vb_2008

چرا امنيت نداره مگه ميشه شماره سريال كول ديسك رو عوض كرد :متفکر: 

اگه راه داره بگين ما هم ياد بگيريم :لبخند:

----------


## Nima NT

نمیدونم بشه این کار رو کرد یا نه ولی میشه کاری کرد که وقتی تابع قراره سریال کول دیسک رو برگردونه , همون مقداری رو برگردونه که من میخوام  :لبخند گشاده!:

----------


## دنیای دلفی

Function GetHDDSerial(Drive : String) : String; // 'C:\', etc
 Var
   VolumeSerialNumber : DWORD;
   MaximumComponentLength : DWORD;
   FileSystemFlags : DWORD;
   SerialNumber : string;
begin
    GetVolumeInformation(PChar(Drive), nil, 0, @VolumeSerialNumber,
                         MaximumComponentLength,FileSystemFlags, nil, 0);
    SerialNumber := IntToStr(VolumeSerialNumber);
    Result:=(SerialNumber);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
    Showmessage(GetHDDSerial('M:'));
end;




اين هم سورس دلفي

----------


## Hossein Moradi

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

----------


## حامد مصافی

با قیمتی کمتر از 100000 ريال می توانید یک قفل سخت افزاری USB همراه با اطلاعات موبوط به نحوه استفاده به همراه ACctiveX و COM و Component و سورس مربوطه را از بازار تهیه فرمائید.

----------


## majid_vb_2008

> این کدها سریال درایو را برمیگردونه نه سریال سخت افزاری رو
> سریال درایو با فرمت و ابزارهای مختلف قابل تغییر و کپی هست


ما كه قرار نيست قفلمون فرمت بشه كه نشه از اين روش استفاده كرد
بعدشم موقع فرمت كردن كه نميشه مشخص كرد كه شماره سريال فلش چي باشه 
پس كسي نميتونه يك كول ديسك جديد با شماره سريال كول ديسك قبلي درست كنه





> با قیمتی کمتر از 100000 ريال می توانید یک قفل سخت افزاری USB همراه با اطلاعات موبوط به نحوه استفاده به همراه ACctiveX و COM و Component و سورس مربوطه را از بازار تهیه فرمائید.



خودم هم خبر داشتم اين موضوع رو من مي خواستم يك قفل درست كنم كه امنيتش فقط خودم سردر بيارم وكي ندونه چجوري كار مي كنه

----------


## h_mohamadi

آن سورس vb  خيلي جالب بود چون با فرمت کردن هم عوض نمي شد اما اين سورس دلفي عوض مي شود

----------


## majid_vb_2008

سلام دوستان

از اساتيد كسي نظر ديگه نداره 

اگه كسي نمونه كدي داره بزاره البته اگر با vb.net باشه عاليه ممنون

----------


## Sh4DoVV

با سلام 
دوست عزیز این نمونه سورس کد رو که با VB نوشته شده رو میتونی استفاده کنید ، در ماژول MemExecute تابعی به نام RunByte هستش که به طور مثال شما بایتهای یک فایل اجرایی رو توی یک متغیر از نوع Byte قرار دادین و توسط این تابه اونها رو به یک پروسس جدید تزریق میکنید و اونو اجرا میکنید . حالا شما اول باید با یک تابع مثل ByteXOR که کدشو در زیر واستون میزارم بایتهای برنامهی اصلیتونو با سریال کول دیسک کد کنید و در Runtime اونو دیکود کنید و توسط ماژولی که گذاشتم اونو اجرا کنید  :چشمک: 

Public Sub ByteXOR(Bytes() As Byte, Password As String)
Dim X As Long
Dim PwsArr() As Byte
Dim PwsSize As Long
Dim idx As Integer
    
    PwsArr = StrConv(Password, vbFromUnicode)
    PwsSize = UBound(PwsArr)
    Rnd (-3)
    
    For X = 0 To UBound(Bytes)
        Bytes(X) = Bytes(X) Xor PwsArr(idx) Xor Int(255 * Rnd)
        If (idx >= PwsSize) Then idx = -1
        idx = (idx + 1)
    Next X
    
    Erase PwsArr
    X = 0
    PwsSize = 0
End Sub


چقدر حرف زدم  :لبخند گشاده!: - بازم اگر مشکلی بود در خدمتم
یا علی :لبخند:

----------


## دنیای دلفی

اون كد VB و دلفي كاملا مشابه هستند اصلا از يك API استفاده مي كنند. چطور ممكنه شماره سريالي كه ويبي بعد از فرمت برمي گردونه با شماره سريالي كه دلفي برمي گردونه فرق كنه . ؟

----------


## majid_vb_2008

سلام
جناب Sh4DoVV  اگه ميشه در مورد ماژول هايي كه گذاشتي بيشتر توضيح بده ممنون.

----------


## h_mohamadi

من چون vb بلد نيستم به خاطر همين سورس دلفي آن را مي خواستم

----------


## Sh4DoVV

> سلام
> جناب Sh4DoVV اگه ميشه در مورد ماژول هايي كه گذاشتي بيشتر توضيح بده ممنون.


 با سلام
شرمنده که دیر جواب دادم
در ماژول های بالا فقط تابع RunBytes مهم هستش که و به این صورت استفاده میشه که شما میاین و محتویات یک فایل اجرایی رو در یک Array از نوع Byte Dim FileBytes() as Byte ذخیره میکنید و توسط تابع RunBytes اونو اجرا میکنید بدون اینکه بخوای یک فایل روی هاردتون ایجاد کنید
Call RunBytes ( FileBytes)
و تابع ByeXOR هم برای کد کردن محتویات فایل اجرایی هستش که دارای 2 پارامتر هستش که یکی همون محتویات فایل اجرایی هستش و دیگری کلید برای کد کردن اطلاعات ، اینو بخاطر این گذاشتم که شما اول میای محتویات فایل اجرایی برنامتو که میخوای محافظت کنی رو با سریال کول دیسک که میشه پارامتر دوم تابع ByteXOR کد کنی و در زمان اجرا توسط همون تابع و با همون سریال دیکو و در آخر توسط تابع RunBytes اجراش کنی
امیدوارم که خوب تونسته باشم توضیح بدم
یا علی :لبخند:

----------


## majid_vb_2008

ممنون ميشم كه يك نمونه كد هم بزاري 

مرسي

----------


## farzadvahdat

با سلام.منم خواستم تو اين بحث شيرين شركت كنم.
من خودم تو پاسكال 4 ساي پيش همون قفل مترجم پارس كه رو فلاپي بود رو طراحي كردم.
سريال ديسكت كه اون زمون با برنامه Copycon قابل كپي برداري بود.
البته به نظر من اگه اين قفل با قفل تلفني همراه بشه پارامترها بيشتر شده و نميگم نميشه بشكنه ولي يكم سخت تر ميشه تا قفلش بشكنه.
درمورد مطلب دوست خوبمون Nima NT كه ميفرمان میشه کاری کرد که وقتی تابع قراره سریال کول دیسک رو برگردونه , همون مقداری رو برگردونه که من میخوام اگه ممكنه سورس كدي به زبان وي بي بدين تا ماهم روش بررسي كنيم.

----------


## majid_vb_2008

سلام 
يعني قفل مترجم پارس هم با شماره سريال ديسكت كار مي كرد يا محتويات ديسكت
چون من خودم قفل اونو با نرم افزار ccaca كپي كردم 
بنظر شما ميشه اين كارو براي كول ديسك هم انجام داد

----------


## mithridates

احتیاج به دست کاری تابه هم نیست زیاد. کافیه رو GetVolumeInformation یه BP بزاری بعد راحت Edit کنی

----------


## Sh4DoVV

با سلام
اینم سورس Cool Crypter که شما یک فایل EXE رو بهش میدین و سریال کول دیسک رو وارد میکنید سپس Protect  رو میزنید . البته در سورس مربوط به Stub یک تابع به نام GetCoolDiskSerial وجود داره که باید کدهای مربوط به بدست آوردن سریال کول دیسک رو در اونجا قرار بدین ، سپس برنامه Stub  رو کامپایل مکنید و در کنار Cool Crypter.exe قرار میدین و بعد فایل مورد نظرتون رو پروتکت میکنید .
بازم اگر مشکلی بود بگین ، تا بتونم راهنمایی میکنم
یا علی  :لبخند:

----------


## grief_dusk

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

----------


## Hossein Moradi

با ابزار Volumeid در سری ابزارهای Sysinternals Suite می شه مثل آب خوردن سریال درایو رو عوض کرد

----------


## tc1000

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

----------


## farzadvahdat

> با سلام
> اینم سورس Cool Crypter که شما یک فایل EXE رو بهش میدین و سریال کول دیسک رو وارد میکنید سپس Protect  رو میزنید . البته در سورس مربوط به Stub یک تابع به نام GetCoolDiskSerial وجود داره که باید کدهای مربوط به بدست آوردن سریال کول دیسک رو در اونجا قرار بدین ، سپس برنامه Stub  رو کامپایل مکنید و در کنار Cool Crypter.exe قرار میدین و بعد فایل مورد نظرتون رو پروتکت میکنید .
> بازم اگر مشکلی بود بگین ، تا بتونم راهنمایی میکنم
> یا علی


درستع کع خیلی از تاریخ پست میگذره ولی من این سورس رو گرفتم ولی نتونستم ازش استفاده کنم.
اگه کسی ازش استفاده کرده لطفا راهنمایی کنه.

----------


## Securebit

با این نرم افزار میتونید فلش دیسک ها رو به دانگل محافظت از نرم افزار تبدیل کنید.

http://www.alkonost.com/antiduplicate

----------


## r00tkit

کلی مطلب نوشت بودم   اما پرید 

در کل نمی شه از فلش مموری استفاده کرد چون اولا داشتن سریال اجباری نیست و دوما می شه تغییر داد 
( حیف ان همه مطلب نوشته رفت :(

----------


## rana-writes

> با این نرم افزار میتونید فلش دیسک ها رو به دانگل محافظت از نرم افزار تبدیل کنید.
> 
> http://www.alkonost.com/antiduplicate


سلام
اين لينكي كه گذاشتين، نسخه ي دموي نرم افزار نيست؟
طبيعتا بعد از يه مدت كه نميشه باهاش كار كرد
تكليف نرم افزاري كه به اين شكل دست مشتري ميديم چي ميشه؟

ممنون ميشم راهنمايي كنين

----------


## Securebit

> سلام
> اين لينكي كه گذاشتين، نسخه ي دموي نرم افزار نيست؟
> طبيعتا بعد از يه مدت كه نميشه باهاش كار كرد
> تكليف نرم افزاري كه به اين شكل دست مشتري ميديم چي ميشه؟
> 
> ممنون ميشم راهنمايي كنين


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

----------


## atige007

اگه کمی به الکترونیک وارد باشید میتونید یک دیوایس یو اس با سریال دلخواه درست کنید

----------


## ahmadi.sa

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

----------


## Service Manual

سلام

به نظر من استفاده از حافظه فلش براي ايجاد قفل سخت افزاري يک کار کاملا اشتباه هست ، براي اينکه راحت ميشه از آي سي ناند اينطور حافظه ها کپي گرفت و اطلاعات کپي شده رو روي نمونه مشابه ريخت و عملا قفل رو کپي کرد ، به تصوير زير دقت کنيد اين يک نمونه حافظه سو اس بي فلش هست :

اين قسمت راه انداز هست که به اون کاري ندارم :


اون سمت فلش آي سي ناند هست که با جدا کردن آي سي از روي مدار راحت ميشه اطلاعات داخلش رو بدون يک بايت کم و زياد خوند و روي آي سي مشابه ريخت :


براي اينکار هم احتياج به يک مبدل TSOP48 و يک پروگرامر داريد :


که داخل تمام تعميرگاه هاي صوتي و تصويري پيدا ميشه .........

البته بايد هر دو فلش از يک برند و يک مدل باشند تا اينکار عملي شود .

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

يا حق

----------


## mtfa65

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

این هم عکس اولی قبل از فرمت:


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

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

----------


## MiRHaDi

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

----------


## MiRHaDi

سلام
دوستان عزیز یک توضیحات مختصری هم بنده عرض کنم

قفل را میسازیم که افراد معمولی با سواد کامپیوتری در حد ICDL یا مقداری بالاتر برنامه ما را کپی نکنند.
نمیتوانیم ادعا کنیم که قفلی ساخته ایم که هیچ بنی بشری نمیتواند آن را کپی کرده و یا آن را دور بزند. فقط کارش را سخت میکنیم که حوصله این کار را نداشته باشد

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

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

دوست عزیز دیگری استفاده از سیستمهایی با پارامترهای بیشتر از جمله سخت افزارهای دیگر مثل سیپیو و رم و هارد را ذکر کردند که در صورت نصب روی vmware و کپی ماشین مجازی کپی میشود

عزیز دیگری استفاده از الگوریتم با محاسبات ریاضی در KeyGen را مطرح کردند. که با استفاده از یک Debuger و HexEdit میشود شرط مساوی را به نامساوی تبدیل و از برنامه استفاده کرد

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

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

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

موفق باشید

----------


## mtfa65

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

----------

