تبليغاتX
HackMind
All About Computer
آموزش کرک نرم افزار قسمت سوم 

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

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

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

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

هدف :

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

 

امروز هم برنامه مون خیلی ساده هست. اگر دوست داشتین با روشهایی که قبلا گفتیم روش کار کنید ببینین میتونید کرکش کنید. یه عادت خوب اینه که قبل از اینکه برنامه رو بخواین کرکش کنید ازش اطلاعات کسب کنید مثلا با چه زبانی نوشته شده یا با چی پک شده و یکسری جزئیات دیگه که در مقالات بعد میگم  شما برای اینکار از PEiD استفاده میکردید امروز برنامه دیگه ای که کارش تقریبا همینه معرفی کردم برای مواقعی که PEiD درست عمل نکرد. این برنامه DiE هست کار باهاش آسونه خودتون تستش کنید.

خوب میریم سر کار اصلیمون: اول برنامه رو با 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 شود پرچم  برابر یک می شود و دستور 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 برابر صفر بود پرش انجام می دهد

خوب کار ما تمومه

ببخشید دیگه اینبار یکمی طولانی شد..

امیدوارد استفاده برده باشید.

اگر پیشنهاد یا مشکلی داشتین خوشحال می شم که بگین

 

|+| نوشته شده توسط آرش در چهارشنبه بیست و سوم خرداد 1386 | موضوع: آموزش کرک
بالا