آنالیز و کشف الگوریتم (2)
3 تا فایل دیگه برای آنالیز در اینجا قرار میدم.
مثل قبل اول خودتون سعی کنید بعد به ادامه مطلب مراجعه کنید.
AnalyseMe001.exe
وقتی این مثال رو در IDA Pro مشاهده می کنیم میبینیم که یک تابع تعریف شده و 5 مرتبه با مقادیر متفاوت فراخوانی شده:
حالا این تابع رو در IDA
Pro بررسی می کنیم: 1- ابتدا داخل
متغیر محلی
var_4 مقدار 0 قرار داده
شده. 2-سپس arg_4
که آرگومان دومی هستش که به این تابع دادیم رو با مقدار 0 مقایسه
کرده. اگه مقدار آرگومان دوم ما برابر با صفر باشه این شرط برقرار میشه و پرشی به
کدهای سمت راست انجام میشه و در این صورت اجرا تابع به اتمام میرسه. اما اگه مقدار آرگومان دوم ما برابر با صفر نباشه ما پرشی به کدهای سمت چپ
انجام میدیم که بدنه ی این تابع هستش 3-مقدار متغیر محلی var_4 که الان محتوی صفر هستش به eax
انتقال داده میشه یعنی eax = var_4 4- آرگومان اول arg_0 به eax اضافه میشه یعنی eax = var_4 + arg_0 5- حال مقدار eax
به var_4
انتقال داده می شه یعنی var_4 = var_4 + arg_0 6- مقدار آرگومان دوم arg_4
به ecx
انتقال داده میشه یعنی ecx =
arg_4 7- از ecx یک واحد کم میشه یعنی ecx = arg_4 – 1 8- مقدار ecx دوباره به arg_4 برگردونده میشه یعنی arg_4 = arg_4 – 1 9- در آخر پرشی به مرحله 2 انجام میشه و دوباره تمام این روال اتفاق میافته تا
زمانی که مقدار آرگومان دوم ما برابر با صفر بشه. اگه پست های قبل رو دنبال کرده باشید متوجه میشید که این حلقه ی while
هستش. ولی همونطور که میدونید میشه اینکارو با for
هم انجام داد. ما اگه بخوام کدی برای تحلیلی که انجام دادیم بنویسم بصورت زیر میشه:
خوب من فقط تابعی که در AnalyseMe001.exe وجود داره رو
پیاده سازی کردم و می دونید که این تابع 5 بار فراخوانی شده با مقادیر متفاوت. حالا اگه کدی که نوشتیم رو کامپایل کنم:
میبینید
که عملکرد تابع تفاوتی نداره فقط یه سری دستورات اضافی تر وجود داره اون هم بخاطر
تنظیمات و نوع کامپایلر هستش. در
این مثال یه تابع فراخوانی شده:
AnalyseMe002.exe
گراف
این تابع خیلی مشابه مثال قبل هستش ولی اگه دقت کنید میبینید که یه سری دستورات
متفاوت هستند:
1-
مقدار 1 به var_4
تعلق می گیره 2- آرگومانی که به این تابع داده شده با صفر مقایسه میشه (میبینید که این تابع
فقط یک آرگومان گرفته) 3- اگه آرگومان تابع کوچکتر یا مساوی با صفر باشه پرش به دستورات سمت راست
انجام میشه. مثل مثال قبل کادر سمت راست دستورات خروج از تابع هستش و کادر سمت چپ دستورات
درون تابع. 5- var_4 یعنی مقدار 1 به eax
انتقال داده میشه پس eax =
var_4 6- arg_0
با eax
ضرب میشه و مقدارش درون eax ریخته میشه پس eax = arg_0 * var_4 7- نتیجه ضرب بالا در var_4
ریخته میشه پس تا اینجا داریم var_4 = arg_0 * var_4 8- arg_0
به ecx
انتقال داده می شه 9- مقدار ecx
یک واحد کم میشه پس ecx
= arg_0 - 1 10- مقدار ecx
به arg_0
انتقال داده میشه پس arg_0 =
arg_0 – 1 11- در اینجا پرشی به مقایسه مرحله ی
2 انجام میشه و تا زمانی که arg_0 بزرگتر از 0 هستش این حلقه ادامه داره. حالا کدی که بعد از تحلیل می نویسیم به صورت زیر هستش البته یه نکته در مورد مقادیر آرگومانها در این کد و کد قبل بگم که مقادیر این
آرگومانهارو خودم بصورت دلخواه انتخاب کردم و شما می تونید تغییرش بدید یا همون
چیزی که در مثال دیس اسمبل شده ی برنامه ها مشاهده کردید رو قرار بدید.
من
این رو کامپایل می کنم و نتیجش رو با مثال اصلی مقایسه می کنیم.
میبینید
که یه سری تفاوت وجود داره و دلیلش رو قبلا گفتم. ولی عملکرد تابع با مثال اصلی
یکسان هستش.
AnalyseMe003.exe
این مثال رو خودتون انجام بدید و نتیجه رو در نظرات قرار بدید.