PDA

View Full Version : ذخیره یک مقدار در dll



mehrpars
جمعه 07 خرداد 1389, 19:30 عصر
سلام ،
باور کنید 213 پست مربوط به dll رو خوندم !!!
میخوام یک مقدار رو از طریق برنامم توی dll ذخیره کنم ، یک مقدار رشته ای
چطور میتونم ؟؟؟

tdkhakpur
جمعه 07 خرداد 1389, 19:35 عصر
میخوام یک مقدار رو از طریق برنامم توی dll ذخیره کنم ، یک مقدار رشته ای
چطور میتونم ؟؟؟

یعنی چی ذخیره کنید؟ میتوانید پارامتر را به راحتی به dll ارسال کنید ولی قرار دادن رشته بصورت ثابت کار آسانی نیست اگر منظورتان قسمت سخت مطلب هست میتوانید proces injenction را جستجو کنید

mehrpars
جمعه 07 خرداد 1389, 19:44 عصر
یعنی چی ذخیره کنید؟ میتوانید پارامتر را به راحتی به dll ارسال کنید ولی قرار دادن رشته بصورت ثابت کار آسانی نیست اگر منظورتان قسمت سخت مطلب هست میتوانید proces injenction را جستجو کنید

آره ، منظورم قسمت سخته هست:اشتباه:
میخوام دائم ذخیره بشه

mehrpars
جمعه 07 خرداد 1389, 19:54 عصر
نظرتون راجع به ساختن یک dll موقع runtime که به تنهایی اون مقدار رو نگهداری کنه چیه ؟؟؟

vcldeveloper
شنبه 08 خرداد 1389, 02:09 صبح
نظرتون راجع به ساختن یک dll موقع runtime که به تنهایی اون مقدار رو نگهداری کنه چیه ؟؟؟
که چی بشه؟ یک DLL اون مقدار رو براتون نگه داره که به چه هدفی برسید؟

mehrpars
شنبه 08 خرداد 1389, 03:27 صبح
که چی بشه؟ یک DLL اون مقدار رو براتون نگه داره که به چه هدفی برسید؟

خوب من میخوام اطلاعاتی مثل mac کلاینت رو توش نگه دارم ، غیر از registry راه بهتری هست ؟
یا شاید استفاده از reg key بهتر هست؟؟؟

Mahmood_M
شنبه 08 خرداد 1389, 03:50 صبح
خوب من میخوام اطلاعاتی مثل mac کلاینت رو توش نگه دارم ، غیر از registry راه بهتری هست ؟
یا شاید استفاده از reg key بهتر هست؟؟؟
اگر هدفتون فقط همین موارد هست بهتره از همون Registery یا یک فایل INI استفاده کنید ، البته فایل DLL هم می تونه مفید باشه ولی دردسرش بیشتره ، با توجه به اینکه در استفاده از رشته درون DLL در زبان دلفی ممکنه کمی با مشکل مواجه بشید و سئولات دیگه ای در ادامه براتون پیش بیاد !
من پیشنهاد می کنم از یک فایل INI استفاده کنید (http://barnamenevis.org/forum/showthread.php?t=79040) ...
موفق باشید ...

mehrpars
شنبه 08 خرداد 1389, 11:15 صبح
با فایلای dll مشکلی ندارم ، pAnsiChar تعریف میکنم رشته هارو ، امنیت این کار واسم حائز اهمیت هست واسه همین از dll میخواستم استفاده کنم .
پس به نظر شما registry بهتر عمل می کنه؟؟؟

afsoon_k77
شنبه 08 خرداد 1389, 15:01 عصر
می تونی یک متغیر سراسری در یکی ازیونیت های DLL ایجاد کنی و دو تابع به نام های Get, Set برای مقدار دهی یا دریافت مقدار متغیر مورد نظرت تعریف کنی و این دو تابع را در برنامه اصلی External کنی


همچنین می تونی از BPL به جای DLL استفاده کنی که کار باهاش آسونتره در این حالت دیگه لازم نیست این دو تابع را بنویسی فقط کافی در برنامه اصلی بعد از اینه BPL را به برنامه ADD کردی نام یونیتی که در اون متغیر سراسریی که تعریف کردی را در قسمت Uses بیاری

موفق باشی

mehrpars
شنبه 08 خرداد 1389, 15:14 عصر
می تونی یک متغیر سراسری در یکی ازیونیت های DLL ایجاد کنی و دو تابع به نام های Get, Set برای مقدار دهی یا دریافت مقدار متغیر مورد نظرت تعریف کنی و این دو تابع را در برنامه اصلی External کنی

موفق باشی

ممنون دوست من ،
این تا زمانی درست هست که برنامه باز باشه و بعد از بسته شدن برنامه ، این مقدار پاک می شه ، من میخوام همیشگی توی فایل ذخیره شه
با set , get نمی شه اینکارو کرد

vcldeveloper
شنبه 08 خرداد 1389, 17:17 عصر
خب، من هنوز متوجه نشدم، ذخیره کردن این مقدار در DLL چه مزیتی رو برای شما ایجاد میکنه؟! ذخیره کردن یک مقدار ثابت در یک DLL مزیت خاصی نسبت به ذخیره کردن آن مقدار در یک فایل معمولی (از هر نوعی) نداره.


امنیت این کار واسم حائز اهمیت هست واسه همین از dll میخواستم استفاده کنم .
امنیتش چه ربطی به DLL داره؟! امنیتش بر میگرده به اینکه اون داده چقدر در دسترس باشه. شما اگر نمیخواید داده ایی به طور عمومی در دسترس باشه، باید برید دنبال رمزنگاری اون داده. DLL به خودی خود، امنیتی برای دسترسی به یک داده براتون به ارمغان نمیاره.
در ضمن، MAC Address یک کارت شبکه یک مقدار فوق سری نیست، و هر برنامه ایی که روی اون کامپیوتر اجرا بشه، میتونه این مقدار رو به دست بیاره.

mehrpars
شنبه 08 خرداد 1389, 19:07 عصر
در ضمن، MAC Address یک کارت شبکه یک مقدار فوق سری نیست، و هر برنامه ایی که روی اون کامپیوتر اجرا بشه، میتونه این مقدار رو به دست بیاره.

البته که فوق سری نیست ، من میخوام فقط مقدارشو از توی فایلم بخونم و فقط برنامه بتونه تغییرش بده
شاید حدس زده باشید که میخوام برای باز نشدن برنامه روی سیستم های دیگه از این روش استفاده کنم (یجور قفل نرم افزاری)
ولی از سئوالات و جوابات ، اینطور بنظر میاد که اشتباه دارم عمل می کنم ؟؟؟؟ درسته ؟؟؟

من میخوام با اتصال کاربر به سرور روی اینترنت ، mac و .. کلاینت رو روی سرور نگه دارم و همچنین روی خود کلاینت ، تا برنامه با همون سیستمی که اکتیو شده باز شه

vcldeveloper
شنبه 08 خرداد 1389, 20:42 عصر
شاید حدس زده باشید که میخوام برای باز نشدن برنامه روی سیستم های دیگه از این روش استفاده کنم (یجور قفل نرم افزاری)
دقت کنید که هر چند به ظاهر MAC Address ثابت هست، ولی میشه با ابزارهایی MAC Address رو تغییر داد.


ولی از سئوالات و جوابات ، اینطور بنظر میاد که اشتباه دارم عمل می کنم ؟؟؟؟ درسته ؟؟؟
برای ذخیره اون مقدار، و دسترسی به آن فقط از طریق برنامه، لازم نیست اون مقدار را در یک DLL (به طور خاص) ذخیره کنید. شما می تونید این مقدار را به صورت رمز شده در یکی از شاخه های رجیستری یا در یک فایل ذخیره کنید. به این ترتیب، فقط برنامه شما که کلید رمزنگاری مربوطه را داره. حالا اینکه از چه الگوریتم رمزنگاری استفاده کنید، کلید رمزنگاری را چطور تولید کنید، یا در کجا نگهداری کنید، یا چطور آن را در برنامه مخفی کنید، و مسائلی از این دست، خودشان موضوعات مجزا و مفصلی هستند، که می تونید در تالار امنیت نرم افزار آنها را مطرح کنید.

حسین شهریاری
شنبه 08 خرداد 1389, 21:04 عصر
سلام


شاید حدس زده باشید که میخوام برای باز نشدن برنامه روی سیستم های دیگه از این روش استفاده کنم (یجور قفل نرم افزاری)
ولی از سئوالات و جوابات ، اینطور بنظر میاد که اشتباه دارم عمل می کنم ؟؟؟؟ درسته ؟؟؟

دوست عزیز فرض کنین یه سیستمی پیدا شد که شما برنامتونا میخاین روش نصب بکنین که اصلا اون سیستم کارت شبکه ای نداره!!! اون موقه تکلیف قفل نرم افزاری شما چی میشه؟ اشتباه که نمیگم؟


دقت کنید که هر چند به ظاهر MAC Address ثابت هست، ولی میشه با ابزارهایی MAC Address رو تغییر داد.


آقای کشاورز اگه بشه بقول شما اونا با روشهایی خاص تغییر هم داد ولی بدلیل یکتا بودن این آدرس در Reset شدن بعدی حتما MAC Address به حالت قبلی باز خواهد گشت.نظر شما چیه؟

mehrpars
شنبه 08 خرداد 1389, 21:54 عصر
دوست عزیز فرض کنین یه سیستمی پیدا شد که شما برنامتونا میخاین روش نصب بکنین که اصلا اون سیستم کارت شبکه ای نداره!!! اون موقه تکلیف قفل نرم افزاری شما چی میشه؟ اشتباه که نمیگم؟

چیه؟

mac فقط یک مثال بود چون در حقیقت قصد دارم تا از سریال cpu و Hdd استفاده کنم

مصطفی ساتکی
شنبه 08 خرداد 1389, 22:40 عصر
اگر کاری رو که کامپوننت ice license کرده رو میخای دوباره انجام بدی از اون استفاده کن یا برو سرسشو ببین.من ازش استفاده کردم خوب جواب میده.میخای از اون استفاده نکنی یه key از سخت افزار سیستم برات میسازه اونو ازش بردار MD5 و hash یه سری رمزنگاری های دیگر رو هم داره و در آخر هم میتونی این اطلاعاتو به انتهای exe برنامت patch کنی.

AliReza Vafakhah
سه شنبه 11 خرداد 1389, 16:22 عصر
برای ذخیره اون مقدار، و دسترسی به آن فقط از طریق برنامه، لازم نیست اون مقدار را در یک DLL (به طور خاص) ذخیره کنید. شما می تونید این مقدار را به صورت رمز شده در یکی از شاخه های رجیستری یا در یک فایل ذخیره کنید. به این ترتیب، فقط برنامه شما که کلید رمزنگاری مربوطه را داره. حالا اینکه از چه الگوریتم رمزنگاری استفاده کنید، کلید رمزنگاری را چطور تولید کنید، یا در کجا نگهداری کنید، یا چطور آن را در برنامه مخفی کنید، و مسائلی از این دست، خودشان موضوعات مجزا و مفصلی هستند، که می تونید در تالار امنیت نرم افزار آنها را مطرح کنید.

آقای کشاورز من هم این مشکل را داشتم که اطلاعات محرمانه نرم افزار را در کجا ذخیره کنم.

اگر اطلاعات در رجییستری ذخیره شود مثل آب خوردن میشه تشخیص داد کجا ذخیره شد , راحت قبل از اجرا برنامه و قبل از اجرای تنظیمات خاص در نرم افزار مربوطه از رجیستری یک Export گرفته میشه و بعد از انجام عملیات مربوط در نرم افزار و اجرا آن هم یک Export دیگه و در نهایت با نرم افزاری مثل Ultra Compare دو فایل Export شده را مقایسه میشه و بعد خطوط تغییر کرده در دو فایل را به دست آورده که خود شامل آدرس های مورد نظر است.

و اما اگه در یکی از درایو ها هم ذخیره شود مثل درایو ویندوز باز هم با نرم افزار هایی که تغییرات صورت گرفته روی درایو را مانیتور می کنند میشه تشخیص داد که چه فایل ذخیره شده کجا ذخیره شده و غیره ..

حالا سوال پیش میاد که ما آدرس مقدار ذخیره شده را پیدا کردیم خوب ممکنه مقدار مربوطه هم Encrypt شده باشده ؛ این طوری به درد نمی خوره ، خیلی راحت مقدار را پاک می کنیم .

من خودم روی این موضوع خیلی فکر کردم اگر اطلاعات در یک Dll یا Exe ذخیره شوند طوری که به فایل مربوطه آسیب نرساند امنیت بیشتری دارد (باز هم میشه تشخیص داد !)

mehrpars
پنج شنبه 13 خرداد 1389, 02:41 صبح
آقای کشاورز من هم این مشکل را داشتم که اطلاعات محرمانه نرم افزار را در کجا ذخیره کنم.



اگر یافتید ، لطفا توضیح بدین:لبخندساده:

Felony
پنج شنبه 13 خرداد 1389, 04:40 صبح
یعنی توضیحات آقای کشاورز کافی نبود ؟ ایشون که کامل توضیح دادن .
ببینید شما رشته مورد نظرتون رو قبل از ذخیره با یه الگوریتم خاص به کد تبدیلش میکنید و بعد در مکان مورد نظر ( فایل یا رجیستری یا ... ) ذخیرش میکنید ، در مورد مانیتور کردن درایو و ... خوب مهم نیست به فرض کاربر آدرس فایل و رشته رو پیدا کنه ، وقتی رشته کد شده و ایشون الگوریتمش رو نداره میخواد چی کار کنه ؟

برای تشخیص دستکاری شدن هم کافیه تو برنامتون رشته رو از فایل بخونید و بر اساس الگوریتمی که رشته رو باهاش کد کردید ، صحت رشته رو بررسی کنید ،اینطوری اگر رشته دستکاری هم شده باشه مطلع خواهید شد .

موفق باشید .

AliReza Vafakhah
پنج شنبه 13 خرداد 1389, 14:10 عصر
در مورد مانیتور کردن درایو و ... خوب مهم نیست به فرض کاربر آدرس فایل و رشته رو پیدا کنه ، وقتی رشته کد شده و ایشون الگوریتمش رو



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

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

موفق باشید ..

Felony
پنج شنبه 13 خرداد 1389, 15:52 عصر
وقتی تمامی تغییراتی که شما بعد از ذخیره رشته مورد نظر انجام داده اید را کاربر پیدا کنه و آنها را به قبل از ذخیره تغییرات ، تغییر بدهد خوب دیگر نیاز نیست به دانستن الگوریتم نیست.
:لبخندساده:راه حل که ارائه شد ، شما خودتون یکم روش کار کنید حتما جواب میگیرید ، من تا شب یک نمونه قرار میدم ( البته نه به همین سادگی که نوضیح دادم ).

Felony
جمعه 14 خرداد 1389, 05:55 صبح
یک نمونه براتون نوشتم ، فایل ضمیمه یک فایل اجرایی و یک فایل dll هست ، ببینید میتونید رمز رو به روشی که گفتید ( بررسی مشخصات قبل و بعد از تغییرات ) پیدا کنید ؟ (رمز به صورت پیش فرض 2010 هست )

اگر همون بود که میخواستید بگید تا سورس رو قرار بدم .

AliReza Vafakhah
جمعه 14 خرداد 1389, 16:21 عصر
آقای تاجیک ممنون

سورس را هم اگه میشه قرار دهید .

اما باز هم ببینید ، با فرض این که این نمونه کد شما پیش فرض کلمه عبور نداشته باشد (کلمه عبور 2010) شما برای ذخیره کلمه عبور با مشکل مواجه هستید .

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

با تشکر .

تصویری که ضمیمه کردم بعد از Change کلمه عبور است و نقاط Highlight بیان گر تغییر در فایل است.

http://barnamenevis.org/forum/attachment.php?attachmentid=50457&stc=1&d=1275654043

Felony
جمعه 14 خرداد 1389, 19:36 عصر
سلام ،
ببینید شما هر کاری که بکنید در هر صورت راهی برای دور زدنش موجود هست ، در این گونه مواقع بحث خوب و بد مطرح نمیشه بلکه بحث سر بد و بدتر هست ، راه حل ارائه شده در نوع خودش قابل قبول هست و روشی ایده آل برای محافظت در برابر کاربرهای معمول .