هل سيتم تمرير الحجج إلى وظيفة على المكدس أو في سجل؟

StackOverflow https://stackoverflow.com/questions/976581

سؤال

أقوم حاليا بتحليل برنامج كتبته في التجميع وكان يفكر في نقل بعض المدونة في الجمعية. لدي إجراء يأخذ حجة واحدة، لكنني لست متأكدا مما إذا كان يتم تمريره على المكدس أو السجل.

عندما أفتح برنامجي في IDA Pro، الخط الأول في الإجراء هو:

ThreadID= dword ptr -4

إذا أحرم مؤشراتي على الإعلان، يظهر ما يلي أيضا:

ThreadID dd ?
 r db 4 dup(?)

الذي أفترض أنه سيشير إلى متغير كومة؟

عندما أفتح نفس البرنامج في ollydbg، ومع ذلك، فإن عند هذه النقطة على المكدس هناك قيمة كبيرة، والتي ستكون غير متسقة مع أي معلمة قد تم تمريرها، مما يؤديني إلى الاعتقاد بأنه مرر في سجل.

يمكن لأي شخص لي نقطة في الاتجاه الصحيح؟

هل كانت مفيدة؟

المحلول

يتم تمرير الوسائط بطريقة تعتمد على الوظيفة اتفاقية الاتصال.. وبعد تعتمد اتفاقية الاتصال الافتراضية على اللغة والمترجم والهندسة المعمارية.

لا أستطيع أن أقول أي شيء بالتأكيد مع المعلومات التي قدمتها، ومع ذلك، يجب ألا تنسى أن أجهزة اضطراب على مستوى التجمع مثل Ollydbg و Disassemblers مثل IDA غالبا ما تستخدم الاستدلال إلى برنامج المهندس العكسي. أفضل طريقة لدراسة التعليمات البرمجية الناتجة عن الترجمة هي تعليماتها لكتابة قوائم التجميع. معظم المجالين لديهم خيار للقيام بذلك.

نصائح أخرى

إنه متغير محلي بالتأكيد. للتحقق من الحجج ابحث عن القيم [ESP + XXX]. إيناء أسماء تلك [esp + arg_xxx] تلقائيا.

.text:0100346A sub_100346A     proc near               ; CODE XREF: sub_100347C+44p
.text:0100346A                                         ; sub_100367A+C6p ...
.text:0100346A
.text:0100346A arg_0           = dword ptr  4
.text:0100346A
.text:0100346A                 mov     eax, [esp+arg_0]
.text:0100346E                 add     dword_1005194, eax
.text:01003474                 call    sub_1002801
.text:01003474
.text:01003479                 retn    4
.text:01003479
.text:01003479 sub_100346A     endp

واتفاقية FastCall كما هو موضح في التعليق أعلاه يستخدم السجلات لتمرير الحجج. أود المراهنة على Microsoft أو برنامج التحويل البرمجي ل Microsoft أو GCC لأنها تستخدم على نطاق واسع. لذلك تحقق من ECX و EDX يسجل أولا.

تقوم Microsoft أو دول مجلس التعاون الخليجي [2] __fastcall [3] (AKA __MSStcall) بتمرير الحجتين الأولى (تقييمه إلى اليمين) التي تناسب ECX و EDX. يتم دفع الوسائط المتبقية إلى المكدس من اليمين إلى اليسار. http://en.wikipedia.org/wiki/x86_calling_conventions#factcall.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top