1397-12-14 09:58 مشکل در اجرای برنامه (بدون دیتابیس و دارای رمز)
booysusa

 
با درود فراوان

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

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

من یک برنامه ساده نوشته ام که میخواهم مثلا وقتی به دست مشتری رسید یک رمز داشته باشد، و وقتی سریال را برای من فرستاد من کد فعالسازی را برای ایشان بفرستم (البته میدانم روش های بسیار بهتری نیز هست برای رمزنگاری مانند استفاده از .net reactor)

لینک دانلود برنامه من

چون فعلا برنامه من دیتابیس ندارد، میخواهم فقط یک فایل به مشتری بدهم و آن هم فقط فایل exe اجرایی برنامه هست که در پوشه \bin\Debug موجود می باشد

private void frmRegister_Load(object sender, EventArgs e)
{
txtActivation.Text = (HardwareInfo.GetProcessorId().Substring(0, 4) + HardwareInfo.GetHDDSerialNo().Substring(0, 2) + HardwareInfo.GetBIOSserNo().Substring(0, 3)).ToString();
}


من متوجه شدم وقتی کد بالا نباشد برنامه در سیستم مشتری مشکلی پیش نمیاد ولی خب هیچ نوشته ای رو هم بر نمیگردونه که این به کار من نمیاد، وقتی هم کد بالا را مینویسمش به مشکل بر میخورم و در سیستم مشتری با مشکل عدم اجرا مواجه میشم

من کدبالا را تبدیل به استرینگ می کنم و درون txtActivation.Text میریزم، ولی چرا به مشکل بر میخورد متوجه نمیشم، شاید بخاطر این هست که یک فایل HardwareInfo.cs رو درون برنامه درگ کردم ولی روی سیستم مشتری فقط فایل exe رو کپی میکنم بخاطر همین به خطا بر میخورم

تکمیلی:
من یک فایل به نام HardwareInfo.cs درون برنامه درگ کردم، این فایل مشخصات سیستم را از پردازش گر مشتری دریافت می کنم و درون یک تکست باکس به اسم txtActivation.Text میریزه ، چطور میتونم این فایل HardwareInfo.cs رو پیوست برنامه کنم؟ به نحوی که روی سیستم مشتری به مشکل بر نخورد؟

اینم عکس های خطای برنامه در سیستم مشتری






1397-12-14 15:18
حاجی شریفی
مؤسس سایت
 
سلام
مشکل همانطورکه از متن خطا هم مشخص است، از آنجا ناشی میشود که یکی از سریال های شما روی رایانه مقصد کمتر از تعداد کاراکتری که شما داده اید، طول دارد.

مثلا GetProcessorId مقدار null یا "AB3" برمیگرداند درحالی که شما گفته اید 4 کاراکتر اولش جدا شود که این موجب خطا میشود.
اگر کد زیر را امتحان کنید، متوجه میشوید چه اتفاقی رخ داده:
this.txtActivation.Text = HardwareInfo.GetProcessorId() + "-" + HardwareInfo.GetHDDSerialNo() + "-" + HardwareInfo.GetBIOSserNo() ;


برای حالت واقعی تر کدی شبیه این بهتر است:
private void  frmRegister_Load(object  sender, EventArgs e)
{
this .txtActivation.Text = GetHardwareSerial() ;
}

public static string GetHardwareSerial()
{
return MD5(HardwareInfo.GetProcessorId() + "-" + HardwareInfo.GetHDDSerialNo() + "-" + HardwareInfo.GetBIOSserNo()) ;
}

public static string MD5(string text)
{
if (string .IsNullOrEmpty(text)) return string .Empty;

byte [] buffer = System.Text.Encoding.UTF8.GetBytes(text) ;
using (var hash = System.Security.Cryptography.MD5.Create())
{
buffer = hash.ComputeHash(buffer, 0, buffer.Length) ;
}
return BitConverter.ToString(buffer) ;
}


موفق باشید.
1397-12-14 21:01
booysusa

 
سپاسگزارم
با راهنمایی شما متوجه مشکلم شدم (البته فکر میکنم متوجه شدم، ولی به هرحال برنامه کار کرد در سیستم مشتری)
این تیکه کد را که گفتید اصلاح کردم درست شد
به اینگونه نوشتم
txtActivation.Text = (HardwareInfo.GetProcessorId().Substring(0, 5) + HardwareInfo.GetHDDSerialNo().Substring(0, 5)).ToString();


معنی این چی هست جناب شریفی گرامی "-"

این را در برنامه قرار دادم خطا داد
this.txtActivation.Text = HardwareInfo.GetProcessorId() + "-" + HardwareInfo.GetHDDSerialNo() + "-" + HardwareInfo.GetBIOSserNo() ;

این تصویر خطاش هست



