آنالیز و کشف الگوریتم (1)
میخاستم در مورد پکرها و روش های انپک کردن توضیح بدم ولی تصمیمم عوض شد و قرار شد که توی چندتا پست یه سری فایل رو reverse کنیم.
اینجا من 3تا فایل گذاشتم که میبایستی الگوریتم اونهارو پیدا کنیم. طبق معمول از فایل های ساده شروع میکنیم.
اول خودتون سعی کنید آنالیز رو انجام بدید و اگه مشکلی بود ادامه مطالب رو بخونید.
analyseme01.exe
خوب این فایل های خروجی ندارند و فقط باید ببینید که چه اتفاقی داخلش میوفته.
این فایل رو با IDA بررسی می کنیم:
میبینید که main برنامه فقط یه تابع با نام sub_401000 داره و این تابع 2 تا آرگومان داره میگیره 20h و 6h .
حالا وارد این تابع میشیم.
میبینید که خیلی ساده هستش آرگومان اول یعنی 6h رو به eax انتقال میده بعد با 20h مقایسه میکنه و اگه کوچکتر یا مساوی بود (که همیشه هست) پرش میکنه.
سپس 20h رو به eax انتقال میده.همین:)
دستورات کادر سمت چپ هیچوقت اجرا نمیشه مگه اینکه خودمون مقادیر آرگومانهارو جابجا کنیم.
eax = 6
if (eax<=20)
eax = 20
else
eax = 6
analyseme02.exe
در اینجا هم تابع sub_401000 دوتا آرگومان 6h و 9h رو میگیره.
کاری که اینجا انجام میشه:
a = 6h
b = 9h
eax = (a * a) + b
analyseme03.exe
اینجا هم مثل قبل تابع sub_401000 2 تا آرگومان گرفته.
خوب همه ی اینها واسه ما مهم نیستند و ما تا دستورات قبل fild بررسی می کنیم و باقی کدهای بعد این دستور مربوط به کار با اعداد اعشار و SSE هستش که توضیح اینها خارج از بحث ماست.
کدی که تا اینجا بدست آوردیم:
a = 6h
b = 9h
ecx = a * a
edx = 0
eax = 9h / 6h
ecx = eax + ecx => ecx = 9h/6h + a * a
edx = 9h * 6h
ecx = ecx + edx => ecx = (9h/6h) + (a * a) + (9h * 6h)
پیوست:
FILD (Load integer number from memory)
Syntax: fild Src
اگه خواستید در مورد دستورات مرتبط با اعداد شناور و SSE و ... اطلاعات کسب کنید میتونید به این سایت و همچنین پست بعدی این وبلاگ مراجعه کنید.