delphi4arab منتديات دلفي للعرب

نسخة كاملة : حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2 3 4
البرمتر من نوع Pchar ... عند استدعاء دالة المكتبة (dll) تقوم هذه الدالة بنتفيذ الدالة IputBox و تضع هذا البرمتر فى احد برمترات الدالة IputBox ... لاكن ضهر على شكل علامات اسفهام

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

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

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

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

دائما نفس المشكل ???? .
بعد ليلة حرب ضارية مع 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
أخي Hanipino

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

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

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

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

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

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


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

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

المهم اخى me&delphi بارك الله فيك و بالتوفيق .
إقتباس :من الصحيح

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

أنظر لمثال MessageBoxA

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

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

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

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

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

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

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

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

بالتوفيق أخي
تعديل آخر أخي 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
الصفحات : 1 2 3 4