PDA

View Full Version : callback function



zoncpp
یک شنبه 26 فروردین 1386, 15:15 عصر
سلام،
من برنامه ای تحت ویژوال سی نوشته ام که این برنامه تکه کدی را به فایل exe ی دیگر اضافه می کند. لازم به ذکر است که این تکه کد باید به زبان اسمبلی نوشته شود تا در هنگام اجرای exe این کد نیز بدون مشکل اجرا گردد . این کار به درستی انجام می شود و exe من به همراه آن تکه کد اضافه شده بدون مشکل اجرا می شود.

اما لازم است که در کد من تابعی فراخوانی شود که یکی از پارامترهای این تابع آدرس تابع callback می باشد. من تابع callback را نیز به زبان اسمبلی در انتهای کد اصلی نوشته ام و در کد اصلی آدرس این تابع را به درستی محاسبه می کنم و به عنوان پارامتر ارسال می کنم.
همه چیز درست است کد داخل تابع callback نیز بدون مشکل اجرا می شود، اما هنگام بازگشت از تابع callback به کد اصلی برنامه، exe خطای don't send می دهد. در انتهای تابع callback چه کدی باید بنویسم که این مشکل پیش نیاید؟
مثلا برای ایجاد thread هم نیاز به آدرس یک تابع دیگر می باشد (مانند تابع Callback) که در انتهای این تابع با فراخوانی تابع ExitThread که یک تابع API است به کد اصلی بر می گردیم ولی در مورد تابع Callback نمی دانم چه کنم ؟؟؟؟؟؟؟؟؟؟



_asm
{
....
// push other parameters
push addressOfCallbackFunc
call myFunc
....
jmp End

CallbackFunc:
....
ret // ?????

End:
}

Best Programmer
جمعه 31 فروردین 1386, 03:09 صبح
با سلام.
من درست منظورتون را نگرفتم ولی تا جایی که فهمیدم فکر میکنم که شما با Return Address مشکل دارید .
در کتاب Syngress Sockets Shellcode Porting And Coding Reverse Engineering Exploits And Tool Coding For Security Professionals صفحه 339 مطالبی در این زمینه مطالبی همراه مثال دارد.

اگر شما کد برنامه به همراه Dump از سیستمتون در هنگام Error را بزارید و کمی توضیحات درباره کارتون می توان بیشتر نظر داد.

zoncpp
شنبه 01 اردیبهشت 1386, 09:57 صبح
متشکرم، چون من همین کار را در مورد ایجاد Thread هم انجام داده بودم، مشکلم در تابع Callback منو کمی گیج کرده بود. در واقع مشکل من در Return address نبود. من در تابع Callback مقادیری از رجیستری رو، (ebp, ebx) ، تغییر می دادم که هنگام بازگشت از تابع callback به تابع فراخواننده ( تابعی که آدرس تابع Callback به عنوان پارامتر به آن ارسال می گردد) به این مقادیر احتیاج است. بنابراین با دو خط کد ساده pushad و popad در اول و آخر کد تابع تمام مشکلات حل شد. ممنون:چشمک:



_asm
{
....
// push other parameters
push addressOfCallbackFunc
call myFunc
....
jmp End

CallbackFunc:
pushad
....
popad
ret

End:

Best Programmer
شنبه 01 اردیبهشت 1386, 23:36 عصر
اگر مشکل شما این بوده فکر کنم یه Push ebp / Pop ebp کار شما را انجام دهد.