PDA

View Full Version : سوال: حفاظت از پورت سریال(USB)



namra1364
سه شنبه 11 تیر 1392, 12:07 عصر
سلام به دوستان عزیز

سوالی داشتم در مورد حفاظت از پورت سریال
من یه برنامه تو #C نوشتم .کار این برنامه ارتباط با پورت USB به شکل سریال هستش که یهسری اطلاعات رو
به یه سخت افزار میفرسته و بالعکس اطلاعات ارسالی رو تو پورت سریال و USB رو همونطور که میدونید به راحتی میشه خوند و یا SPY کرد .من با یه سری از برنامه های مشابه برنامه خودم کار کردم که امنیت بالایی نسبت به این موضوع دارن به این صورت که با هر برنامه مانیتورینگ که بگین اینها رو SPY کردم جالبه بدونید که هیچ دیتایی نشون نمیدن.ولی برنامه خودم رو وقتی مانیتور میکنم خیلی تمیز اطلاعات رو نشون میده. بعضی از این SPYER ها خیلی پیشرفته ان که نیاز به تنظیم Baudrate و دیگر تنظیمات ارتباط سریال ندارن و خودشون انی اطلاعات را با متد های نسبتا پیشرفته تشخیص میدن.

حالا سوال من این جاست کسی میتونه در این زمینه کمکی بمن کنه.اینم بگم که یا پروتکتور های نرم افزاری میشهیه کارهای کرد مثلا به پروتکتور بگیم وقتی فلان برنامه پورت سریال اسپایر run هستش برنامه منو Terminate کن و .... از این حرف ها

ولی من میخام بدونم چطوری میشه کاری کرد بدون این روش از مانیتور کردن و spy کردن پورت سریال جلو گیری
کرد یا اگه مانیتور کرد چیزی نشون ندن. مثل همون برنامه ایی که خودم اول توضیحاتم گفتم.

تو نت هم دارم سرچ میکنم .فعلا چیز دندون گیری پیدا نکردم

منتظر کمک دوستان عزیز هستم

با سپاس:چشمک:

AmirGhasemi
سه شنبه 11 تیر 1392, 13:46 عصر
سلام
اقا اصلا ما كه جواب سوالتو بلد نبوديم ولي سورس پروژه تو بذار ما هم يه حالي كنيم
خيلي وقته دنبال همچين چيزي هستم

jblaox
سه شنبه 11 تیر 1392, 13:51 عصر
بعضی از این SPYER ها خیلی پیشرفته ان که نیاز به تنظیم Baudrate و دیگر تنظیمات ارتباط سریال ندارن و خودشون انی اطلاعات را با متد های نسبتا پیشرفته تشخیص میدن.


هیچ متد پیشرفته ای وجود نداره ، یک لوپ ساده است که روی هر پورت سریالی تمام باد ریت ها را تست میکنه ببینه با کدوم کانکت میشه ، همون میچسبه میره مرحله بعد !!! خیلی ساده خودتم میتونی همین کار برای یرنامه خودت بکنی اما توصیه میکنم این کار نکن ، من تجربه تست عملی دارم مشکلات داره ...




حالا سوال من این جاست کسی میتونه در این زمینه کمکی بمن کنه.اینم بگم که یا پروتکتور های نرم افزاری میشهیه کارهای کرد مثلا به پروتکتور بگیم وقتی فلان برنامه پورت سریال اسپایر run هستش برنامه منو Terminate کن و .... از این حرف ها


درست متوجه نشدم سوالی یا ... ولی بله میشود با The Enigma Protector این کار کرد یعنی بگی اگر فلان برنامه باز بود ان بکش بعد برنامه من باز کن یا تا وقتی برنامه من در حال اجرا است نگذار این برنامه ها بیان بالا و ...

اگر داده شما مهم ، خوب ان کد کن بعد بفرست روی پرت سریال ، البته باید الگوریتم های یک طرفه مثلا MD5 و... به کار نبری چون انها یک طرفه هستند ، و ...

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

من کلی در این باب تجربه دارم ، سوالی بود مطرح کنید

موفق باشید

jblaox
سه شنبه 11 تیر 1392, 13:52 عصر
سلام
اقا اصلا ما كه جواب سوالتو بلد نبوديم ولي سورس پروژه تو بذار ما هم يه حالي كنيم
خيلي وقته دنبال همچين چيزي هستم


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

http://ouo.ir/serial-port-monitor.html

