View Full Version : کار با فایل
aspasp
جمعه 27 دی 1387, 00:18 صبح
سلام دوستان
میخوایم یک مقداری رو تو یک فایل بریزم ؛ با نحوه کار با فایل مشکلی ندارم اما میخوایم فایلی که ایجاد می کنم فقط تو برنامه خودم قابل مشاهد و ویرایش باشه ! راه حلی هست ؟
Saeed_m_Farid
جمعه 27 دی 1387, 01:56 صبح
فقط تو برنامه خودم قابل مشاهد و ویرایش باشه !
اگه منظورتون اينه كه فايل به هيچ وجه از بيرون از برنامه شما قابل مشاهده نباشه نه ممكن نيست! اين موضوع با موجوديت فايل مغايرت داره؛ واسه قابليت عدم مشاهده ميتونين اون مقداري رو كه ميريزين تو فايل كد كنين و بعدا با همون الگوريتمي كه كد كردين فايل رو رمزگشايي كنيد كه كسي از محتويات فايل چيزي دستگيرش نشه ولي هر كاري كنيد نميتونين كار با I/O رو از سيستم عامل و كاربرا مخفي كنين!!!
واسه كارايي كه خيلي امنيتي هستن يا موقتي از بافرهاي حافظه استفاده ميكنن : يه استريم بگيرين كارتون رو انجام بدين و بعد آزادش كنيد.
aspasp
جمعه 27 دی 1387, 03:35 صبح
ممنون از پاسختون ؛ قراره برنامه من یک مقدار مهم رو از تو ریجستری بخونه و بعد اونو تو یک فایل ذخیره کنه و بعد هر چند دقیقه یکبار دوباره همون مقدار رو دوباره از تو ریجستری بخونه و با مقدار ذخیره شده مقایسه کنه
1. ممکن بعد از اینکه من مقدار رو برای اولین بار ذخیره کردم ؛ کاربر بیاد و فایل من رو باز کنه و محتویات اون رو ویرایش کنه
2. اگر از حافظه استفاده کنم ؛ بعد از یکبار ریست یا خاموش شدن کامپیوتر محتویات ذخیره شده در حافظه پاک میشند .
با این شرایط راهی هست که بتونم از فایلم محافظت کنم !
تو ویندوز راهی هست که بشه permission فایل ها رو مثل linux تنظیم کرد ؟
Saeed_m_Farid
جمعه 27 دی 1387, 03:58 صبح
اگه حتما ميخواين از فايل بخونين و بنويسين كه همون رمزگذاري و رمزگشايي بهترين راهه ولي شما ميتونين از همون رجيستري استفاده كنين : يه جايي كه تابلو نباشه (غير از HKEY_LOCAL_MACHINE و HKEY_CURRENT_USER) مقدار جديد رو كپي كنين و از همونجا مقايسه كنيد (واسه رست شدن و برق رفتن و زلزله و آتشفشان و ... ميتونين اول يه فلگ ست كنين و در انتهاي كارتون اون فلگ رو برگردونين كه دفعه بعد بفهمين كه برنامه درست خارج شده يا نه!) . درضمن رجيستري هم بالاخره از فايل سيستم داره استفاده ميكنه!
تو ویندوز راهی هست که بشه permission فایل ها رو مثل linux تنظیم کرد ؟اين سوال شما به سي مربوط نميشه! بيشتر به سيستم عاملها و نوع فايل سيستم و ... برميگرده كه اگه خواستين بايد در اين زمينه بحث بشه و شما بگين كه مطمئنيد هميشه برنامتون رو يه سيستم عامل مشخص و حتما مثلا فايل سيستم FAT32 يا NTFS هست يا ...
aspasp
جمعه 27 دی 1387, 04:43 صبح
ولي شما ميتونين از همون رجيستري استفاده كنين : يه جايي كه تابلو نباشه (غير از HKEY_LOCAL_MACHINE و HKEY_CURRENT_USER) مقدار جديد رو كپي كنين و از همونجا مقايسه كنيد (واسه رست شدن و برق رفتن و زلزله و آتشفشان و ... ميتونين اول يه فلگ ست كنين و در انتهاي كارتون اون فلگ رو برگردونين كه دفعه بعد بفهمين كه برنامه درست خارج شده يا نه!) . درضمن رجيستري هم بالاخره از فايل سيستم داره استفاده ميكنه!
هوم ؛ فکر خوبیه اما کامل نیست ! کافیه برنامه دست یک کرکر بیفته تا در بیاره که من کجا مقدار رو ذخیره می کنم .
سیستم عامل : ویندوز xp و ویستا
درمورد فرمت درایو ها نمیشه نظر داد چون بستگی به کامپیوتر مقصد داره ؛ البته اگه فرمت درایو ها NTFS باشه ، فکر می کنم و ویندوز یه جورایی بشه یک محدودیت هایی گذاشت البته مطمئن نیستم ...
نکته مهم : تمامی کاربرانی که وارد سیستم میشند دسترسی ادمین ندارند ؛ (حالا اگه یکی پیدا شد و خواست هکر بازی در بیاره برای اون هم یه چیزهایی در نظر گرفتم)
aspasp
جمعه 27 دی 1387, 04:50 صبح
البته یه چیزی الان به ذهنم رسید نمیدونم جواب میده یا نه ، یا اصلا کد نویسیش سخته یا آسون ،
میتونم علاوه بر اینکه تو فایل ذخیره می کنم ؛ هم زمان تو ریجستی هم ذخیره کنم و این دو مقدار رو پشتیبان هم قرار بدم
پ.ن : البته یه چیزی هم هست ؛ اگه دسترسی کاربر رو نسبت به ریجستری محدود کنم دیگه نمی تونه تو ریجستری دستکاری کنه ...
Saeed_m_Farid
جمعه 27 دی 1387, 10:37 صبح
میتونم علاوه بر اینکه تو فایل ذخیره می کنم ؛ هم زمان تو ریجستی هم ذخیره کنم و این دو مقدار رو پشتیبان هم قرار بدم
پ.ن : البته یه چیزی هم هست ؛ اگه دسترسی کاربر رو نسبت به ریجستری محدود کنم دیگه نمی تونه تو ریجستری دستکاری کنه ...
دوست عزيز چرا لقمه رو مي پيچوني؟ مگه رمز كردن اطلاعات چقدر سخته؟ الگوريتمهاش همه جا هست و همه دارن از اين روشها استفاده ميكنن :
Cryptography Algorithms (http://www.mach5.com/crypto/algorithms.html)
معروفترين هاش SHA-1, RSA, DES, Base64 و Blowfish هستن؛ مثلا كد Base64 رو ميتوني اين پايين ببيني (فقط درحد پاس دادن پارامتر و گرفتنش بعهده شماست!)
++Encoding and decoding base64 with C (http://www.adp-gmbh.ch/cpp/common/base64.html)
اصلا اگه نمي خواي از يه الگوريتم استاندارد استفاده كني يه روش من درآوردي رو مقدارت پياده كن و تو يه فايل باينري ذخيره كن و موقع نياز همون رو دكود كن! (مثلا هر كاراكتر رو در n ضرب كن و بعلاوه m كن و ...) كه اينطوري الگوريتمش فقط تو ذهن خودت هست و تا به كسي نگي خيلي سخت بشه رمزگشايي كردش...
هوم ؛ فکر خوبیه اما کامل نیست ! کافیه برنامه دست یک کرکر بیفته تا در بیاره که من کجا مقدار رو ذخیره می کنم .خوب معلومه كامل نيست روش تنبلي اش بود اگه اينكار رو نميخواي بكني بايد حداقل يه الگوريتم سادة Crypto رو مقدارت بزني!
Saeed_m_Farid
جمعه 27 دی 1387, 10:55 صبح
درمورد فرمت درایو ها نمیشه نظر داد چون بستگی به کامپیوتر مقصد داره
خوب دقيقا مشكل همينه! چون سيستمهاي مقصد هيچ تضميني نميدن كه فايل سيستم موردنظر شما رو داشته باشن! بنابراين اين روش حتي اگه پياده سازيش هم بكني واسه يكي كار ميكنه واسه اونيكي نه! و ضمنا هيچ توسعه دهنده اي همچين كاري نميكنه وقتي اينهمه روشهاي مطمئن تر هست ...
اين جور كارها واسه امنيت مقادير داخل يه فايل مناسب نيستن و بيشتر براي كنترل دسترسي كاربرها به فايلها و ... طراحي شدن و كاربرد كلي هستن نه موردي.
با تشكر.
aspasp
جمعه 27 دی 1387, 12:43 عصر
نمیدونم چون دقیقا رو رمزنگاری فکر نکردم ؛ شاید جواب بده ، ممنون از جوابت ...
Nima_NF
جمعه 27 دی 1387, 12:43 عصر
بهترین راه همان کد کردن محتویات فایل هست، برای این کار هم نیاز نیست خودتان الگوریتم آن ها را بنویسید به راحتی از Crypto API ویندوز برای این کار استفاده کنید.
مثال ها:
http://www.codeproject.com/KB/security/EncryptionCryptoAPI.aspx
http://www.codeproject.com/KB/security/MFCClassDataEncryption.aspx
این طور فکر نکنید که کدها را در جایی از رجیستری کپی کنید که کسی متوجه نشود کجاست، این کار اصلا نیاز به هکر بودن ندارد، به راحتی با ابزار های مختلف می توان فهمید که برنامه شما چه وقت و در کجا کلیدی را کپی می کند.
تو ویندوز راهی هست که بشه permission فایل ها رو مثل linux تنظیم کرد ؟ بله راه های مختلفی هست.
مثلا می توانید به راحتی با تنظیم فلگ FILE_ATTRIBUTE_ENCRYPTED در تابع ساخت فایل CreateFile این فایل را فقط در دسترس user کنونی قرار دهید.(اگر اشتباه نکنم فقط در NTFS و ویندوزهای 2000 به بالا)
با EncryptFile نیز می توانید فایل های کنونی را کد کنید.
از آنجایی که در صورت نابودی user کنونی بازگرداندن آن تقریبا غیر ممکن هست بهتر هست از سایر روش های encrypt فایل برای user مورد نظر با ایجاد پشتیبان این کار انجام شود.
لینک زیر شامل 4 لینک دیگر هست که با مثال موضوع را نشان می دهد:
http://msdn.microsoft.com/en-us/library/aa364223(VS.85).aspx (http://msdn.microsoft.com/en-us/library/aa364223%28VS.85%29.aspx)
در کل من روش اول یعنی همان Crypto API برای کد کردن محتویان فایل را پیشنهاد می کنم.
C++Lover
جمعه 27 دی 1387, 15:50 عصر
چون اینجا بحث مربوط به برنامه نویسی توی ++C هست و پرتابل بودن تو برنامه نویسی به این زبان مهمه، میخوام یک کتابخانه پرتابل برای Cryptography به نام Crypto++® Library (www.cryptopp.com) رو معرفی کنم که بسیار معروفه و استفاده زیادی ازش میشه.
يه جايي كه تابلو نباشه (غير از HKEY_LOCAL_MACHINE و HKEY_CURRENT_USER) مقدار جديد رو كپي كنين
برای دسترسی به جایی غیر از HKEY_CURRENT_USER احتیاجه که کاربری که برنامه رو اجرا میکنه دسترسی های خاصی داشته باشه (Process and Thread Security Descriptor). بخصوص توی ویستا حتی با یک کاربر admin زمانی که UAC فعاله از اجرای برنامه ای که به این صورت نوشته شده باشه جلوگیری میکنه و تغییرات شما پس از اتمام برنامه بی اثر میشه مگر اینکه requireAdministrator رو توی manifest برنامه گذاشته باشید که در این صورت از کاربر سوال میشه که آیا اجازه دسترسی به این برنامه رو میدید یا نه.
پیروز باشید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.