View Full Version : محاسبه !
h4sh3m
پنج شنبه 19 آبان 1390, 01:23 صبح
سلام
دوستان من دارم روي يك Inliner كار ميكنم كه تقريبا (نمونه اوليه برا تست) تموم شده و فقط يه مشكلي كه دارم اينه كه نميتونم الگويي براي محاسبه مكان پرشها پيدا كنم.
براي مثال:
اگه شما يه فايل اجرايي رو تو ديباگر باز كنيد ميبينيد كه پرشها با مسافت هاي آدرسها رابطه دارن ولي اگه همين پرشها رو از يه Section ديگه انجام بدين رابطشون يه خورده پيچيده هست كه من نتونستم پيدا كنم !
از دوستان اگه كسي رابطشونو ميدونه (البته هستن تا جايي كه ميدونم) لطف كنه تا استفاده كنيم.
حالا شرمنده كه عنوان مناسبتر از اين نتونستم براش پيدا كنم.
با تشكر
یوسف زالی
پنج شنبه 19 آبان 1390, 18:58 عصر
سلام.
راستش خیلی از سوالتون سر در نیاوردم اما تا جایی که یادمه نقاط شروع سکشن ها هم مشخص هست.
h4sh3m
پنج شنبه 19 آبان 1390, 20:15 عصر
سلام
منظور نقاط شروعي سكشنها نيست !
منظور من اينه كه براي پرش (jmp) از يك نقطه از يك سكشن به يك نقطه از سكشن ديگه چطور بايد طول پرش رو محاسبه كرد؟
یوسف زالی
پنج شنبه 19 آبان 1390, 20:19 عصر
خب اگر نقطه شروع سکشن ها رو داشته باشیم مشکلی نیست.
Section1 = $100
Section2 = $200
jmp from 10 of Section1 into 20 of Section2 = $200 + 20 - ($100 + 10) // ssample
h4sh3m
جمعه 20 آبان 1390, 05:07 صبح
سلام
اينها بر حسب آفست فايل هست يا Virtual Address ؟
راستي براش يه راه ديگه پيدا كردم كه از اين قرار هست كه به جاي پرش از RETN استفاده ميشه (البته قبلا ميدونستم ولي اصلا تو اون مايه ها فكر نميكردم چون مشكل با Call هم برطرف نميشه با اين روش)
مثال:
push 00495712
RETN
با تشكر
h4sh3m
دوشنبه 23 آبان 1390, 19:38 عصر
سلام دوستان
مشكل تا حدودي با اين روش دوست گرامي گه گفتن (البته تا نزديكياش) حل ميشه البته اين آدرسها آدرسهاي مجازي هستن و يه قسمت كه اين دوستمون بهش اشاره نكردن اينه كه اگه مابين اين 2 تا سكشن مورد نظر يه سكشن ديگه اي هم باشه بايد اندازه مجازي اون رو هم بهش اضافه كنيم.
با اين توصيفات من باز تو يه نقطه اي گير كردم كه نميدونم علتش چيه ! و اون هم اين كه تو يك سري از فايل ها 4 بايت ، تو يك سري ديگه 5 بايت و يك سري ديگه هم 12 بايت با هم اختلاف دارن حالا موندم كه اين اختلافات توي چي هست ؟!
اين رو هم بگم كه من اين رو براي اينلاين پچر مي خوام كه فعلا روي UPX دارم كار ميكنم (نكه تازه كارم برا همين :خجالت:)
با تشكر
lord_viper
چهارشنبه 25 آبان 1390, 17:01 عصر
معمولا jmp ها که E9 هستن میشه فاصله شما تا مقصد یعنی میشه فاصله مقصد- مکان شما-5 که این 5 میشه 1 بایت مقدار E9 و 4 بایت ادرس پرش ولی به جای اون شما میتونی از E8 استفاده کنی یعنی به جای jmp از Call استفاده کنی و مستقیم ادرس مقصد رو بهش بدی
h4sh3m
شنبه 28 آبان 1390, 23:04 عصر
سلام
هيچ فرقي بين jmp و call نيست !
البته از ديدگاه hex اگه به هر دوتاش نگاه كنيد ميبينيد كه آدرسهاشون عين هم هستن و فقط نوع دستورشون فرق داره !!!!
البته اين رو هم بگم كه خودم راهش رو پيدا كردم يه خورده پيچيده شده و هر وقت وقت كردم ميزارم تا نگاه كنيد.
با تشكر از دوستان
lord_viper
یک شنبه 29 آبان 1390, 09:32 صبح
سلام
هيچ فرقي بين jmp و call نيست !
البته از ديدگاه hex اگه به هر دوتاش نگاه كنيد ميبينيد كه آدرسهاشون عين هم هستن و فقط نوع دستورشون فرق داره !!!!
البته اين رو هم بگم كه خودم راهش رو پيدا كردم يه خورده پيچيده شده و هر وقت وقت كردم ميزارم تا نگاه كنيد.
من که هر چی دیدم ادرسهاش بیه هم نبودن شما یه تابع api رو با call فراخوانی کن بعد با jmp اونوقت میبینی که چه تفاوتی دارن
اگه مثلا شما الان تو ادرس 4001000 باشین و تابع apiشما تو ادرس 7100250 باشه با Call شما کافیه بنویسین call 7100250 ولی با jmp باید 7100250 از 400100 کم کنین تا فاصله مکانی کد شما تا مقصد بدست بیاد و jmp رو انجام بدین به این شکل
jmp 30FF250
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.