namra1364
جمعه 14 تیر 1392, 18:28 عصر
با تشکر از شما دوست عزیز
در مورد قسمت اول پاسخ شما دوست عزیز
کمی بیشتر توضیح بدید ممنون میشم منظورتون از این که با یک لوپ ساده این کار انجام میشه یعنی چی؟
مثلا برنامه Advance serial port monitor رو دید حتما.
اینم میدونید اگه میزان baud غلط انتخاب بشه اطلاعات نادرست نمایش داده میشه ولی اینکه چطوری دقیقا baud مورد نظر بدست میاد بنظرم تکنیک جالبی اومد
در هر صورت اگه بتونید توضیح بیشتری بدید ممنون میشم

و اما در مورد بقیه جواب اون قسمت من گزاره خبری بود نه سوالی .
در مورد کد گذاری محدودیتهای سخت افزاری دارم یعنی مثلا همون md5 که گفتی تو سخت افزار من با کلاک 20 مگ و حافظه فلش 128 کیلو بایتی و پردازش بلا درنگ همچین چیزی تقریبا غیر ممکنه . گرچه پیشنهاد بسیار ارزشمندی هستش. و از طرفی اصلا فرایند کد گذاری در مبدا و مقصد آخرین مرحله پیاده سازی خواهد بود.یعنی آخرین راه حل من هستش..اگه اشتباه نکنم باید از روشهای برگشت پذیر هم استفاده کنم چون اصل اطلاعات رو هم نیاز دارم یه چیزی شبیه AES .
بگذریم که اصل سوالم هنوز بی جواب مونده . حالا شما دوست عزیز میتونی روشی یا کنترلی یا dll رو معرفی کنی که بتونه امنیت نمایش اطلاعات رو بالا ببره ممنون میشم.
یعنی اگه پورت سریال مانیتور شد چیزی دیده نشنه در این زمینه اگه اطلاعات دارید پیشاپیش از راهنماییتون ممنون هستم.

از این که وقت گذاشتی سپاسگزارم

namra1364
جمعه 14 تیر 1392, 21:25 عصر
با سلام مجدد
دوستان کسی نظری نداره ؟
یا موضوع رو خیلی خوب نتونستم توضیح بدم ؟


لطفا کمک فکری کنید.:متفکر:

jblaox
شنبه 15 تیر 1392, 10:00 صبح
بگذریم که اصل سوالم هنوز بی جواب مونده . حالا شما دوست عزیز میتونی روشی یا کنترلی یا dll رو معرفی کنی که بتونه امنیت نمایش اطلاعات رو بالا ببره ممنون میشم.
یعنی اگه پورت سریال مانیتور شد چیزی دیده نشنه در این زمینه اگه اطلاعات دارید پیشاپیش از راهنماییتون ممنون هستم.


سلام

نه من تا به حال این کار نکردم (چون راه مناسبی نیست)، اگر میخواهی این کار بکنی به ویندوز باید بگی که یک پورت فقط به یک برنامه اجازه بده که گوش بده (عملا راحت میشود دور زد به گونه ای که نفهمد) ، اما از نظر سخت افزاری و نرمافزاری شما میتوانی n100 گیرنده را روی پورت کام با هم اجرا کنی! بهتر دنبال این کلید واژه ها باشی Block+Ports+Listening

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

توصیه هم همون رمز نگاری ، اگر توان پردازش خیلی کمی دارید از الگوریتم Twofish استفاده کنید یا ، RC4 یا ... نیاز با یک الگوریتم خفن نیست بلکه یک الگوریتم ساده ابتکاری ، این الگوریتم ها چون قانون مشخصی نداره معمولا گنگ تر از شیوه های آماده هستند که در اینترنت یافت میشود، ...

این برای ایده گرفتن میگویم .

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

در C#‎‎‎ هم برعکس انجام بده ...


using System;
using System.Data;
using System.Security.Cryptography;
using System.IO;


