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 - 26-06-2011

البرمتر من نوع Pchar ... عند استدعاء دالة المكتبة (dll) تقوم هذه الدالة بنتفيذ الدالة IputBox و تضع هذا البرمتر فى احد برمترات الدالة IputBox ... لاكن ضهر على شكل علامات اسفهام

إقتباس :ماذا نحط في الباراميتر؟

ضع اى شىء ... ليكتب فى البرمتر الاول ل الدالة IputBox
...
الان يصدر على شكل علامات اسفهام ... ساحاول ايجاد الحل لضهوره بالشكل الصحيح .

المهم فى المثال حقن المكتبة و استدعاء دالتها بنجاح ... ثم نهتم ب برمتراتها و كيفية التعامل مع نوع هذه البرمترات.


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

دائما علامات استفهام

استعملة Pchar , ShortString
ShareMem Unit

دائما نفس المشكل ???? .


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

بعد ليلة حرب ضارية مع Pchar تبن ان هاكذا نوع من المتغيرات لايمكن تخزين عنوانه فى EAX بل يجب ان يكون فى EDX

و عليه تصبح MyLibraryInjectedByte على هذا النحو

PHP كود :
MyLibraryInjectedByte: array[1..39] of Byte =
                       (

                       
//----------- 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
                                                                                          
}

                       
//---------------------  Execute  Function  -------------------------//

                        
$BA, 0, 0, 0, 0,    {MOV EDX XXXX}   // Address Of Parametre  =  Pchar
                        
$52,                {PUSH EDX}       // Put Pchar value in the stack
                        
$FF, $D0,           {CALL EAX}       // Call Function

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

                       
);

[
align=center] 
دالة المكتبة يمكن ان تكون على هذا الشكل
إقتباس :procedure Input_Boox(S: pAnsiChar); stdcall;
begin
InputBox(string(S), PChar(''), PChar('') );
end;
[/align]

الان تم الاستفادة من المكتبة المحقونة 100% اخى cargem Smile


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

أخي Hanipino

تم تعديل المرفق الدي تفضلت بطرحه...وتشكر على هدا السورس

ولي سؤال...عند التنقيح هل قمت بتنقيح ملف تنفيدي يستدعي المكتبة التي برمجتها...لأني لاحظت اخنلافا في تحميل مكتبات النظام و المكتبات التي نبرمجها...لأني قمت في اول محاولة بالتعديل على المرفق الأصلي لدالة shellExecute وباءت المحاولة بالفشل !

رغم أني أرى الكود صحيح في وجهة نظري

تحياتي لك


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

إقتباس :تبن ان هاكذا نوع من المتغيرات لايمكن تخزين عنوانه فى EAX بل يجب ان يكون فى EDX

يمكن دلك أخي Hanipino ...هناك خدعة بسيطة أنظر للمرفق


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

إقتباس :ولي سؤال...عند التنقيح هل قمت بتنقيح ملف تنفيدي يستدعي المكتبة التي برمجتها...لأني لاحظت اخنلافا في تحميل مكتبات النظام و المكتبات التي نبرمجها...لأني قمت في اول محاولة بالتعديل على المرفق الأصلي لدالة shellExecute وباءت المحاولة بالفشل !

نعم Smile و هذا الذى كنت اتكلم عليه منذ البداية ... الله اعلم بالنسبة لمكتبات النضام فعاوين دوالها ثابت
كما اشار tf6m عكس المكتبات التى نبرمجها نحن .


إقتباس :هناك خدعة بسيطة أنظر للمرفق

نعم Smile خدعة رائعة ... وضعت عنوان الدالة اولا فى stack ثم وضعت البرمتر ...
انت الذى عكست العملية ام انا الذى عكسها Smile (من المفروض من الصحيح Smile )

المهم اخى me&delphi بارك الله فيك و بالتوفيق .


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

إقتباس :من الصحيح

هنا يجب فهم آلية عمل المكدس... يتم دفع البارامترات بشكل مقلوب .

أنظر لمثال MessageBoxA

إقتباس :ولي سؤال...عند التنقيح هل قمت بتنقيح ملف تنفيدي يستدعي المكتبة التي برمجتها.

لم تجب عن سؤالي أخي Hanipino


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

إقتباس :لم تجب عن سؤالي أخي

نعم تتبعته بكلا المكتبتين مكتبات النضام و مكتبتنا

يوجد مثالين (MessageBox و ShellExecute) مكتبات النضام
و بالنسبة لمكتبة من برمجتنا ايضا

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


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

إقتباس :صنعت برنامج عادى يستعدى مكتبتنا و تتبعته كيف تعامل معها و حاولت تقليده ... ثم حقن كيف تعامل معها.

بارك الله فيك أخي Hanipino

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

لأن جل مانفعله في العمل قواعد البيانات ...

بالتوفيق أخي


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

تعديل آخر أخي HaniPino

PHP كود :
//---------------------  Exeute  Function  -------------------------//


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

لسنا بحاجة لدفع عنوان دالتنا الى المكدس لأنه يتواجد في المسجل EAX لدا يكفي دفع البارامتر ثم تنفيد CALL EAX