PDA

View Full Version : خبر: ! قفل يا كد فعال ساز برنامه بدون استفاده از دستور شرطي !



vbhamed
جمعه 22 خرداد 1388, 02:30 صبح
سلام

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

اگر قفل موجود بود سپس
اجراي برنامه

در غير اينصورت
خاتمه برنامه


هكر ها هم از همين نکته استفاده مي كنند و دستور شرط شما رو كه كد اسمبلي اون معلومه در فايل برعكس مي كنند و اما يكي از راههاي مقابله با اين كار اينه كه از دستور شرطي استفاده نكنيد ولي چطوري ؟

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

فرض كنيد شما يك كد سيستم داريد كه با استفاده از سريال هارد ديسك به دست اومده و كاربر اون رو به شما مي ده و شما طي الگوريتم خاصي اون رو تبديل به كد فعال ساز (ActivationCode) مي كنيد و به كاربر اعلام مي كنيد

برنامه شما هم به صورت داخلي كد فعال سازي رو خودش توليد مي كنه تا بتونه چك كنه كدي كه كاربر وارد كرده صحيح هست يا خير كه اسم اون رو مي زاريم (ProgramActivationCode)

طبق روش معمول ما دستور زير رو مي نويسيم


If ActivationCode = ProgramActivationCode then
'Run program
Else
'End
Endif

اما مسئله اينه كه براي امنيت بيشتر برنامه در مقابل هك شدن برنامه نبايد از دستور شرطي استفاده بشه
راهي كه پيشنهاد ميدم اينه كه يك تابع كد كننده (Encode) رشته ها با هر الگوريتمي خواستيد بنويسيد كه رشته ورودي و كليد رو بگيره و براساس كليد رشته رو كد كنه فقط طوري نوشته بشه كه اگر كليد برابر پوچ ("") بود خود رشته ورودي رو برگردونه

حالا اگر كد فعال سازي درست باشه و ما محتويات ProgramActivationCode رو از داخل ActivationCode حذف كنيم و نتيجه رو در متغير Key ذخيره كنيم بايد متغير Key برابر رشته پوچ بشه و اين يعني ActivationCode = ProgramActivationCode
براي اين كار چنين دستوري رو مي زاريم


dim Key$
Key = Replace(ActivationCode, ProgramActivationCode,"")


مطمئنا ما در برناممون رشته هايي داريم كه اگر درست نباشن برنامه درست كار نمي كنه مثلا مسير ديتابيس برنامه
كافيه مسير ديتابيس برنامه يك رشته الكي و نادرست باشه اونموقع برنامه با وجود اجرا شدن درست كار نمي كنه
اينجاست كه از تابع Encode استفاده مي كنيد


dbasePath = Encode("C:\Test.mdb", Key)

طبق دستور بالا و توضيحات گفته شده، اگر Key برابر پوچ باشه كه Encode كار خاصي انجام نميده و همون C:\Test.mdb رو توي متغير dbasePath كه مسير بانكمون هست قرار مي ده اما اگر Key پوچ نباشه چون رشته C:\Test.mdb كد ميشه پس مسير برنامه بهم مي‌ريزه و تبديل به يك رشته بي معني ميشه و اين يعني عدم كاركرد صحيح برنامه

اگر از قفل سخت افزاري استفاده مي كنيد هم ميشه از اين روش استفاده كرد چون معمولا قفلهاي سخت افزاري مثل يك حافظه محافظت شده با پسورد هستند، شما يك رشته رو درون قفل ذخيره و بعدا چك مي كنيد كه رشته خوانده شده از قفل برابر همون رشته كه تو برنامتون وجود داره هست يا نه كه در اين حالت رشته درون قفل حكم ActivationCode و رشته توي برنامه حكم ProgramActivationCode رو داره

به غير از مسير ديتابيس رشته هاي زياد ديگري نيز در هر برنامه وجود داره كه اجراي صحيح برنامه وابسته به اونها هست و طبق برنامتون مي‌تونيد از هر كدوم كه خودتون خواستيد استفاده كنيد مثلا دستورات Sql، پيامها و ...

موكدا توصيه ميشه تابع كد كننده رو هم به صورت تابع ننويسيد و هر جا نياز داشتيد عين متن تابع رو بياريد تا امنيت باز هم بالاتر بره

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