public class SimpleAES
{
// Change these keys
private byte[] Key = { 123, 217, 19, 11, 24, 26, 85, 45, 114, 184, 27, 162, 37, 112, 222, 209, 241, 24, 175, 144, 173, 53, 196, 29, 24, 26, 17, 218, 131, 236, 53, 209 };
private byte[] Vector = { 146, 64, 191, 111, 23, 3, 113, 119, 231, 121, 2521, 112, 79, 32, 114, 156 };


private ICryptoTransform EncryptorTransform, DecryptorTransform;
private System.Text.UTF8Encoding UTFEncoder;

public SimpleAES()
{
//This is our encryption method
RijndaelManaged rm = new RijndaelManaged();

//Create an encryptor and a decryptor using our encryption method, key, and vector.
EncryptorTransform = rm.CreateEncryptor(this.Key, this.Vector);
DecryptorTransform = rm.CreateDecryptor(this.Key, this.Vector);

//Used to translate bytes to text and vice versa
UTFEncoder = new System.Text.UTF8Encoding();
}

/// -------------- Two Utility Methods (not used but may be useful) -----------
/// Generates an encryption key.
static public byte[] GenerateEncryptionKey()
{
//Generate a Key.
RijndaelManaged rm = new RijndaelManaged();
rm.GenerateKey();
return rm.Key;
}

/// Generates a unique encryption vector
static public byte[] GenerateEncryptionVector()
{
//Generate a Vector
RijndaelManaged rm = new RijndaelManaged();
rm.GenerateIV();
return rm.IV;
}


/// ----------- The commonly used methods ------------------------------
/// Encrypt some text and return a string suitable for passing in a URL.
public string EncryptToString(string TextValue)
{
return ByteArrToString(Encrypt(TextValue));
}

/// Encrypt some text and return an encrypted byte array.
public byte[] Encrypt(string TextValue)
{
//Translates our text value into a byte array.
Byte[] bytes = UTFEncoder.GetBytes(TextValue);

//Used to stream the data in and out of the CryptoStream.
MemoryStream memoryStream = new MemoryStream();

/*
* We will have to write the unencrypted bytes to the stream,
* then read the encrypted result back from the stream.
*/
#region Write the decrypted value to the encryption stream
CryptoStream cs = new CryptoStream(memoryStream, EncryptorTransform, CryptoStreamMode.Write);
cs.Write(bytes, 0, bytes.Length);
cs.FlushFinalBlock();
#endregion

#region Read encrypted value back out of the stream
memoryStream.Position = 0;
byte[] encrypted = new byte[memoryStream.Length];
memoryStream.Read(encrypted, 0, encrypted.Length);
#endregion

//Clean up.
cs.Close();
memoryStream.Close();

return encrypted;
}

/// The other side: Decryption methods
public string DecryptString(string EncryptedString)
{
return Decrypt(StrToByteArray(EncryptedString));
}

/// Decryption when working with byte arrays.
public string Decrypt(byte[] EncryptedValue)
{
#region Write the encrypted value to the decryption stream
MemoryStream encryptedStream = new MemoryStream();
CryptoStream decryptStream = new CryptoStream(encryptedStream, DecryptorTransform, CryptoStreamMode.Write);
decryptStream.Write(EncryptedValue, 0, EncryptedValue.Length);
decryptStream.FlushFinalBlock();
#endregion

#region Read the decrypted value from the stream.
encryptedStream.Position = 0;
Byte[] decryptedBytes = new Byte[encryptedStream.Length];
encryptedStream.Read(decryptedBytes, 0, decryptedBytes.Length);
encryptedStream.Close();
#endregion
return UTFEncoder.GetString(decryptedBytes);
}

/// Convert a string to a byte array. NOTE: Normally we'd create a Byte Array from a string using an ASCII encoding (like so).
// System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
// return encoding.GetBytes(str);
// However, this results in character values that cannot be passed in a URL. So, instead, I just
// lay out all of the byte values in a long string of numbers (three per - must pad numbers less than 100).
public byte[] StrToByteArray(string str)
{
if (str.Length == 0)
throw new Exception("Invalid string value in StrToByteArray");

byte val;
byte[] byteArr = new byte[str.Length / 3];
int i = 0;
int j = 0;
do
{
val = byte.Parse(str.Substring(i, 3));
byteArr[j++] = val;
i += 3;
}
while (i < str.Length);
return byteArr;
}

// Same comment as above. Normally the conversion would use an ASCII encoding in the other direction:
// System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
// return enc.GetString(byteArr);
public string ByteArrToString(byte[] byteArr)
{
byte val;
string tempStr = "";
for (int i = 0; i <= byteArr.GetUpperBound(0); i++)
{
val = byteArr[i];
if (val < (byte)10)
tempStr += "00" + val.ToString();
else if (val < (byte)100)
tempStr += "0" + val.ToString();
else
tempStr += val.ToString();
}
return tempStr;
}
}


به این نگاه کن ، فقط به فکر رمز نگاری باش :

http://serialmon.com

namra1364
یک شنبه 16 تیر 1392, 19:52 عصر
با سلام خدمت شما دوست عزیز

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

با سپاس