این کد قرار دادم
private void frmRegister_Load(object  sender, EventArgs e)
{
this .txtActivation.Text = GetHardwareSerial() ;
}
public static string GetHardwareSerial()
{
return MD5(HardwareInfo.GetProcessorId() + "-" + HardwareInfo.GetHDDSerialNo() + "-" + HardwareInfo.GetBIOSserNo()) ;
}
public static string MD5(string text)
{
if (string .IsNullOrEmpty(text)) return string .Empty;
byte [] buffer = System.Text.Encoding.UTF8.GetBytes(text) ;
using (var hash = System.Security.Cryptography.MD5.Create())
{
buffer = hash.TransformFinalBlock(buffer, 0, buffer.Length) ;
}
return BitConverter.ToString(buffer) ;
}


این تصویر خطاش هست
1397-12-14 21:04
booysusa

 
برخی مواقع کد سی شارپ می نویسم ولی در انجمن بصورت جدا از هم منتشر میشه با اینکه درون Code قرارشون میدم
ببخشید انقدر شلوغ شده نوشته بالا
1397-12-15 21:34
حاجی شریفی
مؤسس سایت
 
سلام
نکته اول اینکه، آن روز بسیار کار داشتم و کد را سریع نوشتم و دو حالت را با هم اشتباه کردم.
بجای متد TransformFinalBlock باید متد ComputeHash را مینوشتم.
کد قبلی را اصلاح کردم.
عضرخواهی میکنم.

نقل قول نوشته شده توسط: booysusa
معنی این چی هست جناب شریفی گرامی "-"

چیز خاصی نیست، همان خط تیره است.
گفتم بگذارید تا سه کدی که داشتید تولید میکردید را بتوانید جداگانه از هم ببینید و متوجه شوید هر کدام چه برگردانده و چند کاراکتر است.
آن زمان، کد شما سه مقدار GetProcessorId و GetHDDSerialNo و GetBIOSserNo را تولید میکردید که یکی خارج از انتظار اولیه شما بود.
اول هدف ام آن بود که ، خروجی شبیه این A123-B456-C789 روی مانیتور دیده شود و متوجه شوید کدام سریال خالی است یا کاراکتر کمتری دارد.
بگذریم ...

نقل قول نوشته شده توسط: booysusa
این تصویر خطاش هست

تازه کدتان را دانلود کردم و دیدم.
متوجه شدم رویداد frmRegister_Activated دارید که در آن متد Encrypt_Activation ای را فراخوانی کرده اید که مثلا کدفعال-سازی را به شیوه عجیبی رمز میکند!
شیوه اش مهم نیست ولی این کد مشکل کوچکی دارد.
یک راست متغییری به نام ch را با طول ثابت میسازد ، بدون توجه به اینکه ورودی چند کاراکتر است.
کافی است طول آرایه برابر طول ورودی باشد:

public string Encrypt_Activation(string str)
{
char[] ch = new char[str.Length ] ;
for (int i = 0; i < str.Length; i++)
{
ch[i] = (char)(str[i] + 10) ;
}

string result = new string(ch) ;
return "M" + result + "Sh" ;
}

گرچه رمزنگاری ابتکاری است ولی ...

با دیدن این کد Encrypt_Activation شما و دیدن برنامه تان، حالا پیشنهاد میکنم به کد قبلی خودم هم یک Replace( "-" , "" ) اضافه کنید.
کد نهایی توابع اصلاح شده ، چیزی شبیه این میشود:
private void  frmRegister_Load(object  sender, EventArgs e)
{
this .txtActivation.Text = GetHardwareSerial() ;
}

public static string GetHardwareSerial()
{
return MD5(HardwareInfo.GetProcessorId() + "-" + HardwareInfo.GetHDDSerialNo() + "-" + HardwareInfo.GetBIOSserNo()) ;
}

public static string MD5(string text)
{
if (string .IsNullOrEmpty(text)) return string .Empty;

byte [] buffer = System.Text.Encoding.UTF8.GetBytes(text) ;
using (var hash = System.Security.Cryptography.MD5.Create())
{
buffer = hash.ComputeHash(buffer, 0, buffer.Length) ;
}
return BitConverter.ToString(buffer).Replace( "-", "" ) ;
}

public string Encrypt_Activation(string str)
{
char [] ch = new char [str.Length] ;
for (int i = 0; i < str.Length; i++)
{
ch[i] = (char )(str[i] + 10) ;
}

string result = new string (ch) ;
return "M" + result + "Sh" ;
}


دقت کنید که کل کدهای شما و فرآیند داخلی برنامه را بررسی نکردم، با کد بالا صفحه اول برنامه تان باز خواهد شد، بقیه را کنترل نکردم.
موفق باشید.
1397-12-16 15:44
booysusa

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

بی نهایت سپاس