ehsanocx
چهارشنبه 27 خرداد 1388, 18:23 عصر
دوست عزیز این قفل رو شما یا VB نوشتید. اون وقت چطور می خواهید به برنامه Autorun که ساختید بچسبونید یا Bind کنید ؟
من این قفل رو نوشتم اما مشکل این دارم که چطوری قفلی که نوشتم رو به فایل Autorun بچسبونم که کسی نتونه فایل قفل رو از فایل Autorun اش جدا کنه . برنامه های exe ذهدیثق زیادی هست اما همشون چون 90% برای ساخت فایل تروجان استفاده می شن . تا قفل رو با فایل Autorun ذهدی می کنی و یروس کش اون رو ویروس می شناسه و اونو پاک میکنه؟ در ضمن مشکل الویت بندی هم هست که چطور می شه بعد بایند کردن الویت بندی کرد که اول فایل قفلی که نوشتم اجرا بشه و تا کد فعال سازی صحیح رو وارد نکرده اتورانی که فایل قفل Bind شده اجرا نشه ؟
میشه راهنماییم کنی و بگی چطوری میشه این مشکلات رو بر طرف کرد ؟
و اگر Exe Binder به این صورت داری می شه در اختیارم بزاری؟

Nima NT
چهارشنبه 27 خرداد 1388, 18:33 عصر
حالا اگر كد فعال سازي درست باشه و ما محتويات ProgramActivationCode رو از داخل ActivationCode حذف كنيم و نتيجه رو در متغير Key ذخيره كنيم بايد متغير Key برابر رشته پوچ بشه و اين يعني ActivationCode = ProgramActivationCodeدوست عزیز شما برای اینکه بررسی کنید ببینید کلید یا رشته پوچ هست یا نه , خوب بازم به شرط نیاز دارید دیگه :لبخند:
در حال حاضر هم چون خود برنامه کد فعالسازی معتبر رو تولید میکنه میشه با روش Serial Fish برنامه رو کرک کرد.

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

tdkhakpur
چهارشنبه 27 خرداد 1388, 18:42 عصر
سلام
شما هر کاری انجام بدید باید از یک دروازه که به شرط ختم میشود عبور کنید.
ولی بازی با الگوریتم قفل کردن باعث امن بودن نیست بلکه موارد زیر رو در برنامه ات باید انجام بدید تا سخت هک بشود.
1- هر چقدر میتوانید ظرفیت فایل اجرایی را بالا ببرید.
2- در یک مکان رمز عبور را چک نکنید عمل چک کردن رمز را در سایر توابع هم بکار ببرید.

Nima NT
چهارشنبه 27 خرداد 1388, 21:37 عصر
1- هر چقدر میتوانید ظرفیت فایل اجرایی را بالا ببرید.
این مورد تاثیر زیادی نداره , فقط میتونه سیستمهای قدیمی رو کمی کند کنه , با وجود این پردازشگرها کسی رو اذیت نمیکنه.

2- در یک مکان رمز عبور را چک نکنید عمل چک کردن رمز را در سایر توابع هم بکار ببرید.
کاملا" درسته , ولی در این مورد اگر از الگوریتمهای متقارن استفاده شده باشه , کراکر اقدام به تولید Keygen میکنه تا کارش راحت تر بشه ولی اگر از الگوریتم غیر متقارن بهره ببرید کار سخت تر میشه.

vbhamed
چهارشنبه 27 خرداد 1388, 21:58 عصر
دوست عزیز شما برای اینکه بررسی کنید ببینید کلید یا رشته پوچ هست یا نه , خوب بازم به شرط نیاز دارید دیگه :لبخند:


سلام

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

روش كار اينه كه ما توسط الگوريتم كد كننده، رشته اصلي رو با استفاده از رشته كليد كد مي كنيم
حال به صورت اتوماتيك در دل الگوريتم كد كننده چنانچه رشته كليد پوچ باشه رشته اصلي كد نميشه چون الگوريتم كد كننده رو اينطوري نوشتيم ولي از شرطي استفاده نميشه كه بگيم اگر كليد پوچ بود سپس خود رشته برگرده

با يك مثال موضوع رو روشن مي كنم


Dim i%

For i = 0 To Len(Key)
'دستورات مربوط به كد شدن رشته
Next


همانطور كه مي بينيد در الگوريتم بالا چنانچه Key = "" باشد پس طول رشته برابر صفر است و الگوريتم كد كننده خود بخود رشته را كد نمي كند
البته مثال بالا فقط براي بيان روش مسئله آورده شده و در عمل پيچيدگيها و شرايط خاص در نظر گرفته ميشه
و منظور ايده انجام كار است

Nima NT
چهارشنبه 27 خرداد 1388, 22:23 عصر
درست ولی فرض کنید رشته دیکد نشد , اون موقع چی کار میکنید ؟

vbhamed
پنج شنبه 28 خرداد 1388, 00:34 صبح
درست ولی فرض کنید رشته دیکد نشد , اون موقع چی کار میکنید ؟

سلام

رشته يا كد ميشه يا نميشه نه ديكد

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

اگر هم كد نشه برنامه بدون مشكل اجرا ميشه

vbhamed
پنج شنبه 28 خرداد 1388, 00:43 صبح
دوست عزیز این قفل رو شما یا VB نوشتید. اون وقت چطور می خواهید به برنامه Autorun که ساختید بچسبونید یا Bind کنید ؟


سلام

اين روش قفلگذاري براي برنامه نويسهاست كه سورس نرم افزار در اختيار خودشونه
اما شما مي تونيد يك برنامه با ويژوال بيسيك بنويسيد كه نرم افزار مورد نظرتون رو از داخل اون اجرا كنيد و براي اينكه كاربر از بيرون نتونه برنامه اصلي رو اجرا كنه فايلش رو كد كنيد و سپس با برنامه ويژوالتون ديكد كنيد و اجرا كنيد، هر چند امنيت اين كار زياد بالا نيست چون اگر كاربر بفهمه برنامه رو كجا و با چه اسمي ديكد كرديد كار تمومه

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

Nima NT
پنج شنبه 28 خرداد 1388, 02:02 صبح
اگر رشته كد بشه به زبان ساده يعني اينكه قفل درست نيست و برنامه كه از اين رشته در جاهاي مختلف استفاده مي كنه به مشكل بر مي خوره، فرض كنيم اگر اين رشته نام بانك باشه و كد بشه همه برنامه به مشكل برخورد مي كنه
الان کاملا" متوجه شدم , قبلا" تو تاپیک زیر یه نمونه از برنامه قفل گذاری شده با این تکنیک گذاشته شده که خوشبختانه کسی نتونست بدون حضور کد معتبر برای اون کد تولید کنه , ولی این برنامه ها یه مشکل دارن و اون هم اینه که اگر یک بار برنامه فروش بره و کد معتبر دست کراکر بیافته کار تمومه.
معمولا" برای چنین حالتی که شرط وجود نداره ( یا شاید هم وجود داره ولی عکس اون تفاوتی نمیکنه ) از روش Keygen استفاده میکنن تا کد معتبر برای برنامه تولید کنن.
برای جلوگیری از این کار هم توصیه میکنم که حتما" از روشهای غیر متقارن استفاده کنید و به یک یا دو الگوریتم رمزنگاری هم اکتفا نکنید و علاوه اگر سورس الگوریتم در دسترستون هست حتما" تغییراتی رو در اون اعمال کنید و از شکل استاندارد اون استفاده نکنید.

تاپیک مربوطه ...
در برنامه دوم و در کل در این تاپیک هدف تولید کد معتبر بوده و نه اینکه کراکر بیاد و شرط رو برعکس کنه , لازم به ذکر هست که در برنامه دوم از الگوریتم متقارن استفاده شده ولی با توجه به حضور لایه های Polymorphic درک کد برای پیشبرد روند معکوس بسیار سخت و در مواردی غیر ممکن هست.
میتونید خودتون ملاحظه بفرمائید...
http://barnamenevis.org/forum/showthread.php?t=158406

مهران رسا
پنج شنبه 28 خرداد 1388, 02:10 صبح
اینم یک روش که از این طریق هم میشه به صورت خیلی ابتدایی و ساده از اجرا شدن فایل های اجرایی جلوگیری کرد .

If Command$ <> "!<run>!" Then End

Shell "MyProtctedApp.exe !<run>!"

ehsanocx
پنج شنبه 28 خرداد 1388, 10:21 صبح
با Exe Binder نمیشه فایل قفل و Autorun رو bind کرد ؟ جواب نمیده آقا وحید ؟

vbhamed
جمعه 29 خرداد 1388, 17:00 عصر
اینم یک روش که از این طریق هم میشه به صورت خیلی ابتدایی و ساده از اجرا شدن فایل های اجرایی جلوگیری کرد .

If Command$ <> "!<run>!" Then End

Shell "MyProtctedApp.exe !<run>!"


سلام
تو اين دستور از شرط استفاده شده و همه بحث اين تاپيك اين هست كه شرط نداشته باشه

