![]() |
|
حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3) +--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15) +--- الموضوع : حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا (/showthread.php?tid=3234) |
حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - hanipino - 25-06-2011 السلام عليكم كما جاء فى المثال هنا جعلنا الملف التنفيذى يحمل مكتبة من مكتبات النضام و حصلنا على عنوان دالة من دوال هذه المكتبة و نفذنا تلك الدالة عادى . المشكل الذى واجهنى و هو عند القيام بنفس العملية على مكتبة من صنعنا اتحصل على عنوان خاطىء للدالة ... من يحوال معى لايجاد الحل .و السلام عليكم حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - me_delphi - 25-06-2011 السلام عليكم رأيت المثال وهو جميل أخي hanipino إقتباس :اتحصل على عنوان خاطىء للدالة يجب أن تقوم بتحميل المكتبة التي أنشأتها بواسطة LoadLibrary دالة من دوال API لأن دالة MessageBoxA أصلا محملة لدى لم تجد ان مشكل في استعمال GetProcAddress إقتباس : PHP كود : DWORD(GetProcAddress(LoadLibrary('hanipino.dll'), 'Function_Hanipino')); وستغير هنا PHP كود : yMSGByte: array[1..27] of Byte =الا ادا كان لها نفس بارامترات دالة MessageBoxA حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - hanipino - 25-06-2011 نعم انا معك اخى me&delphi لا يوجد مشكل مع MessageBox ... كل الملفات التنفيذية تحمل المكتبة USER32 لاكن بالنسبة ShellExecute من Shell32.dll ليس كل الملفات التنفيذية تحتاج لهذه المكتبة لذالك جعلنا الملف المحقون يحمل هذه المكتبة ... و المهم اننا تحصلنا على عنوان الدالة بسهولة و كانه عنوان ثابت ... . كود : يجب أن تقوم بتحميل المكتبة التي أنشأتهانعم حملتها لاكن المشكل ان عنوان الدالة يتغير عند كل تحميل عكس مكتبات النضام ... مثل Shell32 ------------------------------ المهم سؤالى او المشكل الذى واجهته او الملاحضة التى استنتجتها هى ... ان كان الملف التنفيدى لم يقم من قبل بتحميل مكتبة من مكتبات النضام ... يمكن تحميلها و استدعاء دالة من دوالها و كان عنوانها ثابت عكس مكتبة من صنعنا عند كل تحميل لها تتغير عناوين دوالها حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - TF6M - 25-06-2011 السلام عليكم - يتم حساب عنوان الدالة المستهدفة , من ثم كتابتها إنطلاقا من الـبايت 16 PHP كود : MyMSGByte: array[1..27] of Byte =PHP كود : CopyMemory(@MyMSGByte[16], @pMsgBoxA, 4); كود : B8 [COLOR=Red]EA 07 3D 7E [COLOR=Black]//[/COLOR] [/COLOR]MOV EAX,user32.MessageBoxAPHP كود : function GetImportFunAddr(lpImportAddr: Pointer): Pointer;حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - hanipino - 25-06-2011 و عليكم السلام ماذا تقصد ... إقتباس :لكتابة الجزء الناقص في الإستدعاء هل هاذا يعنى انا عنوان الدالة دائما ثابت و لا يتغير ... لذالك يمكن تخزينه مباشرتا فى المصفوفة . اذا العناوين ثابت لماذا ...??? إقتباس :- يمكن الإستغناء عن LoadLibrary/GetProcAddress كيف يمكن استثمار هذه الدالة ... على ما يؤشر lpImportAddr ... من اين احصل عليه إقتباس :عند محاولة حقن دالة/إجراء من Dll فقط يجب توفير القالب المناسب ؟ مثل MyMSGByteهل تقصد مكتبة dll مثلا من صنعنا ... لذالك نستعين بالقوالب (مصفوفة) لتخزين عناوين دوالها (عناوين الدوال هنا متغيرة عند كل تحميل ??? لا تحتاج لتخزين) حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - TF6M - 25-06-2011 - 'هل هاذا يعنى انا عنوان الدالة دائما ثابت و لا يتغير ... لذالك يمكن تخزينه مباشرتا فى المصفوفة . اذا العناوين ثابت لماذا ...???' كود : const
MyMSGByte: array[1..27] of Byte =
(
$6A, $00, {PUSH 0}
$68, 0, 0, 0, 0, {PUSH XXXX} // title
$68, 0, 0, 0, 0, {PUSH XXXX} // text
$6A, $00, {PUSH 0} // owner
$[COLOR=Blue]B8[/COLOR], [COLOR=Red]0[/COLOR], [COLOR=Red]0[/COLOR], [COLOR=Red]0[/COLOR],[COLOR=Red] 0[/COLOR], {MOV EAX MessageBoxA}
$FF, $D0, {CALL EAX}
$68, 0, 0, 0, 0, {PUSH XXXX} // JMP TO real Starting point
$C3 {RETN}
);كود : CopyMemory(@MyMSGByte[16], @pMsgBoxA, 4);كود : B8 [COLOR=Red]EA 07 3D 7E [COLOR=Black]//[/COLOR] [/COLOR]MOV EAX,user32.[COLOR=Red]MessageBoxA[/COLOR]-'كيف يمكن استثمار هذه الدالة ... على ما يؤشر 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 واظحة (عدد و نوع البراماتر) . حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - hanipino - 25-06-2011 نعم بارك الله فيك tf6m حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - me_delphi - 25-06-2011 إقتباس :... بارك الله فيك أخي هدا ما كنت سأرد به ...وهو ما لدي من معلومات... أخي hanipino ان واجهت مشكلا آخر اطرح محاولتك... لنحاول نحن بدورنا أيضا وهنا اخوة أكثر خبرة منا كالأستاد عبد العزيز سيفيدوننا ان شاء الله بالتوفيق. حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - hanipino - 26-06-2011 نعم اخى me&delphi ... المنتدى منتدانا و كل مشاكلى مطروحة فيه بارك الله فى اعضاء المنتدى-------------------- فيما يخص حقن مكتبة من انجازنا توصلت للحل ... كما قال اخى tf6m (بعد التنقيح) و فهم العملية ... . array of Byte تكون على هاذا الشكل ... كل شىء مشروح فيها PHP كود : //----------- Load the library and get the Handle -----------------//ان كانت هناك تصحيحات او تحسينات او طرق اخرى ... تفضلوا . حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - cargem - 26-06-2011 ممكن توضيح ماذا نحط في الباراميتر؟ |