PDA

نسخه کامل مشاهده نسخه کامل : *آموزش MagicByte Cracking



hakhamanesh
07-03-2007, 23:07
يه آموزش از سوداي خدا بيامرز تو آنريل ديدم برام خيلي جالب بود گفتم اينجا هم بزارم

سلام به دوستان

با توجه به اینکه خیلی ها اصلا چیزی در این مورد نمیدونن و یکی از اصولی ترین روشهای کرک هست بد نیست چیزایی درموردش بگیم ( همه دوستان مشارکت کنند لطفا )


مجیک بایت در واقع اسمی هست که کرکرها گذاشتن و در اصل باید گفت که وقتی یه متغیر در زبان برنامه نویسی به صورت عمومی تعریف میشه و در همه جای برنامه قابل دسترسی هستش

مثلا فرض کنید یه برنامه نویس یه متغیر تعریف میکنه به نام IsRegistered و نوع اون رو Boolean میگیره

اون توی برنامش می آد نام و سریال و ... رو چک میکنه و اگه درست بود اونوقت به متغیر IsRegistered مقدار True میده و در غیر این صورت به اون مقدار False

و در بقیه جاهای برنامه فقط میآد و متغیر IsRegistered رو چک میکنه برای اینکه تشخیص بده که آیا برنامه رجیستر شده هست یا خیر

مثلا وقتی روی پرینت در یه برنامه ای کلیک میکنیم پیغام میده که چون برنامه رجیستر شده نیست پس نمیتونید از قابلیت پرینت استفاده کنید و جای دیگه از همون برنامه وقتی می خواید فایل کار شده رو ذخیره کنید پیغامی دریافت میکنید که چون نسخه ای که شما دارید رجیستر شده نیست پس نمیتونید فایلهای بالای 1 مگا بایت رو ذخیره کنید و از این جور موارد

اولین نکته ای رو که باید توجه کنید اینه که متغیر هایی که طرف تو زبان برنامه نویسی سطح بالا ( مثل دلفی - سی شارپ - وی بی - ... ) استفاده کرده وقتی که کامپایل شدند و به اسمبلی تبدیل شدند بصورت آدرس های حافظه خودشونو نشون میدن

مثلا کد ساده زیر رو که بزبان C هست در نظر بگیرید

int c;
char s;
bool IsRegistered;

خوب اینا وقتی کامپایل شدند کامپایلر به هر کدوم بسته به اندازشون ( به بایت ) یه آدرس حافظه نسبت میده
مثلا
00801213 رو به c میده
00805050 رو به s میده
00809440 رو به IsRegistered میده

و از این به بعد هر کجا که این متغیر ها صدا خوردند ( مثلا مقدار دهی شدند ) به جای نام اونا از این آدرس حافظه استفاده میکنه
به فرض برنامه نویس نوشته
IsRegistered=True
این تو اسمبلی تبدیل میشه به Mov byte ptr DS:[00809440],1

خوب تا اینجا با مفهوم MagicByte آشنا شدیم

توجه شما رو به مثالی از برنامه Winrar جلب میکنم


0043F878 . 803D 94204B00>CMP BYTE PTR DS:[4B2094],0
0043F87F . 75 50 JNZ SHORT WinRAR.0043F8D1
0043F8B4 . 6A 00 PUSH 0 ; /lParam = NULL
0043F8B6 . 68 20344800 PUSH WinRAR.00483420 ; |DlgProc = WinRAR.00483420
0043F8BB . FF35 C84D4C00 PUSH DWORD PTR DS:[4C4DC8] ; |hOwner = 001304D0 ('WinRAR',class='WinRarWindow')
0043F8C1 . 68 9C694A00 PUSH WinRAR.004A699C ; |pTemplate = "REMINDER"
0043F8C6 . FF35 B8204B00 PUSH DWORD PTR DS:[4B20B8] ; |hInst = 00400000
0043F8CC . E8 6F210600 CALL <JMP.&USER32.DialogBoxParamA> ; \DialogBoxParamA


به خط اول توجه کنید
CMP BYTE PTR DS:[4B2094],0
و خط دوم
JNZ SHORT WinRAR.0043F8D1
اگه این پرش شرطی انجام نشه منجر به نمایش پیغام تریال میشه ( "REMINDER" )

خوب شاید اولین کاری که یه تازه کار مثل من بخواد انجام بده اینه که JNZ رو بکنه JMP و یا یکم حرفه ای تر 75 رو بکنه EB