vbhamed
جمعه 29 خرداد 1388, 17:02 عصر
الان کاملا" متوجه شدم , قبلا" تو تاپیک زیر یه نمونه از برنامه قفل گذاری شده با این تکنیک گذاشته شده که خوشبختانه کسی نتونست بدون حضور کد معتبر برای اون کد تولید کنه , ولی این برنامه ها یه مشکل دارن و اون هم اینه که اگر یک بار برنامه فروش بره و کد معتبر دست کراکر بیافته کار تمومه.
معمولا" برای چنین حالتی که شرط وجود نداره ( یا شاید هم وجود داره ولی عکس اون تفاوتی نمیکنه ) از روش Keygen استفاده میکنن تا کد معتبر برای برنامه تولید کنن.
برای جلوگیری از این کار هم توصیه میکنم که حتما" از روشهای غیر متقارن استفاده کنید و به یک یا دو الگوریتم رمزنگاری هم اکتفا نکنید و علاوه اگر سورس الگوریتم در دسترستون هست حتما" تغییراتی رو در اون اعمال کنید و از شکل استاندارد اون استفاده نکنید.

تاپیک مربوطه ...
در برنامه دوم و در کل در این تاپیک هدف تولید کد معتبر بوده و نه اینکه کراکر بیاد و شرط رو برعکس کنه , لازم به ذکر هست که در برنامه دوم از الگوریتم متقارن استفاده شده ولی با توجه به حضور لایه های Polymorphic درک کد برای پیشبرد روند معکوس بسیار سخت و در مواردی غیر ممکن هست.
میتونید خودتون ملاحظه بفرمائید...
http://barnamenevis.org/forum/showthread.php?t=158406


سلام

فعلا بحث ما فقط در مورد قسمت چك كردن كد توليدي هست وگرنه توليد كد اصلي با الگوريتمهاي نامتقارن انجام ميشه

reza11_2005
دوشنبه 09 شهریور 1388, 10:05 صبح
باسلام
نمونه آماده شده این آموزش با ویژوال بیسیک دارید که من با آن مقایسه کنم
متشکر می شوم بگذاريد
یاحق

shfans
یک شنبه 22 شهریور 1388, 17:45 عصر
مرسي كارتون درسته اما اگه ميشه يه برنامه براي مثالي كه بشه راحتر فهميد درست كنيد ممنون مي شم يه سورس

Veteran
جمعه 04 آذر 1390, 17:30 عصر
یک سورسی بزارین خیلی خوبه :لبخند: راستش درست متوجه نشدم !
کلید های ورودی رو بگیریم بعد مقایسه کنیم ؟ خب مستقیم مقایسه میکنیم :متفکر:
یک سورس بزارین لطفا

kitcat_m18
جمعه 04 آذر 1390, 18:49 عصر
سلام دوستان،
با توجه به اينكه شما در قفل از شرط استفاده نكرده ايد قفل شما يه مقدار ديرتر شكسته ميشه نه اينكه قابل شكسته شدن نباشه.
اگه بحث درباره اصول قفل گذاري هست لازم مي دونم نكاتي رو ياد آوري كنم:

1- براي قفل گذاري در برنامه بايد از كد گذاري برو روي رشته ها استفاده نمود.
2 - ساختار قفل بسيار مهم مي باشد. الگوريتم مربوطه بايد داراي حروف، علائم و اعداد باشد.
3 - مي توان از تكنيك قفل هاي وابسته يا **** Lock استفاده نمود.
4 - قفل ها را درون شرط هاي برنامه قرار دهيد!
5 - در بحث معماري معكوس چيزي كه به وضوح قابل رويت است : هر قفلي را مي توان شكست، اما زمان و دقت اينكار بسته به سطح دانش شما دارد.
6 - حتما قفل را در رويداد هاي مختلف برنامه براي چك شدن قرار دهيد، اينكار باعث ميشود زمان شكسته شدن قفل شما بسيار بالا رود.
7 - و مهمترين نكته: قفل را وابسته به فايل هاي ديگر كنيد (براي مثال قفل اصلي را به صورت چند تكه در چندين Dll قرار دهيد به اين صورت كه درون هر كدام از DLL ها براي اجراي DLL بعدي هم يك قفل وجود داشته باشد. و به خاطر داشته باشيد كه الگوريتم هر كدام با ديگري متفاوت باشد.)

پيشنهاد من به شما اينه كه با توجه به قوانين بالا شروع با ساخت يك قفل نماييد و هميشه در برنامه هاي خود استفاده كنيد.
نكته: قفل را به صورت ماژولار و كاملا انعطاف پذير طراحي نماييد.
موفق باشيد :لبخندساده: