الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال يتعلق باستخدام GetModuleHandleA/GetProcAddres

مغلق
بدأه Xacker في 13 سبتمبر 2004 · 15 رد · 1,119 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

(chik ami الموضوع هو نفسه اللي عم ناقشك فيه)

باختصار اقوم بتطبيق code injection على برنامج لا يحوي على وظيفة messageboxa والتي انوي استخدامها في اظهار السيريال الصحيح لبرنامج ما على الشاشة

بالبحث في ال imports يبدو ان البرنامج لا يستخدم loadlibrary ولكنه يستخدم getmodulehandlea وبالتالي فقد استخدمتها بنجاح لاحصل على مقبض الملف ومن ثم استخدمت getprocaddress للحصول على عنوان الوظيفة التي حددتها في عنوان ضمن مقطع .text ضمن مساحة خالية (cave)

السؤال الان، بما ان المسجل eax يحوي عنوان وظيفة messageboxa فهل اقوم باستدعائها بالشكل call eax? اعتقد ان الامر خاطئ لانه بالتجريب يتم ارجاع null-terminated ويصبح قيمة eax = 0 وبالتالي لا تطبق الوظيفة بصورة صحيحة فهل.. من الواجب ان اقوم بنسخه الى عنوان ما ضمن مقطع لاقوم باستدعائه بالشكل

call that_addr

؟ ارجو التوضيح ولنا عودة بعد المناقشة

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#2

الساعة 5 الفجر ؟ ( يعني ما أعرف قرأت السؤال صح أو خطأ )

بكل إختصار:

قبل إستدعاء أي دالة يجب أن تدفع للمكدس بارمترات الدالة PUSH

وأعتقد إنة للمسج أربع بارمترات

وبعد أن تحدد البارمترات في المكدس نفذ call على العنوان : ويظهر المسج

وباي

http://www.jaascois.com

*************************************************

مجموعة مواضيع - إحتراف البرمجة -

ّ~~~~~~~~~~~~~~~~~~~~~~

البرمجة المتقدمة & الهندسة العكسية & برمجة وأمن الأنظمة

/index.php?showtopic=45002

آخر المواضيع :

+- تحليل جرائم الكمبيوتر -+

أنظمة اليونكس(Solaris,HP, AIX,SCO)وانواع المعالجات

ثغرة SMS لأجهزة الجوال Siemens 3568i !

أخطاء وثغرات البرامج العربية !!!

سلسلة مواضيع - أمن وحماية مواقع الويب -

E البرمجة المتقدمة X للملفات التنفيذية E

سلسلة مواضيع ثغرات الأنظمة وإختراق الأجهزة

**************************************************

<span style='font-size:14pt;line-height:100%'>الإرادة تحـــقق السيـــادة</span>

**************************************************

#3

لا وقت يبدو انو الساعة اثرت عليك :)

اخي jaas ما اسال عنه مختلف عما تجيبني عليه فانا لست اسال عن كيفية استخدام وظيفة messageboxa بصورة عادية

MessageBoxA, null, addr lpCaption, addr lpText, MB_OK

اوكيه هالشي مفهوم بس السؤال مصاغ بطريقة اخرى، ارجو المراجعة

تم تعديل هذه المشاركة بواسطة Xacker في 13 سبتمبر 2004 في 09:45

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

السلام عليكم,

أهلا بالأخ Xacker .

كما أرسلت لك وأعيد هنا نفس الكلام ربما يفيد أخ آخر فيما يخص الفرق بين LoadLibrary و GetModuleHandle . الدالة الأولى تحمل مكتبة ما إلى الداكرة وبعد التحميل ترجع لنا الهاندل الدي يمكن أن نستعمله لإستدعاء الدالة GetProcAddress .أما الدالة GetModuleHandle فهي تعطينا هاندل المكتبة وهده الأخيرة تكون محملة من قبل في الداكرة.

وعموما يجب أن نعرف أن أي دالة API حين ترجع لنا شيئا ما فهي ترجعه في الرجستر eax ومسألة الإستدعاء يمكن أن نستدعيها كما دكرت يعني Call eax فهده التعليمة صحيحة طبعا إدا كان eax يحتوي على عنوان صحيح.

هدا عن الطريق النظري وفيما يخص التطبيق سأعطي توضيحات إضافية بعد مشاهدة ما يحتويه الملف.

إلى اللقاء.

#5

باذن الله - بهذه الحالة فيجب علي استخدام LoadLibraryA اولا لكن كما اخبرتك من قبل، ماذا لو لم تكن في الـ imports ؟ هذه هي المشكلة في المقال الذي اعمل عليه والملف الذي ارسلته لك ايضا

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

مرحبا Xacker & chik

المشكلة أني راجعت السؤال وطلع نفسة يالي قرأتة الساعة 5 :)

اقتباس
السؤال الان، بما ان المسجل eax يحوي عنوان وظيفة messageboxa فهل اقوم باستدعائها بالشكل call eax? اعتقد ان الامر خاطئ

أكيد تستطيع بعد تمرير البارمترات ( نفس ماكتبت في الرد )

أما إذا كان سؤال آخر : الله أعلم

لأني لا أعرف تتحدثون عن أي موضوع (ملف + رسالة + نفس الموضوع )

وإلى اللقاء

http://www.jaascois.com

*************************************************

مجموعة مواضيع - إحتراف البرمجة -

ّ~~~~~~~~~~~~~~~~~~~~~~

البرمجة المتقدمة & الهندسة العكسية & برمجة وأمن الأنظمة

/index.php?showtopic=45002

آخر المواضيع :

+- تحليل جرائم الكمبيوتر -+

أنظمة اليونكس(Solaris,HP, AIX,SCO)وانواع المعالجات

ثغرة SMS لأجهزة الجوال Siemens 3568i !

أخطاء وثغرات البرامج العربية !!!

سلسلة مواضيع - أمن وحماية مواقع الويب -

E البرمجة المتقدمة X للملفات التنفيذية E

سلسلة مواضيع ثغرات الأنظمة وإختراق الأجهزة

**************************************************

<span style='font-size:14pt;line-height:100%'>الإرادة تحـــقق السيـــادة</span>

**************************************************

#7

تفضل استاذ jaas

هيدا الملف ارسلته لاخي chik متساءلا عن كيفية استدعاء وظيفة من مكتبة الربط user32.dll هذه الوظيفة هي MessageBoxA واللي من المفترض اني استخدمها لعرض السيريال الصحيح على الشاشة بعد تنفيذ الكود الخاص في واللي قمت باضافته على البرنامج ضمن cave او room او شو ما بدك تسميها (padded zeros منيح هيك :) )

هلق الفكرة باستدعاء الوظيفة هديك هي باستدعاء مكتبة الربط وعمل تحميل لها في الذاكرة للحصول على المقبض باستخدام LoadLibraryA ومن ثم استخدام GetProcAddress بالتعاون مع المقبض لاستدعاء تلك الوظيفة واللي حيكون عنوانها في eax لكن المشكلة كانت انه LoadLibraryA مش موجودة بالاصل فكيف بدنا نحل الموضوع؟

(ملف الـ dll الموجود في الملف المرفق غير مهم حاليا لانه من المفترض انه استدعي ShowForm منه بس للتبسيط -بما انه ملف VB- قمت بالتحويل الى MessageBoxA)

هات لشوف يا ابو الافكار ;)

dll injection.zip

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#8

السلام عليكم,

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

إذا لم يشتغل الملف أو وقع أي خطء يجب تغيير عناوين الدوال LoadLibraryA و GetProcAddress لتشير إلى العناوين الحقيقية اللي عندك لأني استعملت في المثال استدعاء ثابت ويمكن أن لا يكون نفسه الموجود عندك وهذا يجعلنا نفكر في طريقة استدعاء أخرى باستعمال Import Table ولكن هذه ربما تكون شيء ما معقدة في البداية حيث يتسنى لنا فهم PE Header أولا ولنا رجعة إلى هذا الموضوع. وهذان الدوال هما في العناوين التالية :

004011C4 CALL KERNEL32!GetProcAddress

004011C4 CALL KERNEL32!GetProcAddress

في ملف الوورد يجب قراءة WM_COMMAND عوض WS_COMMAND وقع خطء في الأول ومع خاصية النقل واللصق تكرر الخطء.

إلى اللقاء.

Files.zip

#9

الف شكر ;)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#10

السلام عليكم,

فيما يخص مشكل عناوين API التي قد تختلف من جهاز إلى آخر ولمن حصل له هذا ولم يعرف ماذا يغير جاءتني هذه الفكرة وهي عبارة عن برنامج يقوم بقراءة العناوين المذكورة على الجهاز ونقارنها مع المستعملة في البرنامج فإذا وجدناها مختلفة نعمل باتش للبرنامج يقوم بتغيير العناوين القديمة إلى العناوين التي وجدناها ومن ثم يشتغل البرنامج في الجهاز الجديد. قمت بتجربته على نضامين مختلفين ونجحت التجربة.