ولی وقتی به خط بالا نگاه میکنیم میبینیم که داره یه خونه از حافظه ( همون متغیر زبان برنامه نویسی ) رو با 0 مقایسه میکنه . اگه تو اون خونه 1 باشه اونوقت JNZ تبدیل به پرش میشه و درواقع پیغام تریال نشون داده نمیشه و انگار برنامه رجیستر شده هست وگرنه اگه تو اون خونه 0 باشه JNZ تبدیل به پرش نمیشه و پرش انجام نمیشه و پیغام تریال نشون داده میشه

خوب پس چه نتیجه ای میگیریم ؟

یه جایی همون اوائل اجرای برنامه Winrar می آد و رجیستر کی رو چک میکنه و اگه درست بود تو خونه 4B2094 مقدار 1 قرار میده و اگه نبود مقدار 0 میزاره توش
خوب کافیه که روی این بایت یه Hardware بریک پوینت On Access بزاریم و برنامه رو از اول اجرا کنیم تا ببینیم کی برنامه وین رر به این آدرس دسترسی پیدا میکنه
به راحتی فهمیده میشه که وی رر یه جایی این کارو میکنه
MOV BYTE PTR DS:[4B2094],AL
که مقدار AL از روی Call قبلش بدست میآد
یعنی این
CALL 0048732C
به داخل اون Call که میریم اینقدر کد حسابی نظرمون رو جلب میکنه


00487352 . 84C0 TEST AL,AL
00487354 74 14 JE SHORT WinRAR.0048736A
00487356 . B0 01 MOV AL,1
00487358 . 8B95 E4FEFFFF MOV EDX,DWORD PTR SS:[EBP-11C]
0048735E . 64:8915 00000>MOV DWORD PTR FS:[0],EDX
00487365 . E9 57010000 JMP WinRAR.004874C1


میبینید که اگه JE انجام نشه به داخل AL مقدار 1 قرار داده میشه
و به انتهای سابروتین با JMP پرش میکنه

خوب پس کافیه که JE رو غیر فعال بکنیم
معمولا 74 14 رو به 90 90 یا همون nop تبدیل میکنیم ولی من برای اینکه بایت کمتری پچ بشه فقط 14 رو که اندازه پرش هست به 00 تبدیل میکنم که باعث میشه به خط زیریش پرش کنه و این یعنی غیر فعال کردن je ( یعنی چه Taken باشه و چه Not Taken به خط بعد پرش میکنه )

خوب حالا بعد از خروج از این سابروتین مقدار AL که 1 هست داخل اون خونه حافظه میشه
MOV BYTE PTR DS:[4B2094],AL

و خونه حافظه مورد نظر ما مقدار 1 میگره و Winrar فکر میکنه که رجیستر شده هست

به همین راحتی
حالا اگه میخواستیم اون JNZ رو اول کار تبدیل به JMP کنیم چقدر درد سر داشتیم
چندین جای دیگه از Winrar هم بود که نیاز به پچ شدن داشت و شاید حتی ما تمام اون موارد رو پیدا نمیکردیم .

بازم تكرار ميكنم اين آموزش رو سودا نوشته نيايد بگيد آموزش ديگران رو دزديده به اسم خودش داره ميزاره

yashar8000
09-03-2007, 12:26
سلام اقا میشه اینارو به صورت پی دی اف بزاری . ای شلوغ چند تا آموزش از سودا داری

SILWESTER
09-03-2007, 15:36
يه آموزش از سوداي خدا بيامرز تو آنريل ديدم برام خيلي جالب بود گفتم اينجا هم بزارم

بازم تكرار ميكنم اين آموزش رو سودا نوشته نيايد بگيد آموزش ديگران رو دزديده به اسم خودش داره ميزاره

حالا چرا خدا بیامرز:laughing: من حدود یک ماه پیشتر تو یه انجمن دیگه دیدم احراز وجود کرده بود. پس زندن;)

hakhamanesh
09-03-2007, 15:46
آموزش هاي سودا كه همه جا ريخته (البته به جز زير زميني هاش ;) )
فعلا حوصله ندارم پي دي افش كنم ميتونيد با همين فرمت html روي هاردتون ذخيره اش كنيد اگر هم خيلي اصرار داريد PDF بشه ميتونيد همين متن رو توي Word كپي كنيد بعد با PDF Factory به پي دي اف تبديلش كنيد.لينك PDF Factory هم توي همين پيسي ورد هست.

hakhamanesh
09-03-2007, 15:51
حالا چرا خدا بیامرز:laughing: من حدود یک ماه پیشتر تو یه انجمن دیگه دیدم احراز وجود کرده بود. پس زندن;)

خدا بيامرزتش كركاي خوبي ريليز ميكرد منتاها طفلي خودشو بازنشست كرده.

persiankitty
09-03-2007, 17:43
منتاها طفلي خودشو بازنشست كرده.


The Stars Will Never Fade
Freddy Lives Somewhere in the Babylon