X
تبلیغات
رایتل
چهارشنبه 30 اردیبهشت‌ماه سال 1388 ساعت 01:29 ب.ظ

خوب در این قسمت می خواهیم موضوع جدیدی رو شروع کنیم یعنی  API ها بعد یه مقداری بیشتر وارد جزئیات کدهای اسمبلی میشیم.

(توجه به دلیل اینکه تمام فایلها در persiangig آپلود شدن بعضی مواقع ممکنه قادر به دانلود نباشد در این مواقع چند ساعت بعد دوباره مراجعه نمایید. با تشکر)

خوب طبق معمول برنامه های مورد استفاده :

Ollydbg :  لینک دانلودCmdBar plugin :  لینک دانلودdiE (اختیاری)  :  لینک دانلودCarckTools  :  لینک دانلودلیستی از API های پر کاربرد در کرک  : لینک دانلود
Microsoft Win32 Programmer's Reference (اختیاری) : لینک دانلود

هدف :

Crackme 3  :  لینک دانلود

 

خوب میریم سر کار اصلیمون: اول برنامه رو با PEiD یا DiE چک کنید که پک نشده باشه.

حالا برنامه رو اجرا کنید یک کد الکی بدید مثلا من 12121212 دادم بعد Check  رو بزنید

خوب چه اتفاقی افتاد!! بله اینبار مثل سری قبل نیست و پیامی ظاهر نشد!! خوب پس چه باید کرد؟

اینجاست که باید با مفهوم API آشنا بشیم.

API چیست: API مخفف Application programming Interface می باشد که شامل یکسری توابع از پیش ساخته شده برای ویندوز است و در فایلهای کتابخانه ای (DLL) قرار گرفته اند. که برنامه نویسان بنا به نیازشان از این API ها در برنامه هاشون استفاده میکنند.

چند نمونه از API ها

Edit boxes :
GetWindowTextA
GetWindowTextW
GetDlgItemTextA
GetDlgItemTextW
GetDlgItemInt

Message boxes :
MessageBoxA
MessageBoxW

Registry:
RegCreateKeyA
RegOpenKeyA
RegQueryValue
RegQueryValueEx

سری اول که Edit boxes هست برای گرفتن یه مقدار از کاربر که در برنامه ما هم یکی از همینا بکار رفته برای گرفتن سریال

سری دوم Message boxes برای نمایش یه پیام مثل پیامهایی که قبلا دیدیم

سری سوم Registry  برای کار با رجیستری ویندوز هست

من لیستی از API ها رو تهیه کردم که در اول مقاله هست می  تونید دانلود کنید
البته یه راهنما هم توسط ماکروسافت درست شده که تمام API ها رو با جزئیات کاملتر شرح داده اگذ خواستین اون رو هم دانلود کنید.

نکته: اگر توجه کنید بعضی از API ها با A پایان یافته که برای مقادیر ASCII هست و بعضی W که برای مقادیر Unicode و دربعضی مواقع باید هر دو برسی بشه تا ببینیم کدوم بکار رفته

قبل اینکه کار رو شروع کنیم مطمعن بشین که پلاگین CmdBar  در ollydbg نصب است. برای فهمیدن این موضوع ollydbg را باز کنید و مطمعن بشین نواری مانند نوار در شکل موجود باشد

نکته : اگر این نوار نبود پلاگین cmdbar که در بالا معرفی شده دانلود و هر چ یتوش بود را در پوشه ollydbg\plugin قرار دهید بعد olly  را دوباره اجرا کنید

خوب حالا کمی با API ها آشنا هستیم برنامه رو داخل Ollydbg  باز میکنیم و بعد با کلید F9 اجراش میکنیم(اگر نمی دونید چطور با Ollydbg کار کنید به مقاله های قبلی رجوع کنید). ما می دونیم که برای گرفتن سریال برنامه احتمالا از GetWindowTextA یا GetDlgItemTextA استفاده کرده (در بیشتر موارد اینجور هست)

من در نوار پایین این دستور رو تایپ میکنیم  و بعد اینتر می زنیم(به بزرگی و کوچیکی حروف توجه کنید)

bp GetWindowTextA

و بعد از آن این دستور

bp GetDlgItemTextA

bp مخفف Breakpoint هست که در قسمتهای قبل توضیح دادیم یعنی چی با این دستور یه نقطه توقف در ابتدای کدهای API ذکر شده قرار می دیم و به محض اینکه برنامه بخواد ازشون استفاده کنه برنامه توسط ollybg متوقف شده اختیار برنامه رو دست ما میده و به این شکل می فهمیم کجا برنامه API رو صدا می زنه خوب حالا پنجره برنامه رو بیارید یه کد بدید دکمه Check رو بزنید خوب برنامه اینجا متوقف شد(نقطه شروع API در کتابخانه user32.dll که در شکل علامت زدم) اگر به گوشه پایین سمت راست توجه کنید مانند شکل میبینیم که GetWindowTextA فراخانی شده نکته : لازم به ذکره به این ناحیه که در کادر مشخص هست Stack گفته می شود خوب ما احتیاجی به این قسمت کد نداریم پس با کلید F8 تا دستور RETN میریم و بعد روی دستور RETN نیز F8 رو می زنیم نکته : یه راه ساده تر برای رسیدن به RETN زدن کلیدهای ترکیبی Ctrl+F9 هست حالا اینجا هستیم اینم بدرد نمی خوره می تونیم با زدم Ctrl+F9 تا به RETN بریم و بعد F8 بزنیم حالا اینجا هستیم اینجا هم بدرد نمی خوره باز باید Ctrl+F9 بزنیم تا به RETN بریم و بعد F8 بزنیم(به جز این 2 بار دیگه این کارو بکنین تا به این کد پایین برسیم) خوب اینجا اونجایی که باید باشیم به اون نوشته ها که علامت زدم دقت کنید "You win" "Good man, You now cracking me" این باید نوشته های یه پیام باشه وقتی ما سریال درست میدیم ظاهر بشه و دستور JNZ که قبلشه اگر سریال اشتباه باشه مارو بعد از پیام می فرسته (به پیکان سفید رنگ در عکس پایین توجه کنید قسمتی که مارو پرتاب میکنه POP ESI هست ) خوب ما می تونیم خیلی راحت دستور JNZ رو طبق مقالات قبلی عوض کنیم. ولی من دراین مقاله تصمیم گرفتم دستوراتی که کد را میسازه با هم برسی کنیم تا یه مقاداری با زبان و دستورات اسمبلی آشنا تر بشیم. پس از اینجا به بعد میل خودتونه چون کار ما تقریبا تمومه برسی کدهای اسمبلی (برای فهم بهتر این قسمت باید کمی با یک زبان برنامه نویسی آشنا باشید) : اگر دقت کرده باشید بعد از خارج شدن از آخرین RETN ما به این دستور رسیدیم خوب پس در این قسمت سریال اصلی ساخته میشه و در این قسمت با کدی که ما دادیم مقایسه می شه CMP EAX, [LOCAL.1] JNZ SHORT Crackme_.0040135F خوب از همون اول شروع میکنیم. دستور MOV مثل = میمونه یعنی وقتی میگیم MOV [LOCAL.1], 0 برابر این هست [LOCAL.1] = 0 [LOCAL.1] هم مثل یه متغییر عمل میکنه و اینجا مقدار 0 رو نگه میداره دستور XOR یک دستور بولی هست زیاد به جزئیات این دستور کار نداریم فقط بدونید هر جا در این دستور دو آرگومان برابر باشد مثل XOR EAX, EAX آرگومان خود را که الان EAX است رو برابر 0 قرار می دهد پس دستورات زیر مقادیر EAX ، EDX و ECX رو برابر صفر قرار می دهد XOR EAX, EAX XOR ECX, ECX XOR EDX, EDX نکته : EAX ، EBX ، ECX ، EDX ثبات نام دارند و مانند یک متغییر مقادیری را در خود نگه میدارند که انداره هر کدام 32 بیت می باشد و محاسبات روی این ثباتها انجام می شود نکته : برای دیدن تغییرات این متغییر ها در Ollydbg در این قسمت olly نشان داده می شود(بالا گوشه سمت راست پنجره CPU – main ) حالا دو تا دستور MOV به این صورت داریم MOV EAX, 0E MOV EDX, 0F که معادل این کدا هست (به تغییرات متغییر ها در Olly هم دقت کنید) EAX = 0E EDX = 0F نکته : در اینجا مقدار 0E و 0F را می بینیم این مقادیر در مبنای 16 می باشد در واقع تمام اعداد نشان داده شده در olly در مبنای شانزده یا Hexadecimal می باشد. برای تبدیل این اعداد می توانید از برنامه CrackTools که در بالا گزاشتم یا ماشین حساب ویندوز استفاده کنید. پس در نتیجه دستورات بالا با در نظر گرفتن اعداد در مبنای 10 به این صورت می شوند EAX = 14 EDX = 15 خوب میرسیم این قسمت IMUL EAX, EDX ADD EAX, 57 INC ECX CMP ECX, 5 JNZ SHORT Crackme_.00401335 که نشون دهنده یک حلقه هست. دستور IMUL مخفف Integer Multiply هست و برای ضرب دو عدد استفاد می شود به این صورت که آرگومان اول را در دومی ضرب و در اولی ذخیره می کند و عبارت زیر IMUL EAX, EDX را می توان به این گونه نوشت EAX = EAX * EDX دستور ADD برای جمع دو عدد هست و این عبارت را ADD EAX, 57 به این صورت می شود(در این حالت نیز 57 در مبنای شانزده است و به به مبنای ده تبدیل میکنیم) EAX = EAX + 87 دستور بعدی INC هسد مخفف کلمه Increase یعنی افزایش و یه واحد به آرگومان خود اضافه می کند و دستور INC ECX را میتوان به این صورت نوشت ECX = ECX + 1 می رسیم به دستور شرطی که حلقه را کنترل میکند CMP ECX, 5 JNZ SHORT Crackme_.00401335 دستور CMP دو مقدار را با هم برسی میکند و اگر برابر بود پرچم Z را به مقدار یک تغییر میدهد نکته : یه ثبات 32 بیتی به نام Eflag وجود دارد که 16 بایت اول آن را ثبات پرچمها گویند و وضیت برخی از فعالیت ها مثل محاسبات یا مقایسه ها رو کتنرل میکند نکته : برای برسی تغییرات پرچمها در Olly این قسمت را ببینید در صورتی که ECX برابر 5 شود پرچم Z برابر یک می شود و دستور JNZ هم که در مقالات قبل توضیح دادیم برسی میکند اگر پرچم Z مخالف یک بود به آدرسی که براش تعریف شده پرش می کنید یعنی ابتدای حلقه و در صورت یک شدن پرچم Z دستور JNZ خیچ پرشی انجام نمی دهد و دستور بعد از آن اجرا میشود خوب ما می بینیم که تمام محاسبات در EAX ذخیره می شن و در دستور بعدی یعنی MOV [LOCAL.1], EAX می بینیم که مقدار EAX در [LOCAL.1] قرار می گیرد. نتیجه می گیریم موقعی که به این دستور رسیده باشیم سریال اصلی نیز در EAX ذخیریه شده که برابر 00EA39C9 هست و اگر به مبنای ده تبدیل کنیم برابر 15350217 می شود. دستور بعدی یعنی MOV EAX, DWORD PTR DS:[ESI+78] سریالی که ما وارد کردیم را در EAX ذخیره میکند. بعد اجرا این دستور ثبات EAX را در olly برسی کنید البته توجه داشته باشید که در مبنای 16 است پس باید تبدیل بشود و در آخر سریال اصلی که در [LOCAL.1] قرار دارد با سریالی که ما دادیم و در EAX هست با دستور CMP مقایسه و در صورت برابری پرچم Z برابر یک می شود و بعد دستور JNZ برسی میکند اگر پرچم Z برابر صفر بود پرش انجام می دهد خوب کار ما تمومه ببخشید دیگه اینبار یکمی طولانی شد.. امیدوارد استفاده برده باشید.

امروز هم برنامه مون خیلی ساده هست. اگر دوست داشتین با روشهایی که قبلا گفتیم روش کار کنید ببینین میتونید کرکش کنید. یه عادت خوب اینه که قبل از اینکه برنامه رو بخواین کرکش کنید ازش اطلاعات کسب کنید مثلا با چه زبانی نوشته شده یا با چی پک شده و یکسری جزئیات دیگه که در مقالات بعد میگم  شما برای اینکار از PEiD استفاده میکردید امروز برنامه دیگه ای که کارش تقریبا همینه معرفی کردم برای مواقعی که PEiD درست عمل نکرد. این برنامه DiE هست کار باهاش آسونه خودتون تستش کنید.
del.icio.us  digg  newsvine  furl  Y!  smarking  segnalo