كما جاء فى المثال هنا
جعلنا الملف التنفيذى يحمل مكتبة من مكتبات النضام و حصلنا على عنوان دالة من دوال هذه المكتبة و نفذنا تلك الدالة عادى .
المشكل الذى واجهنى و هو عند القيام بنفس العملية على مكتبة من صنعنا اتحصل على عنوان خاطىء للدالة
... من يحوال معى لايجاد الحل .
و السلام عليكم
كل من 1 user says قال شكرا ل hanipino على المشاركة المفيدة1 user says Thank You to hanipino for this post • ياسين بن داود
نعم انا معك اخى me&delphi
لا يوجد مشكل مع MessageBox ... كل الملفات التنفيذية تحمل المكتبة USER32
لاكن بالنسبة ShellExecute من Shell32.dll ليس كل الملفات التنفيذية تحتاج لهذه المكتبة
لذالك جعلنا الملف المحقون يحمل هذه المكتبة ... و المهم اننا تحصلنا على عنوان الدالة بسهولة
و كانه عنوان ثابت ... .
كود :
يجب أن تقوم بتحميل المكتبة التي أنشأتها
نعم حملتها لاكن المشكل ان عنوان الدالة يتغير عند كل تحميل عكس مكتبات النضام ... مثل Shell32
------------------------------
المهم سؤالى او المشكل الذى واجهته او الملاحضة التى استنتجتها هى ...
ان كان الملف التنفيدى لم يقم من قبل بتحميل مكتبة من مكتبات النضام ... يمكن تحميلها و استدعاء دالة من دوالها و كان عنوانها ثابت
عكس مكتبة من صنعنا عند كل تحميل لها تتغير عناوين دوالها
لاحظ عند جلب عنوان الـ MessageBoxA , يتم كتابته في القالب (4 بايتات الحمراء)
كود :
CopyMemory(@MyMSGByte[16], @pMsgBoxA, 4);
يعني من البايت 16 بقدر 4 بايتات , التي ستحمل عنوان الدالة المستهدفة :
كود :
B8 [COLOR=Red]EA 07 3D 7E [COLOR=Black]//[/COLOR] [/COLOR]MOV EAX,user32.[COLOR=Red]MessageBoxA[/COLOR]
- العناوين بالنسبة لـ Api : هنا
-'كيف يمكن استثمار هذه الدالة ... على ما يؤشر lpImportAddr ... من اين احصل عليه'
كود :
function GetImportFunAddr(lpImportAddr: Pointer): Pointer;
begin
Result := PPointer(PPointer(Cardinal(lpImportAddr) + 2)^)^;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessageFmt('%p',[GetImportFunAddr(@MessageBoxA)]);
{GetProcAddress(LoadLibrary('user32.dll'), 'MessageBoxA')}
end;
- المكتبة التي نبرمجها , تحتوي دوال/إجراءات تنفذ مجموعه تعليمات لذا يجب كتابت قوالب
مكافئة لهده الإجراءات (بعد التنقيح) , ليس كدوال الـ Api واظحة (عدد و نوع البراماتر) .