كل ما علينا هو تشغيل هذا البرنامج ونلاحظ العناوين إذا كانت مختلفة نعمل باتش للبرنامج الذي عكسناه من قبل ex5.2.1_Reversed.exe . ربما كان يجب تغيير هذا الإسم في الإنذار وإعطاء إنذار في الأخير يقول بأن العملية تمت بنجاح ولكن الآن الهدف ليس هو التطوير.

إلى اللقاء.

File.zip

#11

يبدو انههيدا اجابة الشي الي ارسلته لك في الايميل هلق.. على كل بتبقى فكرة كيفية الحصول على العنوان يدويا مطلوبة؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#12

chik خليني لخص لهلق شو المشاكل اللي عم تواجهني وشو اسئلتي المتعلقة فيها

بالنسبة لهالموضوع فكنت نشرته بالبداية للسؤال عن برنامج لا يحوي على وظيفة MessageBoxA وبدي استخدمها لاظهار السيريال

باستخدام LoadLibraryA / GetProcAddress بقدر اوصلها لكن المشكلة انه لما عم استخدم هالوظيفتين لاحصل على عنوان وظيفة MessageBoxA بتكون لـ eax قيمة لكن لما بحاول احفظ هالقيمة بعنوان ما فارغ بيتحول الكود اللي بكتبه بـ SI الى mov [addr], ax بدل eax ومش عارف ليه!

اذا حاولت استخدم call eax بدون حفظ القيمة بعنوان فالنتيجة بعد تخطي هالامر بتكون انه eax = 00000000 وما بيصير شي وهالشي دليل على فشل استدعاء الوظيفة فليه برايك عم يصير هيك؟

بالنسبة للملف اللي ارسلته الك فتوضيحك كان اكتر من رائع بس عندي سؤالين: 1- هل من الممكن جعل البرنامج يستدعي ShowForm لما بيتشغل وشو هو العنوان اللي لازم استخدمه عشان هالشي.

2- كيف بقدر احصل على العناوين المباشرة للوظائف في مكاتب الربط (يعني بصورة تانية شو هو الكود اللي استخدمته في برنامجك الصغير)

اخيرا بتمنى انه نشوف شي ابداع اخر من ابداعاتك بيتعلق بالحصول على عنوان الوظيفة من قائمة ال imports

الف شكر - chik ami Ive learned so much from you (f)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#13

السلام عليكم,

الأخ XACKER حقيقة لم أفهم مشكلتك كثيرا وإذا تفضلت أن تكتب باللغة الفصحى عوض اللغة المحلية ربما تسهل الأمور شيء ما لأن هناك بعض المصطلحات لم أفهمها.

اقتباس
باستخدام LoadLibraryA / GetProcAddress بقدر اوصلها لكن المشكلة انه لما عم استخدم هالوظيفتين لاحصل على عنوان وظيفة MessageBoxA بتكون لـ eax قيمة لكن لما بحاول احفظ هالقيمة بعنوان ما فارغ بيتحول الكود اللي بكتبه بـ SI الى mov [addr], ax بدل eax ومش عارف ليه!

تقصد هنا أن استدعاء الدالتين LoadLibraryA / GetProcAddress أعطيا القيمة الصحيحة للدالة MessageBoxA وهي بالطبع تكون في eax .قلت أنك تحفظها في SI هل أنت متأكد أنه SI أو ESI لأن الرجستر وربما تغيير eax إلى ax يكون نتيجة عن مثل هذا يعني أن هناك اختلاف في نوعية البايتات هذا إذا كنت تكتبه مباشرة فسوف لن يعطيك أخطاء وربما سيقوم بهذا التحويل الذي ذكرت . وإذا أمكن إعطي الكود الكامل الذي كتبته لربما نتعرف عن الخطئ.

اقتباس
بالنسبة للملف اللي ارسلته الك فتوضيحك كان اكتر من رائع بس عندي سؤالين: 1- هل من الممكن جعل البرنامج يستدعي ShowForm لما بيتشغل وشو هو العنوان اللي لازم استخدمه عشان هالشي.

بالطبع يمكن استدعاء الدالة أينما نشاء وطبعا بعد معرفة عنوانها باستعمال الدالتين السابقتين. حين نصنع نحن البرنامج أضن أن أحسن وقت لإستدعائها يكون في INITDIALOG يعني في هذه المرحلة نقوم بكل الإجراءات اللازمة ولكن قبل أن تضهر لنا نافذة البرنامج الرئيسية. وحين نرى Disassemble للبرنامج يمكن أن نضيفها أيضا قبل استدعاء النافذة أي قبل الدالة DialoBoxParam .

اقتباس
اخيرا بتمنى انه نشوف شي ابداع اخر من ابداعاتك بيتعلق بالحصول على عنوان الوظيفة من قائمة ال imports

لهذا يجب أن نعرف ماذا يجري داخل PE Header ومختلف Sections . فكل هذا مجموعة أرقام حين نعرف مدلولها فهي توصلنا مباشرة إلى الشيء الذي نرغب فيه مثلا عنوان دالة يستدعيها البرنامج. وأضن أن بعض مقاغلات الأخ jass تتكلم عن هذا وسأحاول إضافة أخرى إن شاء الله.

إلى اللقاء.

#14

شكرا لك على وقتك اخي chik

اود ان اشير الى انه عندما اقوم بذكر SI فاعني به SoftIce.

قمت بحل المشكلة المتعلقة باستدعاء وظيفة MessageBoxA لكن عندي سؤال هام يتعلق بنقل السيريال..

في البداية الكود اللي بستخدمه هو:

; restoring the bytes ive changed
436740:
test	eax,eax
push	ff
push	40
jz	416ab7
; here are my codes
push	40cdfc; pushing the addr of user32.dll file name
call	dword ptr [4010d8]; calling the LoadLibraryA func.
push	436730; pushing the addr of the MessageBoxA func. string that ive inserted using a hexeditor
push	eax; pushing the handle of the dynamic link library
call	dword ptr [4010d4]; calling the GetProcAddress func.
mov	ebx, [ebp-00cc]	; storing the correct sn in esi - 1st prob: no serial is copied!
push	00; msg type
push	00; msg caption
push	ebx; supposed to be msg text!
push	00; msg handle
call	eax; supposed to be call MessageBoxA!
jmp	416aef; jmp back to normal flow

السيريال موجود في العنوان ebp-cc لكن لا يتم النقل بشكل صحيح للمسجل ebx

وما توصلت اليه: عندما استخدم d ebp-cc يظهر العنوان التالي الذي يوجد السيريال عنده 0023:12e3a4 وحتى لو اني قمت باستخدام mov ebx, ds:[12e3a4] فالمشكلة تبقى نفسها.. كيف لي ان اقوم بجعل البرنامج يقوم بنقل السيريال الى مسجل ما تحضيرا لاظهاره بشكل صحيح على الشاشة؟

ثانيا: شكرا على توضيح السؤال الخاص بجعل وظيفة ShowForm تنفذ في اي موضع.. اعلم اني lazy يعني بسال بدون ما جرب قبل (السبب انه بدي انتقل 10 امتار للغرفة التانية عشان شغل الجهاز التاني وانقر 1 عشان يتحمل sice بالذاكرة ووووو اصل للويندوز وانتظر حتى يشتغل البرنامج واقوم بتطبيق كل شئ لارى النتيجة.. يا لطيف اجرائية طويلة :D )

اخيرا: بالنسبة للموضوع الخاص بالـ imports فكنت قد اطلعت على موقع yAtEs www.yates2k.net واعتقد ان فيه مواضيع جيدة بهالخصوص.. اللعنة على ضيق الوقت :-s

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#15

السلام عليكم,

اقتباس
push 00; msg type

push 00; msg caption

push ebx; supposed to be msg text!

push 00; msg handle

call eax; supposed to be call MessageBoxA!

و

اقتباس
عندما استخدم d ebp-cc يظهر العنوان التالي الذي يوجد السيريال عنده 0023:12e3a4 وحتى لو اني قمت باستخدام mov ebx, ds:[12e3a4

أضن أن خطأك في القيمة التي تعطيها ل ebx .البارامتر الثاني ل MessageBox يجب أن يكون بونتر أو مؤشر للرسالة التي نريد أن نظهرها ولكن أنت تعطيها القيمة عوض المؤشر وهذا الذي سيعطيك سواء لا شيء أو عبارة أخرى غير التي تتوقعها. وهذا يضهر أيضا عندما تقوم ب d ds:12e3a4 فكان يجب أن تعطي للرجستر ebx القيمة 12e3a4 وليس محتوى هذه الذاكرة أو مثلا mov ebx,ebp-00CC وهنا سيكون ebx مؤشرا للرسالة وسيعمل معك البرنامج إن شاء الله.

إلى اللقاء.

#16

حسبما اذكر اني جربت هالشي بدون فائدة.. على كل بجرب مرة تانية لربما السهر اثر على مخي.. مشكور (f)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

هذا الموضوع مغلق.

مواضيع مشابهة