delphi4arab منتديات دلفي للعرب
حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - نسخة قابلة للطباعة

+- 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)

الصفحات: 1 2 3 4


حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - hanipino - 25-06-2011

السلام عليكم

كما جاء فى المثال هنا
جعلنا الملف التنفيذى يحمل مكتبة من مكتبات النضام و حصلنا على عنوان دالة من دوال هذه المكتبة و نفذنا تلك الدالة عادى .
المشكل الذى واجهنى و هو عند القيام بنفس العملية على مكتبة من صنعنا اتحصل على عنوان خاطىء للدالة
... من يحوال معى لايجاد الحل Smile .

و السلام عليكم


حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - 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 =
                       (
                        $
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
                        
$B8, 0, 0, 0, 0,    {MOV EAX MessageBoxA}
                        
$FF, $D0,           {CALL EAX}
                        $
68, 0, 0, 0, 0,    {PUSH XXXX} // JMP TO real Starting point
                        
$C3                 {RETN}
                       ); 

الا ادا كان لها نفس بارامترات دالة 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 =
                       (
                        $
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
                        
$B8, 0, 0, 0, 0,    {MOV EAX MessageBoxA}
                        
$FF, $D0,           {CALL EAX}
                        $
68, 0, 0, 0, 0,    {PUSH XXXX} // JMP TO real Starting point
                        
$C3                 {RETN}
                       ); 
البايتات (لون أحمر) , ترتيب 16 و عددها 4 :
PHP كود :
CopyMemory(@MyMSGByte[16], @pMsgBoxA, 4); 
لكتابة الجزء الناقص في الإستدعاء
كود :
B8 [COLOR=Red]EA 07 3D 7E [COLOR=Black]//[/COLOR] [/COLOR]MOV EAX,user32.MessageBoxA
- يمكن الإستغناء عن LoadLibrary/GetProcAddress
PHP كود :
function GetImportFunAddr(lpImportAddr: Pointer): Pointer;
begin
  Result 
:= PPointer(PPointer(Cardinal(lpImportAddr) + 2)^)^;
end; 
- عند محاولة حقن دالة/إجراء من Dll فقط يجب توفير القالب المناسب ؟ مثل MyMSGByte


حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - 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} );
لاحظ عند جلب عنوان الـ 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 واظحة (عدد و نوع البراماتر) .


حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - hanipino - 25-06-2011

نعم بارك الله فيك tf6m


حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - me_delphi - 25-06-2011

إقتباس :...
B8 EA 07 3D 7E // MOV EAX,user32.MessageBoxA

بارك الله فيك أخي هدا ما كنت سأرد به ...وهو ما لدي من معلومات...

أخي hanipino ان واجهت مشكلا آخر اطرح محاولتك... لنحاول نحن بدورنا أيضا

وهنا اخوة أكثر خبرة منا كالأستاد عبد العزيز سيفيدوننا ان شاء الله

بالتوفيق.


حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - hanipino - 26-06-2011

نعم اخى me&delphi ... المنتدى منتدانا و كل مشاكلى مطروحة فيه Smile بارك الله فى اعضاء المنتدى

--------------------

فيما يخص حقن مكتبة من انجازنا توصلت للحل ... كما قال اخى tf6m (بعد التنقيح) و فهم العملية ... .

array of Byte تكون على هاذا الشكل ... كل شىء مشروح فيها

PHP كود :
//----------- Load the library and get the Handle -----------------//

                        
$68, 0, 0, 0, 0,    {PUSH XXXX}      // Password.dll
                        
$B8, 0, 0, 0, 0,    {MOV EAX XXXX}   // @LoadLibrary
                        
$FF, $D0,           {CALL EAX}       // Call LoadLibrary

                           
{
                              
Result of this function (LoadLibrary) is placed in the EAX
                                        EAX 
= Handle of loaded library
                                                                                         
}

                       
//---------------- Get Address of Function From DLL ----------------//

                        
$68, 0, 0, 0, 0,    {PUSH XXXX}      // Name of Function to call
                        
$50,                {PUSH EAX}       // Handle Of loaded library
                        
$B8, 0, 0, 0, 0,    {MOV EAX XXXX}   // @GetProcAddress
                        
$FF, $D0,           {CALL EAX}       // Call GetProcAddress


                           
{
                              
Result of this function (GetProcAddress) is placed in the EAX
                                     EAX 
= Address Of Function to call
                                                                                          
}

                       
//---------------------  Exeute  Function  -------------------------//

                        
$68, 0, 0, 0, 0,    {PUSH XXXX}      // First Parametre =  Pchar
                        
$50,                {PUSH EAX}       // Address Of Function to call
                        
$FF, $D0,           {CALL EAX}       // Call This Function


                        
$68, 0, 0, 0, 0,    {PUSH XXXX}      // JMP TO real Starting point
                        
$C3                 {RETN}
                        
//------------------------------------------------------------------// 

[صورة: attachment.php?attachmentid=2789&stc=1&d=1309041921]

ان كانت هناك تصحيحات او تحسينات او طرق اخرى ... تفضلوا .


حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا - cargem - 26-06-2011

ممكن توضيح
ماذا نحط في الباراميتر؟