حقن ملف تنفيذى و جعله يحمل مكتبة من صنعنا
#1
السلام عليكم

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

و السلام عليكم
[-] كل من 1 user says قال شكرا ل hanipino على المشاركة المفيدة
  • ياسين بن داود
الرد
#2
السلام عليكم

رأيت المثال وهو جميل أخي 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
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#3
نعم انا معك اخى me&delphi
لا يوجد مشكل مع MessageBox ... كل الملفات التنفيذية تحمل المكتبة USER32

لاكن بالنسبة ShellExecute من Shell32.dll ليس كل الملفات التنفيذية تحتاج لهذه المكتبة
لذالك جعلنا الملف المحقون يحمل هذه المكتبة ... و المهم اننا تحصلنا على عنوان الدالة بسهولة
و كانه عنوان ثابت ... .


كود :
يجب أن تقوم بتحميل المكتبة التي أنشأتها

نعم حملتها لاكن المشكل ان عنوان الدالة يتغير عند كل تحميل عكس مكتبات النضام ... مثل Shell32

------------------------------
المهم سؤالى او المشكل الذى واجهته او الملاحضة التى استنتجتها هى ...

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

عكس مكتبة من صنعنا عند كل تحميل لها تتغير عناوين دوالها
الرد
#4
السلام عليكم
- يتم حساب عنوان الدالة المستهدفة , من ثم كتابتها إنطلاقا من الـبايت 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
I'M Fly Like A G6

الرد
#5
و عليكم السلام

ماذا تقصد ...
إقتباس :لكتابة الجزء الناقص في الإستدعاء

هل هاذا يعنى انا عنوان الدالة دائما ثابت و لا يتغير ... لذالك يمكن تخزينه مباشرتا فى المصفوفة .
اذا العناوين ثابت لماذا ...???

إقتباس :- يمكن الإستغناء عن LoadLibrary/GetProcAddress

كيف يمكن استثمار هذه الدالة ... على ما يؤشر lpImportAddr ... من اين احصل عليه

إقتباس :عند محاولة حقن دالة/إجراء من Dll فقط يجب توفير القالب المناسب ؟ مثل MyMSGByte
هل تقصد مكتبة dll مثلا من صنعنا ... لذالك نستعين بالقوالب (مصفوفة) لتخزين عناوين دوالها (عناوين الدوال هنا متغيرة عند كل تحميل ??? لا تحتاج لتخزين)
الرد
#6
- 'هل هاذا يعنى انا عنوان الدالة دائما ثابت و لا يتغير ... لذالك يمكن تخزينه مباشرتا فى المصفوفة .
اذا العناوين ثابت لماذا ...???'

كود :
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 واظحة (عدد و نوع البراماتر) .
I'M Fly Like A G6

الرد
#7
نعم بارك الله فيك tf6m
الرد
#8
إقتباس :...
B8 EA 07 3D 7E // MOV EAX,user32.MessageBoxA

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

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

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

بالتوفيق.
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#9
نعم اخى 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]

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


الملفات المرفقة
.jpg   D4A.jpg (الحجم : 64.05 ك ب / التحميلات : 121)
.rar   InjectMyDLL.rar (الحجم : 2.91 ك ب / التحميلات : 41)
.rar   DLL.rar (الحجم : 574 بايت / التحميلات : 36)
الرد
#10
ممكن توضيح
ماذا نحط في الباراميتر؟
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم